2017-11-27 6 views
0

こんにちは、 私はJava Desktopで学術プロジェクトにシステムを構築しています。このプロジェクトでは、住所(「5th avenue、NY」など)を受け取り、この住所を地理座標(緯度と経度)に変換してデータベースに格納する必要があります。これらの座標はマップ上に表示されます。Java SwingでのGeocoderの問題

私はJxMaps APIを使用していますが、使用できるGeocoderコードの例は変更できません。私が何をしても、コードはうまく機能しません。ただし、この例では動作します。

は私のコードからの抜粋(つまり、パッケージモデルである)は、以下の:

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); 
      } 
     } 
    }); 
    } 
} 

をそして、これはダオパッケージである:

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; 
    } 
} 

私はそれを動作させることはできません。私を助けてください!!

答えて

0

提供されたコードには、performGeocodeと呼ぶ部分がありません。 MapViewの初期化が完了した後に電話がかけられていることを確認してください。私はイベントでそれを呼び出すことをお勧めします。下記の例をご覧ください:

MapView mapView = new MapView(); 

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