2

Bing マップにカスタム タイルセットを使用しようとしています。私がやろうとしていることは、こちらの質問に似ていますが、アプリケーション内でタイルをホストできるように URI がどのようにフォーマットされているかを理解しようとしています。これをローカルでホストしようとしている理由は、アプリケーションからのネットワーク トラフィックをできるだけ制限したいからです。

マップ タイルをローカルでホストするためのチュートリアル、または URI がローカル ストレージ パスを指すようにする方法に関する詳細なチュートリアルはありますか?

アドバイスをよろしくお願いします。

4

1 に答える 1

23

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.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 メソッドは、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 がマップ タイル名をどのように処理するかについて、さらに読みたいと思うかもしれません。

于 2012-08-01T20:13:27.520 に答える