我正在使用MapsUI和Xamarin.Forms创建一个应用程序。
">左下角"的类型为"点",其值为: X: -20037508.342789 Y: -20037508.342789
我真的不确定这些值到底是什么。 我读过它们可能是像素,但这对我来说没有多大意义。 右上方是相同的值被否定。 我似乎无法从这些信息中获得任何有用的东西。
MyMapControl.Viewport.ScreenToWorld(map.Envelope.BottomLeft(只是给了我一个Y坐标为负的点(所以现在它是正的(。
任何帮助将不胜感激。
这取决于地图使用的投影。Mapsui的样本经常使用openstreetmap背景地图。此地图位于名为球形墨卡托的投影中。在这种情况下,您可以将 Mapsui 类 SphericalMercator 与 ToLonLat 和 FromLonLat 方法一起使用。
下面是一些示例代码。
这里有更多关于 Mapsui 投影的文档。
好的,我想通了。 我试图抓住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 };
}