Я пытаюсь решить проблему поиска n ближайших соседей с помощью PostGIS:
Начальная точка:
- Таблица геонамов с геонамами (из
geonames.org), содержащий
широта / долгота (WSG-84)
- Добавлена геометрия GeometryColumn с
srid = 4326 и тип данных = POINT
- Заполненный geom со значениями: UPDATE geoname
SET geom =
ST_SetSRID (ST_Point (долгота, широта),
4326);
- Создан индекс GIST для geom (CREATE
INDEX geom_index ON для геонам с использованием GIST (geom);) / Clustered geom_index: CLUSTER geom_index ON
geoname;)
- Создан индекс PRIMARY KEY UNIQUE BTREE для геонамеды
Проблема:
Найдите n (например, 5) ближайших соседей для заданной точки в геонаме таблицы, представленной идентификатором (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 с, не применим. Можно ли вообще достичь времени отклика <1с с PostGIS? </p>