簡體   English   中英

使用 PostGIS 查找給定點的 n 個最近鄰?

[英]Find n Nearest Neighbors for given Point using PostGIS?

我正在嘗試解決使用 PostGIS 查找 n 個最近鄰的問題:

初始點:

  • 表 geoname 與 geonames(來自 geonames.org)包含緯度/經度(WSG-84)
  • 添加了 srid=4326 和 datatype=POINT 的 GeometryColumn geom
  • 用值填充 geom:UPDATE geoname SET geom = ST_SetSRID(ST_Point(longitude,latitude), 4326);
  • 為 geom 創建 GIST 索引 (CREATE INDEX geom_index ON geoname USING GIST (geom);) / Clustered geom_index: CLUSTER geom_index ON geoname;)
  • 為 geonameid 創建 PRIMARY KEY UNIQUE BTREE 索引

問題:為表 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM