iphone – 在缩放的MKMapView上整合注释

iphone – 在缩放的MKMapView上整合注释,第1张

概述有一些坏的方法可以解决我想要做的事情,但这似乎是“必须有更好的方法”之一. 我在iPhone应用程序中使用了一个MKMapView,显示了许多注释.假设在美国各州的每一个城市都有一个注释,因此在屏幕上有一个相当密集的注释.当用户缩小地图时,这些注释开始彼此紧缩,直到它们重叠并变得难以单独挑出. 我想做的是,在特定的注释密度(例如,任何注释重叠时),将这些注释合并到单个注释中,表示它包含一些子注释( 有一些坏的方法可以解决我想要做的事情,但这似乎是“必须有更好的方法”之一.

我在iPhone应用程序中使用了一个MKMapVIEw,显示了许多注释.假设在美国各州的每一个城市都有一个注释,因此在屏幕上有一个相当密集的注释.当用户缩小地图时,这些注释开始彼此紧缩,直到它们重叠并变得难以单独挑出.

我想做的是,在特定的注释密度(例如,任何注释重叠时),将这些注释合并到单个注释中,表示它包含一些子注释(一些可视化指示符,“放大你会看到更多的注释“).

我可以在注释视图中调用CGRectIntersectsRect,但是使用它似乎是一个N ^ 2问题 – 我必须遍历每个注释的每个注释.考虑这个伪代码:

FOR firstAnnotationVIEw IN allAnnotationVIEws   FOR secondAnnotationVIEw in allAnnotationVIEws       IF CGRectIntersectsRect(firstAnnotationVIEw.frame,secondAnnotationVIEw.frame)           // found two overlapPing annotations,consolIDate them       ENDIF   ENDFORENDFOR

你可以看到为什么会这么慢,每次地图被放大或缩小时都必须运行!

那么,你如何在地图中检测到重叠的注释,并以精湛的方式,智能地整合它们?

解决方法 我将根据经度/纬度来填充您的注释,然后使用这些bin进行合并.基本思想看起来像这样:

#include <vector>float minLongitude = 180.0f;float maxLongitude = -180.0f;float longitudeBinSize = 0.1; // degreesfloat minLatitude = -90.0f;float maxLatitude = 90.0f;float latitudeBinSize = 0.1; // degreesint numBinColumns = int((maxLongitude - minLongitude) / longitudeBinSize);int numBinRows = int((maxLatitude - minLatitude) / latitudeBinSize);voID calcBinCoords(float longitude,float latitude,int &column,int &row) {    column = int((latitude - minLatitude) / latitudeBinSize);    row = int((longitude - minLongitude) / longitudeBinSize);}typedef std::vector<AnnotationVIEw *> AnnotationVIEws;voID binAnnotations(NSArray *annotationVIEws,std::vector<AnnotationVIEws> &binnedAnnotations) {    binnedAnnotations.clear();    binnedAnnotations.resize(numBinColumns * numBinRows);    for (AnnotationVIEw *annotationVIEw in annotationVIEws) {        int column,row;        calcBinCoords(annotationVIEw.longitude,annotationVIEw.latitude,column,row);        binnedAnnotations[row * numBinColumns + column].push_back(annotationVIEw);    }}

longitudeBinSize和latitudeBinSize的值将是合并时打算搜索的最大距离.一旦一切都在垃圾箱中,那么您的搜索问题只涉及在候选人的相邻仓中搜索值列表.此外,由于您将在合并过程中扫描阵列,因此您只需要检查处理的每个bin的三个相邻的存储区(第1列,第1列),第(列,第1列) (第1列,第1列).

您可以使用NSMutableArrays而不是std :: vector进行分区,但是听起来你有大量的项目要处理,我怀疑std :: vector会更快.这只是我的喜好,可能没关系,甚至不在乎.如果您使用ObjC而不是ObjC,那么您当然不能使用std :: vector.

总结

以上是内存溢出为你收集整理的iphone – 在缩放的MKMapView上整合注释全部内容,希望文章能够帮你解决iphone – 在缩放的MKMapView上整合注释所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1027849.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-23
下一篇2022-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存