Найти n ближайших соседей для данной точки с помощью PostGIS?

Я пытаюсь решить проблему поиска n ближайших соседей с помощью PostGIS:

Начальная точка:

  • Таблица geoname с geoname (из geonames.org), содержащий широта / долгота (WSG-84)
  • Добавлена ​​геометрия GeometryColumn с srid = 4326 и datatype = POINT
  • Geom заполнен значениями: UPDATE geoname УСТАНОВИТЬ geom = ST_SetSRID (ST_Point (долгота, широта), 4326);
  • Создан индекс GIST для geom (CREATE ИНДЕКС geom_index ON geoname ИСПОЛЬЗОВАНИЕ GIST (geom);) / Clustered geom_index: CLUSTER geom_index ON geoname;)
  • Создан УНИКАЛЬНЫЙ индекс BTREE ПЕРВИЧНОГО КЛЮЧА для geonameid

Проблема: Найдите n (например, 5) ближайших соседей для данной точки в таблице geoname, представленной идентификатором (geoname.geonameid.

Возможное решение:

На основе http://www.bostongis.com/PrinterFriendly.aspx ? content_name = postgis_nearest_neighbor , я попробовал следующий запрос:

"SELECT start.asciiname, ende.asciiname, distance_sphere(start.geom, ende.geom) as distance " +
"FROM geoname As start, geoname As ende WHERE start.geonameid = 2950159 AND start.geonameid <> ende.geonameid " +
"AND ST_DWithin(start.geom, ende.geom, 300) order by distance limit 5"

Время обработки: около 60 секунд

Также попробовал подход, основанный на EXPAND:

"SELECT start.asciiname, ende.asciiname, distance_sphere(start.geom, ende.geom) as distance " +
"FROM geoname As start, geoname As ende WHERE start.geonameid = 2950159 AND start.geonameid <> ende.geonameid AND expand(start.geom, 300) && ende.geom " +
"order by distance limit 5"

Время обработки: около 120 секунд

Предполагаемое приложение - это какое-то автозаполнения. Таким образом, любой подход, занимающий более> 1 с, неприменим. Можно ли в целом добиться времени отклика

22
задан Scholle 3 April 2016 в 21:59
поделиться