Как преобразовать координаты указателя мыши в MapPoint с помощью Gluon Maps 1.0.1?

Используя Gluon Mobile 4 и Gluon Maps 1.0.1, я показываю карту со слоем, показывающим шаги. Когда пользователи дважды щелкают кнопкой мыши, отображается новый шаг. Это прекрасно работает, но в настоящее время мне нужен обходной путь для преобразования координат указателя (где пользователь щелкнул) в MapPoints (необходимо для слоя).

введите здесь описание изображения

Вот как получается щелчок мыши:

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, но я не нашел другого наоборот. Но должен быть способ сделать это. ;-)


person Community    schedule 01.11.2016    source источник


Ответы (1)


Если вы посмотрите на BaseMap, там уже есть один метод, который делает именно то, что вы ищете, но только для центра карты: рассчитатьCenterCoords.

На его основе можно было бы добавить свой метод к BaseMap, где вместо него учитываются координаты sceneX и sceneY:

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

Затем вы можете открыть этот метод в MapView:

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

Этот метод должен быть частью Карт, поэтому не стесняйтесь создавать запрос функции или даже запрос на вытягивание.

person José Pereda    schedule 01.11.2016
comment
Потрясающе, большое спасибо. Собираюсь создать пулл-реквест. Может занять несколько дней. - person ; 01.11.2016