Bing Maps (または Google Maps または OpenStreetMap) タイル マップ スキームの中心点は、各マップ タイルが 3 つのパラメーターによって識別されることです。これらは、ズーム レベル (通常は 0 または 1 から約 20 の範囲) と、ズーム レベル内のタイルの x および y インデックスです。特定のズーム レベル z では、x および y インデックスの範囲は 0 から 2^z-1 です。ズーム レベル 0 には 1 つのタイル、レベル 1 には 2x2 のタイル、レベル 2 には 4x4 のタイルなどがあります。
OpenStreetMap や Google マップなどのほとんどのマップ タイル プロバイダーは、これら 3 つのパラメーターをタイル URI に直接反映します。たとえば、OpenStreetMap は、URI http://tile.openstreetmap.org/z/x/y.pngによってマップ タイルを提供します。
派生TileSourceクラスでは、GetUri メソッドをオーバーライドして、3 つのタイル パラメーターの 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 Maps 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.WPF
しlocal
、派生した 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 メソッドは、UriFormat
プロパティを使用せずに、適切なローカル ファイル URI を直接作成する場合もあります。
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 がマップ タイル名をどのように処理するかについて、さらに読みたいと思うかもしれません。