2016-11-01 5 views
1

Gluon Mobile 4とGluon Maps 1.0.1を使用して、フットステップを示すレイヤーを持つマップを表示しています。ユーザーがマウスボタンをダブルクリックすると、新しい足踏みステップが表示されます。これは素晴らしいですが、私は現在、(ユーザーがクリックした)ポインタ座標からMapPoint(レイヤーに必要)に変換するための回避策が必要です。ここでGluon Maps 1.0.1を使用してマウスポインタ座標をMapPointに変換するにはどうすればよいですか?

enter image description here

マウスクリックが得られる方法です。

public MainView(String name) { 
    super(name); 
    MapView mapView = new MapView(); 
    mapView.setZoom(18f); 
    mapView.setCenter(NUREMBERG); 
    layer = new FootStepsLayer(); 
    mapView.addLayer(layer); 
    setCenter(mapView); 

    layer.addPoint(NUREMBERG); 

    setOnMouseClicked(event -> { 
     if ((event.getButton() == MouseButton.PRIMARY) 
       && (event.getClickCount() == 2)) { 
      double x = event.getX(); 
      double y = event.getY(); 
      layer.addPoint(x, y); 
     } 
    }); 
} 

現在、私の層の実装は次のようになります。

public class FootStepsLayer extends MapLayer { 

    private static final Image FOOTSTEPS 
      = new Image(FootStepsLayer.class.getResourceAsStream("/footsteps.png"), 
        32, 32, true, true); 

    private final ObservableList<Pair<MapPoint, Node>> points 
      = FXCollections.observableArrayList(); 

    public void addPoint(MapPoint mapPoint) { 
     Node node = new ImageView(FOOTSTEPS); 
     Pair<MapPoint, Node> pair = new Pair<>(mapPoint, node); 
     points.add(pair); 
     getChildren().add(node); 
     markDirty(); 
    } 

    public void addPoint(double x, double y) { 
     Bounds bounds = baseMap.getParent().getLayoutBounds(); 
     baseMap.moveX(x - bounds.getWidth()/2); 
     baseMap.moveY(y - bounds.getHeight()/2); 
     addPoint(new MapPoint(baseMap.centerLat().get(), 
       baseMap.centerLon().get())); 
    } 

    @Override 
    protected void layoutLayer() { 
     // Warning: suggested conversion to functional style crashed app on BlueStacks 
     for (Pair<MapPoint, Node> element : points) { 
      MapPoint mapPoint = element.getKey(); 
      Node node = element.getValue(); 
      Point2D point = baseMap.getMapPoint(mapPoint.getLatitude(), mapPoint.getLongitude()); 
      node.setVisible(true); 
      node.setTranslateX(point.getX()); 
      node.setTranslateY(point.getY()); 
     } 
    } 
} 

私の回避策はpublic void addPoint(double x, double y)である:私はmoveX()を呼び出していますmoveY()、それ以降はcenterLat()とをクエリできます。マップが移動し、新しい足のステップがマップの中心になるため、これは理想的ではありません。私が望むのは、地図の位置が変わらないことです。

もし私がそれを見落とさなければ、マウス座標を地理的位置に変換するためのAPIがないようです。質問create a polyline in gluon mapLayerで答えられるように、BaseMapクラスには2つの方法がありますが、他の方法は見つけられません。しかし、それを行う方法がなければならない。 ;-)

答えて

1

BaseMapをご覧になる場合は、探しているものを正確に行う方法が既に1つありますが、マップの中心のものはcalculateCenterCoordsです。 MapView

public MapPoint getMapPosition(double sceneX, double sceneY) { 
    double x = sceneX - this.getTranslateX(); 
    double y = sceneY - this.getTranslateY(); 
    double z = zoom.get(); 
    double latrad = Math.PI - (2 * Math.PI * y)/(Math.pow(2, z) * 256); 
    double mlat = Math.toDegrees(Math.atan(Math.sinh(latrad))); 
    double mlon = x/(256 * Math.pow(2, z)) * 360 - 180; 
    return new MapPoint(mlat, mlon); 
} 

はその後あなたがこの方法を公開することができます:それに基づいて

は、あなたがsceneXsceneY座標が代わりに考慮されているBaseMap、に独自のメソッドを追加することができます

public MapPoint getMapPosition(double sceneX, double sceneY) { 
    return baseMap.getMapPosition(sceneX, sceneY); 
} 

地図上で使用できます:

mapView.setOnMouseClicked(e -> { 
     MapPoint mapPosition = mapView.getMapPosition(e.getSceneX(), e.getSceneY()); 
     System.out.println("mapPosition: " + mapPosition.getLatitude()+ ", " + mapPosition.getLongitude()); 
    }); 

この方法はマップの一部である必要がありますので、機能リクエストやプルリクエストを作成してください。

+0

素晴らしいです、ありがとうございます。プルリクエストを作成しようとしています。数日かかるかもしれません。 – Thomas

関連する問題