0

我可以在 Windows Phone 中缓存谷歌地图吗?我使用GoogleTileSource

<my:MapTileLayer Name="street" Margin="0,0,0,32" Height="800" Width="433">
     <my:MapTileLayer.TileSources>
           <GoogleTileSource:GoogleTile TileTypes="Street"/>
     </my:MapTileLayer.TileSources>
</my:MapTileLayer>

这是可能的?

预先感谢。

更新

XAML代码:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <my:Map Height="756" HorizontalAlignment="Left" Margin="12,6,0,0" Name="googlemap"
                   CredentialsProvider="AqayajnZU8FSfDGL8jpK5zMKAHmUL27Uqxv_OnpQzJQOI2PoQyxcG7dlR6_g4WWo" 
                   CopyrightVisibility="Collapsed" LogoVisibility="Collapsed" 
                   ScaleVisibility="Visible"  VerticalAlignment="Top" Width="438" >
                <my:Map.Mode>
                    <MSPCMCore:MercatorMode/>
                </my:Map.Mode>
                <my:MapTileLayer Name="street" Margin="0,0,0,32" Height="800" Width="433">
                    <my:MapTileLayer.TileSources>
                        <GoogleTileSource:GoogleTile TileTypes="Street"/>
                    </my:MapTileLayer.TileSources>
                </my:MapTileLayer>
                <my:MapLayer x:Name="PopupLayer">
                    <Canvas x:Name="ContentPopup" Visibility="Collapsed">
                        <Rectangle x:Name="ContentPopupRectangle" Fill="Black" 
                                   Opacity="0.6" Canvas.Left="0" Canvas.Top="0" 
                                   Height="100" Width="200"/>
                        <StackPanel Canvas.Left="20" Canvas.Top="10">
                            <TextBlock x:Name="ContentPopupNickname" FontSize="24" FontWeight="Bold" TextWrapping="Wrap" Width="200"/>
                            <TextBlock x:Name="ContentPopupLocation" FontSize="16" FontWeight="Bold" TextWrapping="Wrap" Width="200"/>
                            <TextBlock x:Name="ContentPopupAge" FontSize="16" FontWeight="Bold" TextWrapping="Wrap" Width="200"/>                              
                        </StackPanel>
                    </Canvas>
                </my:MapLayer>
            </my:Map>
        </Grid>

所以,cs代码:

    public enum GoogleTileTypes
    {
        Hybrid,
        Physical,
        Street,
        Satellite,
        WaterOverlay
    }

    public class GoogleTile : Microsoft.Phone.Controls.Maps.TileSource
    {
        private int _server;
        private char _mapmode;
        private GoogleTileTypes _tiletypes;

        public GoogleTileTypes TileTypes
        {
            get { return _tiletypes; }
            set
            {
                _tiletypes = value;
                MapMode = MapModeConverter(value);
            }
        }

        public char MapMode
        {
            get { return _mapmode; }
            set { _mapmode = value; }
        }

        public int Server
        {
            get { return _server; }
            set { _server = value; }
        }

        public GoogleTile()
        {
            UriFormat = @"http://mt{0}.google.com/vt/lyrs={1}&z={2}&x={3}&y={4}";
            Server = 0;
        }

        public override Uri GetUri(int x, int y, int zoomLevel)
        {
            if (zoomLevel > 0)
            {
                var Url = string.Format(UriFormat, Server, MapMode, zoomLevel, x, y);
                return new Uri(Url);
            }
            return null;
        }

        private char MapModeConverter(GoogleTileTypes tiletype)
        {
            switch (tiletype)
            {
                case GoogleTileTypes.Hybrid:
                    {
                        return 'y';
                    }
                case GoogleTileTypes.Physical:
                    {
                        return 't';
                    }
                case GoogleTileTypes.Satellite:
                    {
                        return 's';
                    }
                case GoogleTileTypes.Street:
                    {
                        return 'm';
                    }
                case GoogleTileTypes.WaterOverlay:
                    {
                        return 'r';
                    }
            }
            return ' ';
        }
    }
4

1 回答 1

0

标准 TileSource 不允许您对平铺图像的下载进行任何控制。

如果要添加自己的缓存,则必须在地图中添加另一个图层,然后下载图像并将它们自己加载到正确位置的额外图层中。这不好玩,但可以做到。

于 2013-01-23T22:41:56.007 回答