PostGIS 다각형 지오메트리 도움말-닫히지 않은 링


10

Erik Westra ( Amazon link )의 'Python Geospatial Development'라는 책을 집어 들고 작업 중입니다. 현재 지리 공간 웹 앱을 구축하기 위해 셰이프 파일에서 PostGIS 데이터베이스로 GSHHS 해안선 데이터를로드하는 방법을 가르치고 있습니다.

내 문제는 이것입니다 : GSHHS 데이터를 PostGIS로 가져 오려고하면 해안선 다각형이 '유효한'것으로 간주되지 않기 때문에 거부됩니다. 구체적으로, 해안선 폴리곤의 일부 (모두는 아님)를 '비 폐쇄 링'으로 설명하는 오류 메시지가 표시됩니다.

이 오류는 다각형의 첫 번째 점과 마지막 점이 동일하지 않다는 것을 알려줍니다. 그러나 이것은 사실이 아닙니다. 많은 다각형의 WKT 표현을 살펴 보았으며 올바른 것입니다. 그들은 분명히 동일한 좌표로 시작하고 끝납니다.

다각형은 OGR 라이브러리를 사용하여 쉐이프 파일에서 추출되고 각 다각형 피처를 WKT로 내 보냅니다. Shapely를 통해 다각형을 재구성하려고 시도하고 WKB를 실험했지만 아무 소용이 없습니다. 나는 shp2pgsql 로더를 사용하여 다중 테이블로 PostGIS와에 동일한 데이터를로드 할 수 있었다.

: 내가 거기했다 밖으로 누구 경우 궁금 해서요
(a)는 아마 같은 문제에 붙어있어, 같은 책을 사용하고, 나에게 답이있다?
(ᄂ) 비슷한 문제가 발생하여 해결책을 찾았습니까?
(c) 실패하면 PostGIS에로드하기 전에 유효한 지오메트리를 보장하기위한 '모범 사례'조언이 있습니까?

업데이트 : 동료는 '닫히지 않은 고리'문제가 다른 문제의 증상 일 수 있다고 제안했습니다. PostGIS / PostgreSQL 구성에 크기 제한 (삽입 트랜잭션, 수신 패킷, 텍스트 문자열 등)이있을 수 있습니다.

매우 긴 WKT 다각형을 입력으로 사용하고 있으므로 PostGIS가 너무 빨리 절단하여 각 다각형을 완성 할 수 없습니다. 나는 내일 그것을 시험 할 것이다. 그러나 그것은 아마 들린다. 국가 테두리를 삽입하면 일부 레코드 만 허용하고 다른 레코드 는 허용 하지 않았습니다. 기억 상으로, 받아 들여진 기하학은 앤티가와 같은 작은 섬 국가를위한 것이었다 (아마도 WKT 표현이 짧았다).

따라서 이것은 잘못된 지오메트리 스레드가 아닌 PostGIS 데이터베이스 관리 스레드가 될 수 있습니다.


샘플 shp 파일을 제공 할 수 있습니까?
Mario Miler

내가 사용하는 GSHHS 해안선 데이터는 여기 에서 96MB 다운로드입니다 . 내가 사용하는 세계 국경 데이터는 thematicmapping.org
timmy

답변:


6

나는 당신의 데이터와 책 예제를 보았습니다. 문제는 책에서 처리되는 데이터에 잘못된 다각형이 세 개 있다는 것입니다.

GSHHS_l_L1.shp

ID = 92-W

POLYGON ((-180.0 71.514793999999995,-179.69008299999999 71.577888999999999,-178.648889 71.577416999999997,-178.40644399999999 71.549916999999994,-177.406306 71.244167000000004,-177.877444 71.022889000000006,-179.500111 70.863749999999996,-179.93011100000001 70.979583000000005,-180.0 70.962072000000006))

ID = 486-W

POLYGON ((-180.0 -16.799126,-179.84419399999999 -16.691278,-179.80041700000001 -16.789193999999998,-179.850472 -16.878361000000002,-180.0 -16.959561))

GSHHS_l_L2.shp

ID = 7333-W

POLYGON ((-180.0 65.393473,-179.76583299999999 65.428332999999995,-179.95416700000001 65.385555999999994,-179.90972199999999 65.316389,-180.0 65.321635))

이것은 예제이므로 데이터 세트에서 해당 다각형을 삭제하거나 코드에 if 문을 추가하는 것이 가장 쉽습니다.

if geometry.IsValid():
       cursor.execute("INSERT INTO gshhs (level, geom) VALUES (%s, ST_GeomFromText(%s, 4326))", (level, wkt))

고마워 마리오, 모든 입력 다각형을 올바르게 확인하는 대신 나보다 앞서 가고있는 것 같습니다. 귀하의 답변이 정확했습니다.이 다각형은 OGR로 테스트했을 때 유효하지 않은 것으로 나타났습니다. 흥미롭게도 QGis에서는 잘 보였지만 ArcMap은 완전한 링이 부족한 것으로 나타났습니다. 이 세 다각형은 모두 날짜 표시 줄에 있었고 모양 파일 지오메트리는 날짜 표시 줄을 따라 다각형 가장자리를 계산하지 않았다고 생각합니다. 솔루션은 유효하지 않은 다각형을 감지 할 수있는 훌륭하고 쉬운 방법입니다. 게시물을 답변으로 표시하겠습니다.
timmy

당신이 자선 기분 경우하는 프로세스의 다음 단계를위한 좋은 솔루션이 어떻게 수정 잘못된 다각형을? OGR의 .CloseRing () 함수를 사용해 보았지만 아무 소용이 없습니다. 그것은 단순히 함수 호출을 무시했다고 생각합니다.
timmy

"버퍼 트릭"( workshops.opengeo.org/postgis-intro/validity.html )을 매끄럽고 ogr로 사용했지만 성공하지 못했습니다. 모양이 잘못된 다각형을 읽지 못하고 ogr이 버퍼 작업을 수행하지 않습니다. 현재는 이유를 모르겠습니다. 답을 우연히 발견하면 알려 드리겠습니다. 다른 사람 이이 문제로 더 성공했을 수도 있습니다. 죄송합니다.
Mario Miler

다각형 유효성 검사가 지금 작동하고 있다고 생각합니다. OGR의 .CloseRings () 함수를 잘못 사용하고 있다고 생각합니다. 폴리곤의 메소드 (예 : poly.CloseRings ())라고합니다. 대신 다각형에서 선형 링을 추출한 다음이를 실행해야했습니다 (예 : lr = poly.GetGeometryRef (0); lr.CloseRings ()). 결과는 PostGIS에 성공적으로 삽입되었으며 QGis witj에서 3 개의 문제 다각형을 사용할 수 있습니다. 모든 다각형의 유효성을 검사하는 데 약간의 계산 비용이 있습니다.
timmy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.