我正在尝试使用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手册中的<;->;
运算符