ios - 确定国家多边形接触 MKMapView 的有效方法?

标签 ios mapkit

当用户在我的应用程序中点击 MKMapView 上的一个点时,我想确定他们点击的是哪个国家/地区。速度是我的首要任务,因为用户肯定会注意到 map 触摸和以国家/地区名称开头的注释标注之间的滞后。

我拥有所有国家/地区的多边形信息,并且可以将它们解析/存储在任何必要的数据结构中。目前,它们采用 GeoJSON 格式并具有数千个顶点。我还计算并存储了每个国家/地区的边界框。

一个建议是为每个多边形的边界框存储一个 CGRect 数组,并首先对所有边界框进行 CGRectContainsPoint 搜索,以快速缩小搜索范围。如果该搜索返回多个边界框(常见于边界框可以重叠的国家/地区边界),那么我可以检查过滤后的国家/地区的完整多边形以查找相关点。即使在非常拥挤的重叠区域,此完整搜索也将检查 5 个或更少的完整国家多边形。

为了实现此目的,我需要为每个国家/地区存储 CGRect 边界框和完整、复杂的 CGPath。 (如果一个国家有领土,它可以有多个多边形)我不知道将这些存储在内存中是否是一个好主意,因为可能有数千个多边形。

由于 GEOS 的许可要求,无法选择编译 SpatiaLite。使用 R-Tree 扩展编译 SQLite 是可能的。多边形不会改变,因此我能够预先计算并将它们以建议的任何方式存储在磁盘上。

如果我遵循这个建议,存储和访问所有这些 CGRect 和 CGPath 以便快速搜索和访问的最佳方式是什么?

我愿意接受人们提出的任何其他建议。

最佳答案

我建议使用 Mapbox iOS SDK或者至少使用它的 RMInteractiveSourceRMMBTilesSource 部分。您可以使用 TileMill将您的源数据转换为具有基于每个像素的编码交互信息的栅格图 block 。这是一个例子:https://github.com/mapbox/mapbox-ios-example交互数据基本上是基于每个像素的高效键值存储。然后,您可以将给定 map 缩放级别和平移偏移量的 CGPoint 转换为该值。

技术背景:https://www.mapbox.com/developers/utfgrid/

关于ios - 确定国家多边形接触 MKMapView 的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21915811/

相关文章:

html - Phonegap iOS 输入和 contenteditable 错误

ios - 使用 GPUImagePerlinNoiseFilter 生成图像

ios - 如何创建对对象的引用以在 iOS 中为其设置动画

iphone - 从 plist 数组加载 MapView 注释时出现问题 - Xcode 4.2

iOS 存储 CLLocation 核心数据作为可转换的 NSKeyedUnarchiveFromDataTransformerName 错误 CoreData : warning: no NSValueTransformer

ios Facebook 登录按钮 - 不会更改为注销

ios - MKOverlayRenderer 拉伸(stretch)图像

ios - 如何使用 MBRoute (Mapbox) 获取 MKPolyline (Mapkit)

ios - 在 mapview iOS 6 中绘制折线

ios - 快速拖动 map 或更改缩放级别时,MapKit 上的自定义集群注释崩溃