Ответ 1
Я бы выложил ваши аннотации на основе долготы/широты, а затем объединил их с помощью этих ящиков. Основная идея будет выглядеть примерно так:
#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 at (column + 1, row), bin at (column, row + 1), а бит в (столбец + 1, строка + 1).
Вы можете использовать NSMutableArrays вместо std::vector для бункеров, но похоже, что у вас есть большое количество элементов для обработки, и я подозреваю, что std::vector будет быстрее. Это только мое предпочтение, хотя, возможно, это не имеет большого значения, чтобы даже заботиться. Если вы используете ObjC вместо ObjС++, вы не можете использовать std::vector, конечно.