Как выполнить поиск в памяти полигонов, содержащих заданную точку?

У меня есть таблица PostGreSQL со столбцом типа geometry, в котором хранятся разные простые полигоны (возможно, пересекающиеся). Полигоны — это все районы города. Я получаю ввод точки (пара широта-долгота), и мне нужно найти список полигонов, содержащих данную точку. Что у меня есть на данный момент:

  • Некластеризованный индекс GiST, определенный в столбце полигона.
  • Используйте ST_Contains(@param_Point, table.Polygon) для всей таблицы.

Это довольно медленно, поэтому я ищу более производительную альтернативу в памяти. У меня есть следующие идеи:

  1. Ведение словаря полигонов в Redis, с ключами по их геохешу. Полигоны с одинаковым геохешем будут сохранены в виде списка. Когда я получаю точку, вычисляю ее геохэш и обрезаю до нужного уровня. Затем выполните поиск на карте Redis и продолжайте обрезать геохэш точки, пока я не найду первый результат (или достаточное количество результатов).
  2. Попробуйте геохеши, загруженные из базы данных. Периодически обновляйте дерево или получайте события обновления. Вычислить геохэш точки, искать в дереве, пока не найду достаточно результатов. Я предпочитаю это, потому что на карте могут быть длинные списки для геохеша, учитывая характер полигонов.
  3. Любые другие подходы?

Я читал о таких библиотеках, как GeoTrie и Polygon Geohasher, но не может интегрировать их с базой данных и приведенными выше идеями.

Любые реплики или отправные точки, пожалуйста?


person Abubakar Mehmood    schedule 27.02.2020    source источник


Ответы (1)


Вы пробовали использовать ST_Within? Не уверен, что он соответствует вашим критериям, но я считаю, что он должен быть быстрее, чем st_contains

person Slumdog    schedule 04.03.2020
comment
Пока нет, но я могу попробовать вернуться с результатами. Тем не менее, система, основанная на событиях, которая иерархически поддерживает все данные полигона в Redis, была бы идеальной. - person Abubakar Mehmood; 09.03.2020