MapControl显示带偏移量的Yandex地图图块

时间:2014-12-26 06:14:08

标签: c# maps windows-phone-8.1 yandex-maps

我正在开发 Windows Phone 8.1 应用程序,我希望在MapControl中显示Yandex Maps而不是Bing Maps。我用yandex url设置了一个新的tile数据源。它工作正常,但瓷砖显示的垂直偏移很小。

偏移只是一个问题,但它影响地标 - 它们在yandex瓷砖上显示在错误的位置,但在bing瓷砖中是正确的。

问题不在于坐标,因为我是从浏览器中的原始yandex地图中选择它们的。

在下面的示例中,彩色图块由yandex提供,灰色图形来自bing贴图。

Tile offset example

在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

的值

enter image description here

MSDN: MapControl tile overlay

2 个答案:

答案 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实施的类别的差异。