Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 在WPF上的Bing地图中加载自定义分幅_.net_Wpf_Bing Maps - Fatal编程技术网

.net 在WPF上的Bing地图中加载自定义分幅

.net 在WPF上的Bing地图中加载自定义分幅,.net,wpf,bing-maps,.net,Wpf,Bing Maps,我正在尝试为Bing地图使用自定义瓷砖集。我试图做的与类似,但我试图理解URI是如何格式化的,这样我就可以在应用程序中托管分幅。我之所以尝试在本地托管它,是因为我希望尽可能限制应用程序中的网络流量 是否有关于本地托管地图分幅的教程,或者关于如何使URI指向本地存储路径的更深入的教程 提前感谢您的建议。Bing地图(或谷歌地图或OpenStreetMap)平铺地图方案的中心点是每个地图平铺由三个参数标识。这些是缩放级别(通常范围从0或1到大约20)以及缩放级别内平铺的x和y索引。在给定的缩放级别z

我正在尝试为Bing地图使用自定义瓷砖集。我试图做的与类似,但我试图理解URI是如何格式化的,这样我就可以在应用程序中托管分幅。我之所以尝试在本地托管它,是因为我希望尽可能限制应用程序中的网络流量

是否有关于本地托管地图分幅的教程,或者关于如何使URI指向本地存储路径的更深入的教程


提前感谢您的建议。

Bing地图(或谷歌地图或OpenStreetMap)平铺地图方案的中心点是每个地图平铺由三个参数标识。这些是缩放级别(通常范围从0或1到大约20)以及缩放级别内平铺的x和y索引。在给定的缩放级别z中,x和y索引范围为0到2^z-1。在缩放级别0中有一个平铺,在级别1中有2x2平铺,在级别2中有4x4平铺,依此类推

像OpenStreetMap或Google Maps这样的大多数地图分幅提供商在其分幅URI中直接反映这三个参数。例如,OpenStreetMap通过URI提供地图分幅

在派生类中,重写GetUri方法为三个tile参数提供URI。对于类似OpenStreetMap的瓷砖,此类衍生瓷砖资源可能如下所示:

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 Control 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>
重写的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如何处理的信息。

这是我收到的关于地图控件的最清晰、最有用的答案。谢谢你,多好的回答。他帮我完成了一个我目前拥有的项目。顺便说一句,使用这种技术和JTileDownloader可以创建非常好的脱机地图。非常感谢。有没有办法将源更改为从mbtiles数据库获取?@Naledustet我从来没有使用过mbtiles,但我想您可以从TileSource类派生并重写该方法来创建一个URI,该URI从适当的源获取贴图tiles。我正在尝试创建一个tile源。具体地说,如果我有一张地图的矢量图像,我将如何将这张图像转换为Bing地图可以使用的平铺源?
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);
}