Как мне перевести вывод 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.

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