如何将 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 };
}
我正在使用 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 };
}