Мои точки нарисованы на 0 широте, 0 долготе

Это мой слушатель кликов на карте:

@Override
    public boolean onSingleTap(MotionEvent point) {
        Point mapPoint=view.toMapPoint(point.getX(), point.getY());
        SpatialReference sp = SpatialReference.create(SpatialReference.WKID_WGS84);
        Point p1Done=(Point) GeometryEngine.project(mapPoint, view.getSpatialReference(), sp);
        UtilsMapa.addPoint(p1Done, view, "Marker",view.getGraphicLayer());
        return super.onSingleTap(point);
    }

Метод addPoint:

public static void addPoint(Point point, MapViewExt mView, String textMarker, GraphicsLayer gLayer){
    SimpleMarkerSymbol simpleMarker = new SimpleMarkerSymbol(Color.RED, 10, SimpleMarkerSymbol.STYLE.CIRCLE);
    TextSymbol bassRockTextSymbol = new TextSymbol(10, textMarker, BLUE, TextSymbol.HorizontalAlignment.LEFT,
            TextSymbol.VerticalAlignment.BOTTOM);
    //When reaching this line, point has 0=-3.0246720297389555 1=40.83564363734672, which is where I tapped the screen
    Graphic graphic=new Graphic(point,simpleMarker);
    gLayer.addGraphic(graphic);
}

Графическое изображение добавлено (красное пятно), но оно нарисовано с координатами 0,0... Почему это так? Как я могу получить точку в правильном месте?

Спасибо.

1 ответ

Решение

Ответ

Не спроецируйте эту точку в WGS 1984. Используйте точку, которая MapView.toMapPoint(double, double) возвращается к вам.

Детальное объяснение

В ArcGIS Runtime 10.2.x для Android Point объект не отслеживает свою пространственную привязку. На самом деле это просто значение x и значение y. Если вы даете Point к MapView, MapView будет предполагать, что Point находится в той же пространственной привязке, что и карта, которая по умолчанию обычно используется в Web Mercator.

Вот что делает ваш код:

Point mapPoint=view.toMapPoint(point.getX(), point.getY());

mapPoint сейчас точка в MapView Пространственная привязка, которая, вероятно, является Web Mercator. Точка, вероятно, составляет несколько миллионов метров от (0, 0), но так как Point класс, к счастью, не знает о пространственных привязках, он просто содержит значение x в миллионах и значение y в миллионах, без единиц измерения.

SpatialReference sp = SpatialReference.create(SpatialReference.WKID_WGS84);
Point p1Done=(Point) GeometryEngine.project(mapPoint, view.getSpatialReference(), sp);

p1Done теперь точка в WGS 1984, которая является некоторым числом градусов от (0, 0). У вас есть комментарий, в котором говорится, что значение x равно -3.0246720297389555, а значение y равно 40.83564363734672, или, может быть, наоборот, но важно отметить, что значение x находится в диапазоне от -180 до 180, а значение y равно от -90 до 90, без единиц измерения.

UtilsMapa.addPoint(p1Done, view, "Marker",view.getGraphicLayer());

Ваш вспомогательный метод вызывается с p1Done, который называется point в вашем вспомогательном методе.

Graphic graphic=new Graphic(point,simpleMarker);

Рисунок создается с точкой, значение x которой равно -3.0246720297389555, а значение y равно 40.83564363734672.

gLayer.addGraphic(graphic);

Графический объект добавляется в графический слой, который имеет пространственную привязку карты, на которой он находится, - это, вероятно, Web Mercator. На карте правильно отображаются точки -3.024672029738955 метров к западу от (0, 0) и 40,83564363734672 метра к северу от (0, 0).

Примечание: обновление до ArcGIS Runtime 100.x

Если бы вы использовали Runtime 100.x, вы могли бы избежать этой проблемы, поскольку геометрии Runtime 100.x, включая Point, следите за их пространственной привязкой.

Другие вопросы по тегам