如何在我的 mapview iOS 7 中使用 OpenLayer (OpenStreetMap) 瓦片

Posted

技术标签:

【中文标题】如何在我的 mapview iOS 7 中使用 OpenLayer (OpenStreetMap) 瓦片【英文标题】:How do I utilize OpenLayer (OpenStreetMap) tiles in my mapview iOS 7 【发布时间】:2014-06-11 21:57:18 【问题描述】:

我最近开始研究地图,想知道如何在我的 MKMapView 上实现来自 OpenLayer 的图块(我相信 openstreetmap 正在显示)。默认的 sdk 没有显示足够的细节来做我想做的事情。我可以 ping 服务器以获取磁贴,但我一直看到有关这样做的警告。所以我的两个问题是1)我如何从openlayer获取瓷砖并将它们覆盖在我的地图视图中2)有没有办法提前获取这些瓷砖并将它们存储在我的应用程序中? 我只是想绘制一个小区域(价值大约 9 平方英里)。任何建议表示赞赏

【问题讨论】:

【参考方案1】:

您正在寻找的是一个 MKTileOverlay,它覆盖了来自 OpenSteetMap 的图块。

Mattt Thompson 在 NSHipster 上有一些示例代码:

static NSString * const template = @"http://tile.openstreetmap.org/z/x/y.png";

MKTileOverlay *overlay = [[MKTileOverlay alloc] initWithURLTemplate:template];
overlay.canReplaceMapContent = YES;

[self.mapView addOverlay:overlay
               level:MKOverlayLevelAboveLabels];

对于每个所需的磁贴,这将从 URL 模板下载数据。

有关更多详细信息,请参阅http://nshipster.com/mktileoverlay-mkmapsnapshotter-mkdirections/(此处摘自)。

如果您想管理自己的切片缓存(例如,一些切片随应用程序一起提供),您可以子类化

- (void)loadTileAtPath:(MKTileOverlayPath)path result:(void (^)(NSData *tileData, NSError *error))result

并直接提供数据。 但是,我想如果需要所有缩放级别,即使是 9 平方英里的数据也会非常大。不过,您可能有一个混合体,并为您的应用提供一些数据,然后直接下载更高的缩放级别。

【讨论】:

这是我目前拥有的,但我不想继续从他们的服务器下载(不想被阻止)。混合动力也不会太糟糕。如果我想手动下载它们,我在试图弄清楚 url 的 x 和 y 是什么时遇到了问题。有没有办法计算或在视觉上校准一个区域并以该特定缩放比例下载图块? 定义非常大。 WMTS 瓦片通常只有几千字节大小,9 平方英里是一个非常小的区域。 你现在可能已经明白了,但是这个页面告诉你如何下载 OSM 瓦片:shiki.me/blog/…

以上是关于如何在我的 mapview iOS 7 中使用 OpenLayer (OpenStreetMap) 瓦片的主要内容,如果未能解决你的问题,请参考以下文章

Ios 7 自定义 UINavigationController 动画在目标控制器中使用 mapView 失败

如何阻止mapView中showsUserLocation的交互?

如何使用 Mapview 设置布局

在mapview iOS 6中绘制折线

从 MapView 中删除多个注释

在 ios Mapview 上绘制折线