我会根据经度/纬度对您的注释进行分类,然后使用这些分类进行合并。基本思想看起来像这样:
#include <vector>
float minLongitude = 180.0f;
float maxLongitude = -180.0f;
float longitudeBinSize = 0.1; // Degrees
float minLatitude = -90.0f;
float maxLatitude = 90.0f;
float latitudeBinSize = 0.1; // Degrees
int 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 检查三个相邻的 bin - (column+1,row) 处的 bin,(column,row+1 处的 bin ),以及 (column+1,row+1) 处的 bin。
您可以使用 NSMutableArrays 而不是 std::vector 作为垃圾箱,但听起来您有大量项目要处理,我怀疑 std::vector 会更快。不过,这只是我的偏好,甚至可能不在乎。如果你使用 ObjC 而不是 ObjC++ 那么你当然不能使用 std::vector 。