Гм ... при условии, что маркеры не сгруппированы, не наслоены или что-то еще: почему - прежде чем показывать их - вы не создаете сетку определенной плотности и просто помещаете маркеры в ячейки вашей сетки?
Если вы считаете, что несколько маркеров попадают в одну ячейку (ячейку сетки) - вы можете сгруппировать их.Если вам нужно немного более умное группирование, вы можете также проверить соседние ячейки.
Возможно, это звучит немного примитивно, но:
- Нет n ^ 2 алгоритмов
- Нет предположения о порядке ввода
- Нет необходимости дополнительно обрабатывать маркеры, которые не будут отображаться
Код для сетки:
Примечание. Я из мира C ++ (попал сюда через тег [attribute]), поэтому я буду придерживаться псевдо-C ++.Я не знаю API карты.Но я был бы удивлен, если бы это не могло быть эффективно переведено на любой язык / библиотеку, которую вы используете.
Ввод: - список маркеров - окно просмотра прямоугольника в мировых координатах (часть мира, которую мы сейчас ищемat)
В простейшей форме это будет выглядеть примерно так:
void draw(MarkerList mlist, View v) {
//binning:
list<Marker> grid[densityX][densityY]; //2D array with some configurable, fixed density
foreach(Marker m in mlist) {
if (m.within(v)) {
int2 binIdx;
binIdx.x=floor(densityX*(m.coord.x-v.x1)/(v.x2-v.x1));
binIdx.y=floor(densityY*(m.coord.y-v.y1)/(v.y2-v.y1));
grid[binIdx.x][binIdx.y].push(m); //just push the reference
}
//drawing:
for (int i=0; i<densityX; ++i)
for (int j=0; j<densityY; ++j) {
if (grid[i][j].size()>N) {
GroupMarker g;
g.add(grid[i][j]); //process the list of markers belonging to this cell
g.draw();
} else {
foreach (Marker m in grid[i][j])
m.draw()
}
}
}
Проблема, которая может появиться, заключается в том, что нежелательное разбиение сетки может появиться в некоторой кластерной группе, образуя два GroupMarkers,Чтобы противостоять этому, вы можете рассмотреть не только одну ячейку сетки, но и ее соседей в разделе "\ drawing", и - если они сгруппированы - пометить соседние ячейки как посещенные.