我正在开发 Windows Phone 8.1 应用程序,我希望在MapControl中显示Yandex Maps
而不是Bing Maps
。我用yandex url设置了一个新的tile数据源。它工作正常,但瓷砖显示的垂直偏移很小。
偏移只是一个问题,但它影响地标 - 它们在yandex瓷砖上显示在错误的位置,但在bing瓷砖中是正确的。
问题不在于坐标,因为我是从浏览器中的原始yandex地图中选择它们的。
在下面的示例中,彩色图块由yandex提供,灰色图形来自bing贴图。
在MapControl中设置yandex磁贴:
HttpMapTileDataSource dataSource = new HttpMapTileDataSource("http://vec02.maps.yandex.net/tiles?l=map&x={x}&y={y}&z={zoomlevel}");
MapTileSource tileSource = new MapTileSource(dataSource);
MyMapControl.TileSources.Add(tileSource);
我试图拦截MapControl的tile请求并减少y
坐标的值,但结果完全错误。
截取请求的结果并修改y
答案 0 :(得分:2)
public static Point WGS84ToBing(Point coordinate)
{
double d = coordinate.X * Math.PI / 180, m = coordinate.Y * Math.PI / 180, l = 6378137, k = 0.0818191908426, f = k * Math.Sin(m);
double h = Math.Tan(Math.PI / 4 + m / 2), j = Math.Pow(Math.Tan(Math.PI / 4 + Math.Asin(f) / 2), k), i = h / j;
return new Point(l * d, l * Math.Log(i));
}
public static Point BingtoWGS84Mercator(Point point)
{
double lon = (point.X / 20037508.34) * 180;
double lat = (point.Y / 20037508.34) * 180;
lat = 180 / Math.PI * (2 * Math.Atan(Math.Exp(lat * Math.PI / 180)) - Math.PI / 2);
return new Point(lon, lat);
}
使用示例:
HttpMapTileDataSource dataSource = new HttpMapTileDataSource("http://vec02.maps.yandex.net/tiles?l=map&v=2.2.3&x={x}&y={y}&z={zoomlevel}");
MapTileSource tileSource = new MapTileSource(dataSource)
{
Layer = MapTileLayer.BackgroundReplacement
};
map.Style = MapStyle.None;
map.TileSources.Add(tileSource);
Point bingPoint = WGS84ToBing(new Point(47.245252, 56.139498));
Point yandexCoordinates = BingtoWGS84Mercator(new Point(bingPoint.X, bingPoint.Y));
map.Center = new Geopoint(new BasicGeoposition() { Longitude = yandexCoordinates.X, Latitude = yandexCoordinates.Y });
答案 1 :(得分:1)
这是因为Yandex地图和Bing地图的地图投影略有不同。我不是投影方面的专家,但您可以看到MercatorProjection(针对Bing地图实施)和MercatorProjectionYandex(针对Yandex地图实施)为Great Maps for Windows Forms & Presentation实施的类别的差异。