[英]Find n Nearest Neighbors for given Point using PostGIS?
我正在嘗試解決使用 PostGIS 查找 n 個最近鄰的問題:
初始點:
問題:為表 geoname 中的給定點查找 n(例如 5)個最近鄰居,由 id (geoname.geonameid.geoname) 表示。
可能的解決方案:
受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 通常是否可以實現 <1s 的響應時間?
現在從 PostGIS 2.0 開始,有一個可用的幾何類型的 KNN 索引。 這為您提供了最近的 5 條記錄,它們與“您的位置...”的距離有關。
SELECT *
FROM your_table
ORDER BY your_table.geom <-> "your location..."
LIMIT 5;
請參閱PostgreSQL 手冊中的<->
運算符。
我認為你在列表中得到了回答,單位是度,所以你幾乎在 st_dwithin 中用 300 度搜索整個世界。
如果您的數據集很大,因此您不能在基於米的投影投影中工作(更快且 CPU 密集度更低的計算),您應該考慮使用 geography 類型。 然后您可以將 st_dwithin 與儀表一起使用。
為了讓事情更快,你應該我只創建一個新表,將幾何轉換為地理。
但是為了測試它,您可以即時投射:
SELECT start.asciiname, ende.asciiname,
ST_Distance(start.geom::geography, ende.geom::geography) as distance
FROM geoname As start, geoname As ende
WHERE start.geonameid = 2950159 AND start.geonameid <> ende.geonameid AND
ST_DWithin(start.geom::geography, ende.geom::geography, 300)
order by distance
limit 5;
HTH尼克拉斯
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.