Windows phone 7 用于脱机查看的地图磁贴缓存

Windows phone 7 用于脱机查看的地图磁贴缓存,windows-phone-7,map,offline,openstreetmap,Windows Phone 7,Map,Offline,Openstreetmap,我正在尝试构建一个应用程序,它将使用来自开放街道地图的开源地图(尽管这个概念应该适用于任何地图提供商)。该应用程序将使用户能够在出发前沿路线指定多个航路点 因为我没有手机的数据计划(而且在乡下漫游很少能给你带来良好的连接),我希望能够在出发前预加载航路点和/或路线的相关地图块,以便在没有数据连接的情况下继续使用地图 我最初的想法是从地图提供商处下载所需的磁贴,并将其存储在独立的存储器中。但是,Bing Maps控件实现使用了TileSource类,它依赖于返回一个绝对URI,可以从该URI下载t

我正在尝试构建一个应用程序,它将使用来自开放街道地图的开源地图(尽管这个概念应该适用于任何地图提供商)。该应用程序将使用户能够在出发前沿路线指定多个航路点

因为我没有手机的数据计划(而且在乡下漫游很少能给你带来良好的连接),我希望能够在出发前预加载航路点和/或路线的相关地图块,以便在没有数据连接的情况下继续使用地图

我最初的想法是从地图提供商处下载所需的磁贴,并将其存储在独立的存储器中。但是,Bing Maps控件实现使用了
TileSource
类,它依赖于返回一个绝对URI,可以从该URI下载tile,这显然无法处理存储在独立存储中的数据


这个问题已经被问到了:,但没有得到回答,我想知道从那以后是否有人破解了这个问题。

如果您可以在本地存储数据(将其嵌入XAP),您可以通过绝对URI引用它。克里斯·沃尔什谈到了这件事

因此,例如,一旦你有了应用程序的安装路径,你就可以像这样引用资源:

Uri toResource = new Uri("file:///Applications/Install/4FFA38B5-00AF-4760-A7EB-7C0C0BC1D31A/Install/EMBEDDED_RESOURCE", UriKind.Absolute);

我已经看到在地图上放置了一个自定义图层。然后从您喜欢的任何地方(隔离存储、联机、其他地方?)将磁贴加载到自定义层中


很抱歉,目前我没有任何代码可以与大家分享,但我正在做一些非常类似的事情。

您是否已将图像上的构建操作设置为内容?

我使用OpenStreetMaps for Android构建了一个小原型。我认为查看存储库可能会很有趣,因此,找到一个类似于我的解决方案。我以前确实下载过地图,但也许你可以使用在线解决方案。这是回购协议:以及它看起来如何的视频:


我使用了这个原型OpenLayers、OpenStreetMaps、JavaScript和Android中的WebView。我想向您提供更多详细信息,但它只是一个原型。

如果您的应用程序在WP8上运行,请使用Windows Phone 8 SDK中的内置地图控件,因为它已经支持脱机地图开箱即用。如果以WP7为目标,则可以使脱机地图正常工作,但需要大量工作。几年前我为一位客户创建了这个,我相信我花了3000多行代码才完成。请注意,他们还希望有一个框架,用于添加来自各种来源的分片,例如下载和区域以及下载压缩文件。他们说,我设法让渲染工作的方式是在不设置其位置的情况下将画布连接到地图。这将是默认设置,使其成为地图的子对象,但不会移动。然后,我将画布设置为与贴图相同的大小,并使用resize事件调整画布的大小(如果贴图需要调整大小)。然后,我使用视图更改事件触发一个方法来渲染瓷砖。触发此事件时,我首先使用以下代码计算视图中的所有分幅:

然后,我将从独立的存储中拉出瓷砖,并将其绘制在画布上。为了提高性能,我会跟踪添加到画布中的磁贴,这样,如果该磁贴仍在视图中,我只需更改其位置,而不是从独立存储中重新加载。我还删除了所有不再可见的图像。总的来说,这很好,但也有一些小问题,如缩放级别之间没有平滑过渡。如果你真的想让它工作,但需要更多的数学。此外,如果您放大到一个没有平铺的区域,您将得到一个空地图。您可以创建自定义贴图模式,以防止用户进入没有平铺的区域

解决办法 这个问题有点老了,但是对于任何可以使用Qt的人来说都有一个解决方案。 这个解决方案不仅局限于Windows Phone平台,我已经针对Android完成了它,而且它也可以在我的桌面上运行

在Qt中,您需要修补QtLocation使用的OSM插件。它简单、快捷、简单

怎么做? 快速实现可以修改
QGeoTiledMappingManagerEngineOsm
类,使其调用您自己的
QGeoTileFetcher
,而不是
QGeoTileFetcherOsm
。 也许有更好的方法来实现这一点,但至少对我来说是有效的

基本上,您可以创建一个从文件系统而不是网络中读取磁贴的获取程序。 您可以从一个在线资源(例如,请参见下文)构建一次文件系统数据库,然后将其与应用程序一起部署以供脱机使用

我从哪里买瓷砖? 有关如何将互动程序添加到脱机实施的信息,请参见:

以下是两个可免费使用的瓷砖来源:

  • 开放街道地图项目服务器
  • Mapquest开放式分幅服务器
注意许可和使用条款

开放式街道地图

  • 项目:wiki.openstreetmap.org/wiki/Main_Page
  • 许可证:www.openstreetmap.org/copyright
  • 使用条款:wiki.openstreetmap.org/wiki/Tile\u用法\u策略
  • 服务器当前命名为*.tile.openstreetmap.org
MapQuest OSM瓷砖

  • 项目:developer.mapquest.com/web/products/open/map
  • 许可证:opendatacommons.org/licenses/odbl/
  • 使用条款:developer.mapquest.com/web/info/Terms-of-use
  • 服务器当前的名称类似于otile*.mqcdn.com

(很抱歉奇怪的链接:我没有足够的声誉来发布真正的链接)。

谢谢Dennis的建议,但考虑到应用程序的全球性和地图数据量(即使是一个小国),以及地图数据不断变化的性质,我认为在XAP中包含数据是不现实的。我想说的是,你可以动态地