Кластеры координат на стороне сервера в зависимости от уровня масштабирования
-
18-09-2019 - |
Вопрос
Благодаря этому ответ Мне удалось найти временное решение моей проблемы.
Однако список из 6000 пунктов, который растет с каждым днем, становится все медленнее и медленнее.
Я не могу воспользоваться сторонним сервисом *, поэтому мне нужно придумать свое собственное решение.
Вот мои требования:
Кластеризация координат необходима для работы с любым уровнем масштабирования карты.
Все кластеры должны быть кэшированы
В идеале не будет необходимости группировать (вычислять расстояния) по всем точкам, если будет добавлена новая точка.
До сих пор я реализовал quadtree, которое возвращает четыре границы моей карты и возвращает любые координаты, находящиеся в пределах видимой части карты.
Что мне нужно, и я знаю, что это непросто, так это иметь кластеры точек, возвращаемых из базы данных (postgres).
Решение
В настоящее время я выполняю динамическую кластеризацию на стороне сервера примерно из 2000 маркеров, но она выполняется довольно быстро до 20 000.Вы можете ознакомиться с обсуждением моего алгоритма здесь:
Всякий раз, когда пользователь перемещает карту, я отправляю запрос с указанием уровня масштабирования и границ вида на сервер, который группирует доступные для просмотра маркеры и отправляет их обратно клиенту.
Я не кэширую кластеры, потому что маркеры можно динамически фильтровать и выполнять поиск, но если бы они были предварительно сгруппированы, это было бы очень быстро!
Другие советы
Я не понимаю, почему вы должны "группироваться" на лету.Подведите итог по каждому уровню масштабирования с тем разрешением, которое вас устраивает.
Имейте простую структуру из X, Y, # ссылок.Когда кто-то добавляет ссылку, вы вставляете реальные местоположения (максимальный уровень масштабирования или что-то еще), а затем начинаете всплывать оттуда.
В конечном итоге у вас будет 10 (если у вас есть 10 уровней масштабирования) наборов различных координат, по одному для каждого отдельного уровня масштабирования.
Расчет тривиален, и вам нужно сделать это только один раз.