Мои точки нарисованы на 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
, следите за их пространственной привязкой.