Как выполнить поиск в памяти полигонов, содержащих данную точку? - PullRequest
0 голосов
/ 27 февраля 2020

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

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

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

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

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

Какие-нибудь подсказки или отправные точки, пожалуйста?

1 Ответ

0 голосов
/ 04 марта 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...