Как мне перевести вывод map.Envelope.BottomLeft в LatLon?
Я создаю приложение с MapsUI и Xamarin.Forms.
"BottomLeft" имеет тип "Точка" и имеет значения: X: -20037508.342789 Y: -20037508.342789
Я не совсем уверен, что это за ценности. Я читал, что они могут быть пикселями, но это не имеет большого смысла для меня. В TopRight те же значения отменены. Я не могу извлечь из этой информации ничего полезного.
MyMapControl.Viewport.ScreenToWorld (map.Envelope.BottomLeft) просто дает мне точку с отрицательной координатой Y (так что теперь она положительная).
Любая помощь будет принята с благодарностью.
2 ответа
Хорошо, я понял это. Я пытался захватить "Конверт" MapView MapMI.
Что мне действительно было нужно, так это MapView.Viewport.Extent.
У меня была вторая проблема, когда я пытался получить эту информацию до загрузки карты. Вот почему я всегда получал X: -20037508.342789 Y: -20037508.342789 для левого нижнего края.
Это обозначение в формате EPSG:3857, и эти координаты приравниваются к южному полюсу. Я хотел традиционную "широта / долгота", которая называется EPSG:4326.
Итак, сначала я подождал, пока карта загрузится, чтобы получить координаты, затем я нашел эту формулу для преобразования из EPSG:3857 в EPSG: 4326 и реализовал ее в C#:
private double[] Convert3857To4326(double X, double Y)
{
double lng = X * 180 / 20037508.34;
double lat = Y / (20037508.34 / 180);
lat = ((Math.Atan(Math.Pow(Math.E, ((Math.PI / 180) * lat))))/(Math.PI / 360)) - 90;
return new double[] { lng, lat };
}
Если вам нужно пойти другим путем, вот обратное:
private double[] Convert4326To3857(double lat, double lng)
{
double x = lng * 20037508.34 / 180;
double y = Math.Log(Math.Tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180);
y = y * 20037508.34 / 180;
return new double[] { x, y };
}
Это зависит от того, какую проекцию использует ваша карта. Образцы Mapsui часто используют фоновую карту openstreetmap. Эта карта находится в проекции под названием SphericalMercator. В этом случае вы можете использовать класс Mapsui SphericalMercator с методами ToLonLat и FromLonLat.
Вот пример кода.
Вот еще немного документации по проекциям в Mapsui.