У меня есть таблица PostGreSQL со столбцом типа geometry
, в котором хранятся разные простые полигоны (возможно, пересекающиеся). Полигоны — это все районы города. Я получаю ввод точки (пара широта-долгота), и мне нужно найти список полигонов, содержащих данную точку. Что у меня есть на данный момент:
- Некластеризованный индекс GiST, определенный в столбце полигона.
- Используйте
ST_Contains(@param_Point, table.Polygon)
для всей таблицы.
Это довольно медленно, поэтому я ищу более производительную альтернативу в памяти. У меня есть следующие идеи:
- Ведение словаря полигонов в Redis, с ключами по их геохешу. Полигоны с одинаковым геохешем будут сохранены в виде списка. Когда я получаю точку, вычисляю ее геохэш и обрезаю до нужного уровня. Затем выполните поиск на карте Redis и продолжайте обрезать геохэш точки, пока я не найду первый результат (или достаточное количество результатов).
- Попробуйте геохеши, загруженные из базы данных. Периодически обновляйте дерево или получайте события обновления. Вычислить геохэш точки, искать в дереве, пока не найду достаточно результатов. Я предпочитаю это, потому что на карте могут быть длинные списки для геохеша, учитывая характер полигонов.
- Любые другие подходы?
Я читал о таких библиотеках, как GeoTrie и Polygon Geohasher, но не может интегрировать их с базой данных и приведенными выше идеями.
Любые реплики или отправные точки, пожалуйста?