postGIS를 사용하여 경계 상자를 선택 하시겠습니까?


36

postGIS를 사용하여 경계 상자 내에 존재하는 모든 방법과 해당 노드를 선택하는 쿼리를 만들고 싶습니다. 경계 상자는 삼투 "--bounding-box"명령이 검색 할 때 모든 세부 사항을 포함해야합니다.

그렇게 할 방법이 있습니까?

답변:


36

삼투 문서의 경우 명령 옵션이 표시됩니다 .

--bounding-box top=49.5138 left=10.9351 bottom=49.3866 right=11.201

PostGIS의 경우 ST_MakeEnvelope (left, bottom, right, top, srid) 를 사용하여 경계 상자를 만든 다음 &&경계 상자 연산자 를 사용하여 경계 상자가 교차하는 위치를 찾을 수 있습니다.

SELECT *
FROM mytable
WHERE mytable.geom && ST_MakeEnvelope(10.9351, 49.3866, 11.201, 49.5138, 4326);

SRID 4326은 WGS84 Lat / Long 용이며 PostGIS 1.5에만 필요합니다. 이후 버전에서는 생략 할 수 있습니다.


감사. ST_MakeEnvelope 함수에는 srid 매개 변수가 하나 더 필요합니다. 거기에 무엇을 넣을 지 모르겠습니다. 어떤 아이디어?
uriel

1
해당 매개 변수가 필요한 PostGIS 1.5를 사용하고있는 것 같습니다. SRID는 무시되므로 모든 값이 동일한 결과를 얻을 수 있다고 생각합니다. 위도 / 경도 데이터가있는 경우 일반적으로 SRID 4326을 사용하십시오.
Mike T

1
요즘 대부분의 도구를 사용하면 OSM 데이터를로드 할 때 SRID를 선택할 수 있습니다. 기본 OSM SRID는 3857 (구형 메르카토르)입니다. 대부분의 위도 / 경도 데이터의 기본 SRID는 SRID 4326 (Lat / Lon AKA WGS84)입니다. 예를 들어 SRID 3857로 데이터를로드하는 경우 LAT / LON WGS84에서 3857로 변환해야합니다. ST_Transform (ST_MakeEnvelope (LON1, LAT1, LON2, LAT2, 4326), 3857) 일부 도구 (imposm3) 현재 SRID 3857 만 지원
Justin Swanhart

&& 연산자는 SRID를 변환하지 않습니다. 작성한 봉투가 테스트 지오메트리와 동일한 SRID인지 확인하거나 직접 변환하십시오. trac.osgeo.org/postgis/ticket/2320
넬슨

1
&& 연산자는 연산 ST_Intersects보다 느린
caiohamamura

8

PostGIS의 경계 상자는 다음과 같이 생성됩니다.

ST_GeomFromText('POLYGON((ulx uly, urx ury, llx llr, lrx lry, ulx uly))', <srid>)

쿼리는 ST_Intersection을 하위 쿼리와 함께 사용합니다.

SELECT bbox_nodes.id, bbox_nodes.tag, nodes_geom 
FROM (SELECT nodes.id, nodes.tag, 
   ST_Intersection(nodes.the_geom, 
      ST_GeomFromText('POLYGON((ulx uly, urx ury, llx llr, lrx lry, ulx uly))', <srid> )).geom AS nodes_geom
   FROM nodes 
   WHERE ST_Intersects(nodes.the_geom, 
      ST_GeomFromText('POLYGON((ulx uly, urx ury, llx llr, lrx lry, ulx uly))', <srid> )) AS bbox_nodes
WHERE ST_Dimension(bbox_nodes.nodes_geom)=0;

필자 는 PostGIS 도움말 페이지
에서 위의 내용과 비슷하게 설계된 두 번째 쿼리 (그러나 ST_Dimension () = 1)를 사용하여 방법을 가져야합니다.

미시간 주 HTH


안녕, 고마워! 무엇을 srid? <srid>에 어떤 shoul을 삽입해야합니까? ".geom"(4 번째 줄)에 유효하지 않은 것 같습니다.
uriel

죄송합니다, 지난주에 귀하의 의견을 놓쳤습니다. srid는 좌표 참조 시스템 코드입니다. 즉 이스라엘을위한 2039 년. .geom 추가는 "GeometryCollection의 Geometry 부분을 추출합니다. 여기에 필요하지 않을 수도 있습니다.
Micha

4

여기에 귀하의 질문과 비슷한 주제가 있습니다 ...

ST_Intersection — (T) geomA 및 geomB의 공유 부분을 나타내는 형상을 반환합니다. 지리 구현은 교차로를 수행하기 위해 형상으로 변환 한 다음 WGS84로 다시 변환합니다.

1.you 또한 몇 가지 정보를 얻을 수 있습니다 여기에 기하학 구축 기능에 대해.

SELECT ST_AsText(ST_Intersection(
  ST_Buffer('POINT(0 0)', 2),
  ST_Buffer('POINT(3 0)', 2)
));

교차점

2. 다른 정보 여기에 교차하는 사거리에 대한 : PostGIS와 - ST_Intersects, ST_Intersection에 ...

SELECT b.the_geom As bgeom, p.the_geom As pgeom, 
        ST_Intersection(b.the_geom, p.the_geom) As intersect_bp
    FROM buildings b INNER JOIN parcels p ON ST_Intersection(b,p)
    WHERE ST_Overlaps(b.the_geom, p.the_geom)
    LIMIT 1;

교차점

도움이 되길 바랍니다.


0

이것은 @Micha의 코드에 대한 주석입니다.

의 좌표 쌍 POLYGON은 시계 방향 (또는 시계 반대 방향) 순서를 따라야합니다. 왼쪽 위, 오른쪽 위, 오른쪽 아래, 왼쪽 아래, 왼쪽 위.

따라서 시계 방향으로 함수 호출은 다음과 같아야합니다.

ST_GeomFromText('POLYGON((ulx uly, urx ury, lrx lry, llx llr, ulx uly))', <srid>)

또는 시계 반대 방향 :

ST_GeomFromText('POLYGON((ulx uly, llx llr, lrx lry, urx ury, ulx uly))', <srid>)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.