Используя Gluon Mobile 4 и Gluon Maps 1.0.1, я показываю карту со слоем, показывающим шаги. Когда пользователи дважды щелкают кнопкой мыши, отображается новый шаг. Это прекрасно работает, но в настоящее время мне нужен обходной путь для преобразования координат указателя (где пользователь щелкнул) в MapPoint
s (необходимо для слоя).
Вот как получается щелчок мыши:
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()
и centerLong()
. Это не идеально, потому что карта перемещается, и новый шаг становится центром карты. Я хочу, чтобы позиция карты оставалась неизменной.
Если я не проглядел, вроде бы нет никакого API для преобразования координат мыши в геопозиции. Как ответили на вопрос создайте полилинию в gluon mapLayer, класс BaseMap
имеет два метода getMapPoint
, но я не нашел другого наоборот. Но должен быть способ сделать это. ;-)