当用户在我的应用程序中点击MKMapView上的某个点时,我想确定他们所使用的国家/地区。速度是我的首要任务,因为用户肯定会注意到地图触摸和注释标注之间的延迟,并以国家名称开头。
我有所有国家/地区的多边形信息,我可以将它们解析/存储在任何必要的数据结构中。目前,它们采用GeoJSON格式并具有数千个顶点。我还为每个国家计算和存储了边界框。
一个建议是为每个多边形的边界框存储一个CGRect数组,并首先在所有边界框上执行CGRectContainsPoint搜索,以快速缩小搜索范围。如果该搜索返回多个边界框(在边界框可以重叠的国家边界上很常见),那么我可以检查已过滤国家的完整多边形以查找相关点。即使在非常拥挤的重叠区域,这个完整的搜索也将是5个或更少的完整国家多边形来检查。
为了实现这一点,我需要为每个国家/地区存储CGRect边界框和完整,复杂的CGPath。 (并且一个国家可以有多个多边形,如果它有领土)我不知道将这些存储在内存中是一个好主意,因为可能有数千个多边形。
由于GEOS的许可要求,不能编译SpatiaLite。使用R-Tree扩展编译SQLite是可能的。多边形不会改变,所以我能够以任何建议的方式预先计算并存储它们。
如果我遵循这个建议,那么存储和访问所有这些CGRect和CGPath以便快速搜索和访问的最佳方法是什么?
我对人们提出的任何其他建议持开放态度。
答案 0 :(得分:1)
我建议您使用Mapbox iOS SDK或至少使用RMInteractiveSource
和RMMBTilesSource
部分。您可以使用TileMill将源数据转换为基于每个像素的编码交互信息的栅格图块。以下是一个示例:https://github.com/mapbox/mapbox-ios-example交互性数据基本上是基于每个像素的高效键值存储。然后,您可以在给定的地图缩放级别转换CGPoint
并将偏移平移为该值。