一尘不染

使用PostGIS查找给定点的n个最近邻居?

sql

我正在尝试解决使用PostGIS查找n个最近邻居的问题:

初始点:

  • 表地名,其地名(来自geonames.org)包含纬度/经度(WSG-84)
  • 添加了srid = 4326和datatype = POINT的GeometryColumn geom
  • 用值填充的几何:更新地理名称SET geom = ST_SetSRID(ST_Point(经度,纬度),4326);
  • 为geom创建了GIST索引(使用GIST(geom)创建索引为geom_index ON的地理名称;)/聚集geom_index为:CLUSTER geom_index ON的地理名称;)
  • 为geonameid创建了PRIMARY KEY UNIQUE BTREE索引

问题:在由id(geoname.geonameid。)代表的表地理名称中,找到给定点的n个(例如5个)最近的邻居。

可能的解决方案:

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"

处理时间:约60s

还尝试了基于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"

处理时间:约120s

预期的应用程序是某种自动完成功能。因此,任何花费时间大于1s的方法均不适用。使用PostGIS,通常是否可以使响应时间小于1秒?


阅读 136

收藏
2021-03-17

共1个答案

一尘不染

从PostGIS 2.0开始,现在有了针对几何类型的KNN索引。这将为您提供最近5条有关“您的位置…”的距离的记录。

SELECT *
FROM your_table 
ORDER BY your_table.geom <-> "your location..."
LIMIT 5;

请参见PostgreSQL手册中的<->operator

2021-03-17