2012-07-31 84 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