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

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

起点:

  • 表geoname和geonames(来自
    (geonames.org)包含
    纬度/经度(WSG-84)
  • 添加了GeometryColumn geom和
    srid=4326,数据类型=点
  • 用值填充geom:更新geoname
    集几何=
    ST_SetGrid(ST_点(经度、纬度),
    4326);

  • 创建geom的要点索引(创建
    使用GIST(geom);)在geoname上索引geom_索引/聚集geom_索引:在geoname上聚集geom_索引
    地理名称;)

  • 为geonameid创建了主键唯一的BTREE索引

问题:
在由id(geoname.geonameid)表示的表geoname中查找给定点的n(例如5)个最近邻

可能的解决办法:

灵感来自http://www.bostongis.com/PrinterFriendly.aspx?content_name=postgis_nearest_neighbor,我尝试了以下查询:

“选择start.asciiname、ende.asciiname、distance\u sphere(start.geom、ende.geom)作为距离”+
“从geoname作为开始,geoname作为ende,其中start.geonameid=2950159和start.geonameid<>ende.geonameid”+
“和ST_DWithin(start.geom,ende.geom,300)按距离限制订购5”

处理时间:约60秒

还尝试了一种基于扩展的方法:

“选择start.asciiname、ende.asciiname、distance\u sphere(start.geom、ende.geom)作为距离”+
“从geoname作为开始,geoname作为ende,其中start.geonameid=2950159和start.geonameid<>ende.geonameid并展开(start.geom,300)&&ende.geom”+
“按距离限制订购5”

处理时间:约120秒

预期的应用是某种自动完成。因此,任何超过1s的方法都不适用。PostGIS通常可以实现<1s的响应时间吗

现在,自从PostGIS 2.0以来,就有了可用的几何体类型的KNN索引。
这将提供离“您的位置…”多远的最近5条记录

选择*
从你的桌子上
按您的_table.geom订购<->“您的位置…”
限值5;

请参阅PostgreSQL手册中的<->运算符

发表评论