PostGIS에서 바운딩 박스 쿼리를 수행하고 있습니까? [닫은]


22

Longlat coordinates필드가있는 거의 2 백만 행의 PostgreSQL 테이블이 POINT(-73.4938 33.2405)있습니다.

해당 필드에 지리 공간 인덱스가 있다고 가정하면 임의의 경계 상자 내에서 모든 행을 선택하는 가장 효율적이고 빠른 방법은 무엇입니까?

상자 같은 것입니다 SW long-lat: -74.0042 40.7688, NE long-lat: -73.8809 40.7984.


저장된 좌표가 이미 길거나 격자 (X, Y)입니까?
Martin F

1
point.x가 SW.x보다 크고 NE.x보다 작고 point.y가 SW.y보다 크고 NE.y보다 작은 경우, 포인트는 MBR. 그래도 공간 쿼리를 사용하는 것보다 빠릅니다. 시도해 볼래?
Michal Zimmermann

@zimmi : 그는 실제로 아이템 포인트라고 진술하지 않습니다 . 복잡한 형상 일 수 있습니다.
Martin F

그들은 이다 불구하고, 단지 포인트 ;-). 그것들은 WKB로 저장된 POINT (-73.4938 33.24059) 형식으로 길다.
Avishai

나는 그 정보를 반영하기 위해 Q와 A를 편집했다. :-)
Martin F

답변:


24

주어진 바운딩 박스 한계가 저장된 좌표와 동일한 공간 참조 시스템에 있다고 가정하고 필요한 공간 연산자 (교차하거나 포함)를 알고 있습니다.

SELECT *
FROM   my_table
WHERE  coordinates 
    && -- intersects,  gets more rows  -- CHOOSE ONLY THE
    @ -- contained by, gets fewer rows -- ONE YOU NEED!
    ST_MakeEnvelope (
        xmin, ymin, -- bounding 
        xmax, ymax, -- box limits
        my_srid)

또는 "contains"대신 "contains"소리를 선호하는 경우 WHERE절을 뒤집어 야합니다.

WHERE  ST_MakeEnvelope (...)
    ~ -- contains, gets same fewer rows 
    coordinates 

PS : 레코드가 있음 (위의 게시 된 후 OP에 의해)을 감안할 때 이다 간단한 점을, 나는 생각 의 차이 "교차"와 "봉쇄"사이 만 점에 영향을 미치는 매우 미묘하게 가장자리에 경계 상자를.


그건 좋은 지적이야. 경계 있는 경우지도 마커를 볼 수 없으므로 브라우저 크롬 이 포함되어 있어야합니다 .
Avishai

What's the fastest ...?: OP
Magno C

주의 : &&@다각형 지오메트리와 교차 할 때 작동하지 않습니다. 이 경우 ST_Intersects(latlng_column,ST_GeomFromText('Polygon ((...))',4326))또는 다른 방법으로 사용ST_Contains
Alex

4
SELECT ST_Y(the_geom) AS latitude, ST_X(the_geom) as longitude
from units u where the_geom && ST_MakeEnvelope(left, bottom, right, top, 4326)

1
4326이 SRID라고 말할 필요는 없습니다.
Magno C

2

분명히, 나는 코멘트를 추가 할 충분한 포인트가 없으므로 ST_MakeEnvelope와 "x> min_x 및 x <max_x 및 y> min_y 및 y <max_y"의 수학 비교를 모두 시도했다는 것을 말하기 위해이 답변을 사용하고 있습니다. .. 평균 ST_MakeEnvelope는 60ms가 걸리고 수학 비교는 특정 bbox 쿼리에서 155ms가 걸렸습니다.

따라서 공간 검색 ST_MakeEnvelope는 수학 비교보다 빠릅니다!


1
실제로 올바른 인덱스를 만들면 min_x, max_x, min_y 및 max_y가 훨씬 빠릅니다. 나는 매우 큰 데이터 세트 (3 백만 다각형 INDEX이상)를 가지고 있으며 ST_MakeEnvelope 및 (ST_XMax, ST_XMin, ST_YMax, ST_YMin)을 모두 수행했으며 그 차이는 수학에 유리합니다. 봉투 교차로가 2 분을 인수하면서 수학은 20 대 (INDEX + 쿼리)보다 적은 걸렸다 (이 2 분에 도달 할 때 나는 단지 공간 인덱싱을 위해 40 포기)
caiohamamura
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.