0

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

“BottomLeft”属于“Point”类型,具有以下值:X:-20037508.342789 Y:-20037508.342789

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

MyMapControl.Viewport.ScreenToWorld(map.Envelope.BottomLeft) 只是给了我一个 Y 坐标被否定的点(所以它现在是积极的)。

任何帮助将不胜感激。

4

2 回答 2

0

好的,我想通了。我试图抓住 MapsUI 的 MapView.Map 的“信封”

我真正需要的是 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 };
    }
于 2019-08-09T21:17:46.483 回答
0

这取决于您的地图使用的投影。Mapsui 的示例经常使用openstreetmap 背景图。该地图位于名为SphericalMercator的投影中。在这种情况下,您可以将 Mapsui 类 SphericalMercator 与 ToLonLat 和 FromLonLat 方法一起使用。

是一些示例代码。

这里有更多关于 Mapsui 投影的文档。

于 2019-08-08T20:07:58.190 回答