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

5

我尝试了以下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。问题出在哪里呢?


使用ST_Intersects或ST_Contains代替&&。 - John Powell
1个回答

15

这里是您的地理信封:

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)

谢谢Mike,这是一个很好的解释。 - JustWonder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接