2012-07-31 51 views
2

我正在尝试为Bing地图使用自定义图块集。我试图做的是类似于the question here,但我想了解一个URI是如何格式化的,以便我可以在应用程序中承载磁贴。我试图在本地托管这个的原因是因为我想尽可能地限制应用程序的网络流量。在WPF上的Bing地图中加载自定义图块

是否有任何关于在本地托管地图切片的教程或关于如何将URI指向本地存储路径的更深入的教程?

在此先感谢您的任何建议。

回答

22

Bing地图(或Google地图或OpenStreetMap)平铺地图方案的中心点是每个地图方块都由三个参数标识。这些是缩放级别(通常范围从0或1到20)和缩放级别内的图块的x和y索引。在给定的缩放级别z中,x和y的索引范围从0到2^z-1。在缩放级别0中,有一个图块,级别1中有2x2图块,级别2中有4x4图块等等。

像OpenStreetMap或Google Maps这样的大多数地图拼贴提供程序直接将这三个参数反映在它们的拼贴URI中。例如,OpenStreetMap按URI http://tile.openstreetmap.org/z/x/y.png提供地图图块。

在导出的TileSource类中,您重写GetUri方法以为三个tile参数提供URI。对于OpenStreetMap的一致好评砖这样的衍生TileSource可能是这样的:

public class MyTileSource : Microsoft.Maps.MapControl.WPF.TileSource 
{ 
    public override Uri GetUri(int x, int y, int zoomLevel) 
    { 
     return new Uri(UriFormat. 
         Replace("{x}", x.ToString()). 
         Replace("{y}", y.ToString()). 
         Replace("{z}", zoomLevel.ToString())); 
    } 
} 

对于Bing地图WPF控件TileLayer类,你也必须派生自己TileLayer类启用使用率在XAML一些愚蠢的技术细节:

public class MyTileLayer : Microsoft.Maps.MapControl.WPF.MapTileLayer 
{ 
    public MyTileLayer() 
    { 
     TileSource = new MyTileSource(); 
    } 

    public string UriFormat 
    { 
     get { return TileSource.UriFormat; } 
     set { TileSource.UriFormat = value; } 
    } 
} 

你会然后用它在地图控件像下面在XAML命名空间m引用Microsoft.Maps.MapControl.WPFlocal引用包含衍生TileLayer的命名空间。

<m:Map> 
    <m:Map.Mode> 
     <!-- set empty map mode, i.e. remove default map layer --> 
     <m:MercatorMode/> 
    </m:Map.Mode> 
    <local:MyTileLayer UriFormat="http://tile.openstreetmap.org/{z}/{x}/{y}.png"/> 
</m:Map> 

而不是创建一个HTTP URI你可能现在还为本地文件创建一个URI的。例如,您可以在目录结构中组织地图切片,其中包含缩放级别的目录,x索引的子目录和y索引的文件名。你可以设置UriFormat财产指定一个本地路径的方式:

<local:MyTileLayer UriFormat="file:///C:/Tiles/{z}/{x}/{y}.png"/> 

重写的GetUri方法也可以直接创建一个适当的本地文件URI,不使用UriFormat属性:

public override Uri GetUri(int x, int y, int zoomLevel) 
{ 
    string rootDir = ... 
    string path = Path.Combine(rootDir, zoomLevel.ToString(), x.ToString(), y.ToString()); 
    return new Uri(path); 
} 

你可能想了解更多关于OpenStreetMap如何处理map tile names的信息。

+0

这是我收到的关于地图控件的最清晰和最有帮助的答案。谢谢 – Seb 2012-08-01 22:12:11

+0

真是个好主意。帮助了我现在拥有的一个项目。顺便提一句,使用这种技术和JTileDownloader可以让你创建真正好的离线地图。谢谢! – 2012-10-24 06:47:44

+0

有没有办法改变源从mbtiles数据库中获取? – aledustet 2014-02-03 15:53:36