【发布时间】:2011-07-03 23:13:27
【问题描述】:
我正在尝试解决使用 PostGIS 查找 n 个最近邻居的问题:
起点:
- 带有地名的表地名(来自 geonames.org) 包含 纬度/经度 (WSG-84)
- 添加了 GeometryColumn 几何 srid=4326 和数据类型=POINT
- 用值填充geom:更新geoname 设置几何 = ST_SetSRID(ST_Point(经度,纬度), 第4326章);
- 为 geom 创建 GIST 索引(CREATE INDEX geom_index ON geoname USING GIST (geom);) / Clustered geom_index: CLUSTER geom_index ON 地名;)
- 为 geonameid 创建 PRIMARY KEY UNIQUE BTREE 索引
问题: 在 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"
处理时间:约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
预期的应用程序是某种自动完成功能。因此,任何花费超过 1 秒的方法都不适用。使用 PostGIS 一般可以实现
【问题讨论】:
-
我认为您在gis.stackexchange.com 获得答案的机会更大。
标签: sql postgresql postgis