26

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

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

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

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

4

6 回答 6

2

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

抱歉,我目前没有任何可以分享的代码来演示这一点,但目前我正在做一些非常相似的事情。

于 2012-02-14T10:31:04.233 回答
2

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

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

于 2012-05-28T08:38:43.370 回答
0

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

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

Uri toResource = new Uri("file:///Applications/Install/4FFA38B5-00AF-4760-A7EB-7C0C0BC1D31A/Install/EMBEDDED_RESOURCE", UriKind.Absolute);
于 2011-02-22T00:44:03.210 回答
0

一个解法

这个问题有点老了,但是任何可以使用 Qt 的人都有一个解决方案。该解决方案不仅限于 Windows Phone 平台,我已经针对 Android 完成了它,它也适用于我的桌面。

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

怎么做 ?

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

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

我从哪里得到瓷砖?

此处提供了如何将图块用于离线实施的信息: http ://wiki.openstreetmap.org/wiki/Slippy_map_tilenames

这里有两个可以免费使用的瓷砖来源:

  • 打开 Street Maps 项目服务器
  • Mapquest Open Tiles 服务器

注意许可和使用条款。

打开街道地图

  • 项目:wiki.openstreetmap.org/wiki/Main_Page
  • 许可证:www.openstreetmap.org/copyright
  • 使用条款:wiki.openstreetmap.org/wiki/Tile_usage_policy
  • 服务器当前命名为*.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

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

于 2015-04-13T13:21:31.487 回答
0

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

于 2012-05-07T09:52:37.393 回答
0

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

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

于 2013-07-31T13:04:30.087 回答