gpt4 book ai didi

postgresql - PostGIS 边界框查询返回了奇怪的结果

转载 作者:行者123 更新时间:2023-11-29 11:38:09 37 4
gpt4 key购买 nike

我尝试了以下 SQL 命令:

CREATE TABLE places(
lat_lng geography(Point,4326),
place_name varchar(50)
);

CREATE INDEX places_lat_lng_idx ON places USING gist(lat_lng);

INSERT INTO places values ('POINT(-126.4 45.32)', 'Food Bar1');
INSERT INTO places values ('POINT(-126.4 47.32)', 'Food Bar2');
INSERT INTO places values ('POINT(-125.4 47.42)', 'Food Bar3');

SELECT place_name, ST_AsText(lat_lng) as point
FROM places WHERE places.lat_lng &&
ST_MakeEnvelope(-130.0, 44.0,
-100.0, 46.7, 4326);

结果是:

 place_name |        point        
------------+---------------------
Food Bar1 | POINT(-126.4 45.32)
Food Bar2 | POINT(-126.4 47.32)
Food Bar3 | POINT(-125.4 47.42)

这对我来说看起来不对,因为 ymax 是 46.7,但是从透视角度来看,“Food Bar2”和“Food Bar3”的 ymax 值为 47.32 和 47.42。问题出在哪里?

最佳答案

Here is your geography envelope :

url_mapper

在这里,你的查询点。使用 ST_Segmentize 将包络展平到笛卡尔空间:

SELECT ST_Segmentize(
ST_MakeEnvelope(-130.0, 44.0,
-100.0, 46.7, 4326)::geography,50000);

point_in_bbox

所以您认为这些点应该在地理范围内是正确的,但是您使用了 && 边界框运算符,它忽略了几何形状。地理信封的边界框如下所示:

point_in_bbox_w_env

显示边界框中的所有点。

用这样的东西修复查询:

SELECT place_name, ST_AsText(lat_lng) as point
FROM places
WHERE ST_Intersects(
ST_MakeEnvelope(-130.0, 44.0,
-100.0, 46.7, 4326),
places.lat_lng)

关于postgresql - PostGIS 边界框查询返回了奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26743578/

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