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