gpt4 book ai didi

sql - 最近邻居的 Postgis SQL

转载 作者:行者123 更新时间:2023-11-29 11:27:04 25 4
gpt4 key购买 nike

我正在尝试计算最近的邻居。为此,我需要传递一个参数来限制与邻居的最大距离。例如,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会进一步指向最大距离的半径,对吧?

显示如果您为 100000000 输入 1000 个结果,我的所有条目都会出现。

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

最佳答案

首先,如果你使用纬度,经度,你需要使用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;

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

返回的距离仍然以度为单位,而不是米(投影 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

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

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

关于sql - 最近邻居的 Postgis SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22854105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com