映射平铺缓存以进行脱机查看

时间:2011-02-21 17:04:59

标签: windows-phone-7 map offline openstreetmap

我正在尝试构建一个将使用Open Street Maps中的开源地图的应用程序(尽管该概念应该适用于任何地图提供者)。该应用程序将使用户能够在出发前沿路线指定多个航路点。

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

我最初的想法是从地图提供商下载所需的图块并将它们存储在独立存储中。但是,使用TileSource类的Bing Maps控件实现依赖于返回可以从中下载切片的绝对URI,这显然不适用于存储在独立存储中的数据。

这个问题已经被问到:Windows Phone 7 Map Control with custom layer in offline mode,但没有得到回答,我想知道从那以后是否有人解决了这个问题。

6 个答案:

答案 0 :(得分:2)

我已经看到这是通过在地图上放置自定义图层来完成的。然后将瓷砖从您喜欢的任何地方(IsolatedStorage,在线,其他一些?)加载到自定义图层中。

抱歉,我目前没有任何可以分享的代码,但目前正在做类似的事情。

答案 1 :(得分:2)

我使用OpenStreetMaps for Android构建了一个小型原型。我认为查看存储库可能会很有趣,因此找到类似于我的解决方案。我事先下载了地图,但也许您可以使用在线解决方案。这是回购:https://github.com/kikofernandez/OpenStreetMapExample以及它的外观视频:https://vimeo.com/40619538

我在Android中使用了这个原型OpenLayers,OpenStreetMaps,JavaScript和WebView。我想给你更多详细信息,但它只是一个原型。

答案 2 :(得分:0)

如果您可以在本地存储数据(将其嵌入XAP中),则可以通过绝对URI引用它。 Chris Walshie谈到它here

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

如果你的应用程序在WP8上运行,那么请使用Windows Phone 8 SDK中的内置地图控件,因为这已经支持开箱即用的离线地图。如果定位WP7,可以让离线地图工作,但需要做很多工作。几年前我为客户创建了这个,我相信我需要花费3000多行代码。请注意,他们还希望有一个框架,用于添加各种来源的图块,例如下载和区域以及下载压缩文件。他们设法让渲染工作的方式是画布到地图而不设置它的位置。这将默认使其成为地图的子项,但它不会移动。然后,我使画布与地图的大小相同,并在调整地图大小时使用resize事件调整画布大小。然后我使用视图更改事件来触发渲染切片的方法。当此事件触发时,我首先使用此处的代码计算视图中的所有图块:http://msdn.microsoft.com/en-us/library/bb259689.aspx

然后我会从隔离的存储中拉出瓷砖并在画布上绘制它们。为了提高性能,我会跟踪我添加到画布中的哪些图块,这样如果图块仍在视图中,我只需更改它的位置,而不是从隔离存储中重新加载它。我还删除了任何不再可见的图像。总体而言,这种方法很好但有一些小问题,例如缩放级别之间没有平滑过渡。如果你真的想要它可以让它工作,但需要更多的数学。此外,如果您放大到没有瓷砖的区域,您最终会得到一张空地图。您可以创建自定义地图模式,以防止用户进入没有切片的区域。

答案 5 :(得分:0)

解决方案

这个问题有点陈旧,但对于任何可以使用Qt的人来说都有一个解决方案。 解决方案不仅限于Windows Phone平台,我的目标是Android,它也适用于我的桌面。

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

怎么做?

快速实施可以修改QGeoTiledMappingManagerEngineOsm类,使其调用您自己的QGeoTileFetcher而不是QGeoTileFetcherOsm。 可能有更好的方法来实现这一点,但至少它对我有用。

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

我从哪里获取瓷砖?

此处提供了有关如何将磁贴添加到离线实现的信息: http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames

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

  • 打开街道地图项目服务器
  • Mapquest打开平铺服务器

照顾许可和使用条款。

打开街道地图

  • 项目:wiki.openstreetmap.org/wiki/Main_Page
  • 许可证:www.openstreetmap.org/copyright
  • 使用条款:wiki.openstreetmap.org/wiki/Tile_usage_policy
  • 服务器目前的名称类似于 *。tile.openstreetmap.org

MapQuest-OSM Tiles

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

(对不起奇怪的链接:我没有足够的声誉来发布真实的链接)。