如何将 map.Envelope.BottomLeft 的输出转换为 LatLon?

How do I translate the output of map.Envelope.BottomLeft to a LatLon?

我正在使用 MapsUI 和 Xamarin.Forms 创建一个应用程序。

"BottomLeft" 属于 "Point" 类型并且具有以下值: X:-20037508.342789 Y:-20037508.342789

我什至不确定这些值是什么。我读过它们可能是像素,但这对我来说意义不大。 TopRight 是取反的相同值。我似乎无法从这些信息中得到任何有用的信息。

MyMapControl.Viewport.ScreenToWorld(map.Envelope.BottomLeft) 只是给我一个 Y 坐标为负的点(所以现在它是正的)。

如有任何帮助,我们将不胜感激。

这取决于projection your map is using. Mapsui's samples often use the openstreetmap background map. This map is in a projection called SphericalMercator。在这种情况下,您可以将 Mapsui class SphericalMercator 与 ToLonLat 和 FromLonLat 方法一起使用。

Here 是一些示例代码。

Here 关于 Mapsui 中投影的更多文档。

好的,我明白了。我试图抓住 MapsUI 的 MapView.Map

的 "Envelope"

我真正需要的是MapView.Viewport.Extent。

我遇到了第二个问题,我试图在加载地图之前获取此信息。这就是为什么我总是在左下角得到 X: -20037508.342789 Y: -20037508.342789。
此符号采用 EPSG:3857 格式,这些坐标等于南极。我想要传统的 "lat/lng" 即 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 };
    }