Bing Map Controlで、Google Mapの地図データを使用するには

Windows Phone 7でGoogle Map on Bing Map Controlを実現する
http://d.hatena.ne.jp/ch3cooh393/20101129/1291036733
との記事を発見したので、PC上のSilverlgihtでも試してみた。
うーん、これは良い。

XAML
xmlns:mapCtrl=
    “clr-namespace:Microsoft.Maps.MapControl;assembly=Microsoft.Maps.MapControl”
xmlns:gMapEx=“clr-namespace:BingMap”

<mapCtrl:Map x:Name=”GoogleMaps” CredentialsProvider=“Bing Map Key”>
    <mapCtrl:Map.Children>
        <mapCtrl:MapTileLayer>
            <mapCtrl:MapTileLayer.TileSources>
                <gMapEx:GoogleTileSource TileSourceType=“Satellite” />
            </mapCtrl:MapTileLayer.TileSources>
        </mapCtrl:MapTileLayer>
        <mapCtrl:MapTileLayer>
            <mapCtrl:MapTileLayer.TileSources>
                <gMapEx:GoogleTileSource TileSourceType=“Street” />
           </mapCtrl:MapTileLayer.TileSources>
        </mapCtrl:MapTileLayer>
    </mapCtrl:Map.Children>
</mapCtrl:Map>

C# Code

using System;
using System.Windows;

using Microsoft.Maps.MapControl;

namespace BingMap
{
    public enum GoogleTileSourceType
    {
        Street,
        Hybrid,
        Satellite,
        Physical,
        PhysicalHybrid,
        StreetOverlay,
        WaterOverlay
    }

    public class GoogleTileSource : TileSource
    {
        public GoogleTileSource()
        {
            UriFormat = @"http://mt{0}.google.com/vt/lyrs={1}&z={2}&x={3}&y={4}";
            TileSourceType = GoogleTileSourceType.Street;
        }
        private int _servernr;
        private char _mapMode;

        private int Server
        {
            get
            {
                return _servernr = (_servernr + 1) % 4;
            }
        }

        private GoogleTileSourceType _tileSourceType;
        public GoogleTileSourceType TileSourceType
        {
            get { return _tileSourceType; }
            set
            {
                _tileSourceType = value;
                _mapMode = TypeToMapMode(value);
            }
        }

        public override Uri GetUri(int x, int y, int zoomLevel)
        {
            if (zoomLevel > 0)
            {
                var url = string.Format(UriFormat, Server, _mapMode, zoomLevel, x, y);
                //System.Diagnostics.Debug.WriteLine(url);
                return new Uri(url);
            }
            return null;
        }

        private static char TypeToMapMode(GoogleTileSourceType tileSourceType)
        {
            switch (tileSourceType)
            {
                case GoogleTileSourceType.Hybrid:
                    return 'y';
                case GoogleTileSourceType.Satellite:
                    return 's';
                case GoogleTileSourceType.Street:
                    return 'm';
                case GoogleTileSourceType.Physical:
                    return 't';
                case GoogleTileSourceType.PhysicalHybrid:
                    return 'p';
                case GoogleTileSourceType.StreetOverlay:
                    return 'h';
                case GoogleTileSourceType.WaterOverlay:
                    return 'r';
            } return ' ';
        }
    }
}

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中