当用户在我的应用程序中点击 MKMapView 上的一个点时,我想确定他们点击的是哪个国家/地区。速度是我的首要任务,因为用户肯定会注意到 map 触摸和以国家/地区名称开头的注释标注之间的滞后。
我拥有所有国家/地区的多边形信息,并且可以将它们解析/存储在任何必要的数据结构中。目前,它们采用 GeoJSON 格式并具有数千个顶点。我还计算并存储了每个国家/地区的边界框。
一个建议是为每个多边形的边界框存储一个 CGRect 数组,并首先对所有边界框进行 CGRectContainsPoint 搜索,以快速缩小搜索范围。如果该搜索返回多个边界框(常见于边界框可以重叠的国家/地区边界),那么我可以检查过滤后的国家/地区的完整多边形以查找相关点。即使在非常拥挤的重叠区域,此完整搜索也将检查 5 个或更少的完整国家多边形。
为了实现此目的,我需要为每个国家/地区存储 CGRect 边界框和完整、复杂的 CGPath。 (如果一个国家有领土,它可以有多个多边形)我不知道将这些存储在内存中是否是一个好主意,因为可能有数千个多边形。
由于 GEOS 的许可要求,无法选择编译 SpatiaLite。使用 R-Tree 扩展编译 SQLite 是可能的。多边形不会改变,因此我能够预先计算并将它们以建议的任何方式存储在磁盘上。
如果我遵循这个建议,存储和访问所有这些 CGRect 和 CGPath 以便快速搜索和访问的最佳方式是什么?
我愿意接受人们提出的任何其他建议。
Tôi là một lập trình viên xuất sắc, rất giỏi!