最近邻居的 Postgis SQL

2024-05-16

我正在尝试计算最近的邻居。为此,我需要传递一个参数来限制与邻居的最大距离。例如,半径1000米内最近的邻居是哪些?

我做了以下事情:

我用数据创建了表:

id | name | latitude | longitude

之后,我执行了以下查询:

SELECT AddGeometryColumn ( 'public' , ' green ', ' geom ' , 4326 , ' POINT' , 2 );

UPDATE season
SET geom = ST_Transform(ST_PointFromText ('POINT (' || longitude || ' ' || latitude || ')', 4269), 4326);

第一个问题,巴西的SRID是4326吗? 4269 是多少?

第二个问题,通过执行以下SQL

SELECT id, name
FROM season
WHERE ST_DWithin (
                 geom ,
                 ST_GeomFromText ('POINT(-49.2653819 -25.4244287 )', 4326),
                 1000
                 );

这不会返回任何内容。据我了解,这个SQL会进一步指出最大距离的半径,对吧?

看来如果你输入 1000 个结果为 100000000,我的所有条目都会出现。

所以,我想知道这里出了什么问题?


首先,如果您使用纬度、经度,则需要使用 4326。

UPDATE season SET geom = ST_PointFromText ('POINT(' || longitude || ' ' || latitude || ')' , 4326 ) ;

然后在 geom 字段上创建索引

CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield] ); 

然后你就得到了 kNN 个邻居:

SELECT *,ST_Distance(geom,'SRID=4326;POINT(newLon newLat)'::geometry) 
FROM yourDbTable
ORDER BY
yourDbTable.geom <->'SRID=4326;POINT(newLon newLat)'::geometry
LIMIT 10;

该查询将利用要点索引的 kNN 功能(http://workshops.boundlessgeo.com/postgis-intro/knn.html http://workshops.boundlessgeo.com/postgis-intro/knn.html).

返回的距离仍然以度为单位,而不是米(投影 4326 使用度)。

要解决此问题:

SELECT *,ST_Distance(geography(geom),ST_GeographyFromText('POINT(newLon newLat)') 
FROM yourDbTable
ORDER BY
yourDbTable.geom <->'SRID=4326;POINT(newLon newLat)'::geometry
LIMIT 10;

当您计算 ST_distance 时,请使用地理类型。距离始终以米为单位:

http://workshops.boundlessgeo.com/postgis-intro/geography.html http://workshops.boundlessgeo.com/postgis-intro/geography.html

所有这些功能可能需要最新的 Postgis 版本(2.0+)。但我不确定。

检查此以供参考https://gis.stackexchange.com/questions/91765/improve-speed-of-postgis-nearest-neighbor-query/ https://gis.stackexchange.com/questions/91765/improve-speed-of-postgis-nearest-neighbor-query/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最近邻居的 Postgis SQL 的相关文章

随机推荐