Problems with Geocoder in Java Swing

248 views Asked by At

Good afternoon, I am building a system to a academic project in Java Desktop. In this project, I need to receive an address (like "5th avenue, NY") and convert this address to geographic coordinates (latitude and longitude) to store them in the database. These coordinates will be displayed on a map.

I am using the JxMaps API, but I can not adapt the example Geocoder code made available by them. No matter what I do, the code just does not work. However, in the example, it works.

Follows a snippet from my code (that is at package model):

package model;
import com.teamdev.jxmaps.GeocoderCallback;
import com.teamdev.jxmaps.GeocoderRequest;
import com.teamdev.jxmaps.GeocoderResult;
import com.teamdev.jxmaps.GeocoderStatus;
import com.teamdev.jxmaps.InfoWindow;
import com.teamdev.jxmaps.LatLng;
import com.teamdev.jxmaps.Map;
import com.teamdev.jxmaps.Marker;
import com.teamdev.jxmaps.swing.MapView;

import dao.tableMapa;

public class Geocoder extends MapView {

private boolean performGeocode(String text) {
    public boolean s;
    // Getting the associated map object
    final Map map = getMap();
    // Creating a geocode request
    GeocoderRequest request = new GeocoderRequest();
    // Setting address to the geocode request
    request.setAddress(text);

    // Geocoding position by the entered address
    getServices().getGeocoder().geocode(request, new GeocoderCallback(map) {
        @Override
        public void onComplete(GeocoderResult[] results, GeocoderStatus status) {
            // Checking operation status
            boolean r=false;
            if ((status == GeocoderStatus.OK) && (results.length > 0)) {
                // Getting the first result
                GeocoderResult result = results[0];
                // Getting a location of the result
                LatLng location = result.getGeometry().getLocation();

                tableMapa p=new tableMapa();
                r = p.Geocodification(location, text);
            }
        }
    });
  }
}

And this is on Dao Package:

package dao;

import java.sql.Connection;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import com.teamdev.jxmaps.LatLng;
import model.ModeloMySql;
import model.pontoColeta;
import controller.fabricaConexao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class tableMapa {
    private ModeloMySql modelo = null;

    public tableMapa() {

        modelo = new ModeloMySql();
        modelo.setDatabase("projeto");
        modelo.setServer("localhost");
        modelo.setUser("root");
        modelo.setPassword("1234");
        modelo.setPort("3306");
    }

    public boolean Geocodification(LatLng location, String address){
        Boolean status = true;

        Connection con;
        con = fabricaConexao.getConnection(modelo);

        if (con == null) {
            JOptionPane.showMessageDialog(null, "Failed to connect");
        }

        //String sql = "UPDATE TABLE set(latitude="+location.getLat()+",longitude="+location.getLng()+" from pontocoleta where address="+address+";";
        String sql = "UPDATE pontoColeta set latitude = ? ,longitude = ? from pontocoleta where address = ?";

        try {
            PreparedStatement statement = con.prepareStatement(sql);

            statement.setDouble(1, location.getLat());
            statement.setDouble(2, location.getLng());
            statement.setString(3, address);
            statement.executeUpdate();

        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            fabricaConexao.closeConnection(con);
            return false;
        }

        return true;
    }

    public ArrayList<pontoColeta> pontosSelect() {
        Boolean status = true;

        Connection con;
        con = fabricaConexao.getConnection(modelo);

        // testa se conseguiu conectar
        if (con == null) {
            JOptionPane.showMessageDialog(null, "Failed to connect");
        }

        ArrayList<pontoColeta> pontos = new ArrayList<>();

        String sql = "SELECT * from pontocoleta";
        pontoColeta p;

        try {
            PreparedStatement statement = con.prepareStatement(sql);
            ResultSet result = statement.executeQuery();

            while(result.next()){
                    p = new pontoColeta();
                    LatLng c = new LatLng(result.getDouble("latitude"), result.getDouble("longitude"));
                    p.setCoordinates(c);
                    p.setIdPonto(result.getInt("idPonto"));
                    p.setDescription(result.getString("description"));
                    p.setAddress(result.getString("address"));
                    p.setPhone(result.getString("phone"));  
                    pontos.add(p);

                } 
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            status = false;
        } finally {
            // Fecha a conexao
            fabricaConexao.closeConnection(con);
        }
        return pontos;
    }
}

I can't make it work. Please help me!!

1

There are 1 answers

0
Vitaly Eremenko On

Provided code doesn't have a part where you are calling performGeocode. Please check that it called after complete initialization of the MapView. I recommend to call it on the onMapReady event. Please take a look an example provided below:

MapView mapView = new MapView(); 

mapView.setOnMapReadyHandler(new MapReadyHandler() {
   @Override
   public void onMapReady(MapStatus status) {
       ...
       performGeocode(...);
   });