유효하지 않은 지오메트리의 의미는 무엇입니까


15

Postgis 데이터베이스에서 일부 데이터를 가져 왔고 일부 형상이 유효하지 않은 것으로보고되었습니다 (ST_IsValidReason은 자체 교차점 또는 링 자체 교차점을보고합니다).

내가 수행하는 쿼리는 이러한 기하학의 잘못된 측면의 영향을받지 않습니다 (ST_Distance 쿼리 만 사용하고 있습니다).

도형이 유효하지 않을 때 깨지는 것은 무엇입니까?

이러한 형상을 "자동으로"(buffer (geom, 0) 또는 ST_SimplifyPreserveTopology (geom, 0.0001)) 수정하는 것이 옵션입니까?

답변:


19

언제 어디서 오류가 발생하는지 예측할 수 없으므로 잘못된 데이터를 유지하는 것은 좋지 않습니다. 또한 잘못된 형식의 데이터는 가장 악의적이고 현명한 유형의 버그 인 Heisenbugs 를 유발할 수 있습니다 .

유효하지 않은 지오메트리 저장 결과에 대해 논의하는 것은 의미가 없다고 생각합니다. 그렇게 말하면 결과는 다음과 같습니다.

  • 잘못된 결과 (즉, ST_Distance부정확하거나 명백한 잘못된 수치를 반환 함)
  • 데이터베이스 성능 문제 : 잘못된 데이터를 유지하면 데이터베이스 성능이 심각하게 손상되어 큰 로그 파일이 생성 될 수 있습니다. 모든 함수 호출은 오류를 로그에 기록하고 일반 데이터베이스 작업을 방해하기 때문입니다.
  • 데이터베이스 충돌
  • 응용 프로그램 충돌-데이터베이스에서 잘못된 데이터를 받거나 부적합한 결과 (예 : 음수 거리)를 수신하여 발생합니다.
  • 팬텀 동작 (위 링크 참조). 이것은 모두의 최악의 결과입니다. 이상한 일이 생길 것입니다. 속도 저하, 데이터 손실, 충돌, 불합리한 결과, 일시 중지, 응답 없음 및 기타 여러 가지 저주. 그것들은 모든 문서에서 "정의되지 않은"범주에 속하기 때문에 그것들을 발견하거나 재생산하지 못할 수도 있습니다.

내 충고-작은 버퍼가 데이터 일관성에 크게 해를 끼치 지 않으면 위의 사항이 발생하지 않도록 버퍼를 사용하십시오. 데이터를 유효하게 유지하십시오.


작은 버퍼 사용에 대해 좀 더 자세히 설명해 주시겠습니까? 어떻게해야합니까?
diciu

1
ST_Buffer(the_geom, 0.0000001)자기 교차로에 대한 트릭을 할 수 있습니다. 약간 더 큰 형상의 결과가 심각하지 않은 경우에만 사용하십시오.
Adam Matan

1
내 경험은 잘못된 데이터를 수정하는 것이 상당히 조사 적이라는 것이다. 그러나 시간이 많이 걸리더라도 일반적으로 노력할 가치가 있습니다. ST_Buffer(the_geom, 0.0000001)트릭은 확실히 많은 도움이됩니다.
Chau

문제는 ST_Buffer가 지오메트리를 수정하지만 결과는 실제로 예상 한 것이 아닙니다.이 잘못된 다각형의 경우 ( openstreetmap.org/browse/way/51954364 ) ST_Buffer는 왼쪽 상단 사각형 만 반환합니다. ST_SimplifyPreserveTopology가 필요한 것에 더 가깝습니다 (유효한 형상이지만 가능하면 유효하지 않은 원본에 가깝습니다). ST_SimplifyPreserveTopology를 사용하는 데 단점이 있습니까?
diciu

이 지오메트리는 MULTIPOLYGON단일이 아닌 두 개의 다각형 중 하나로 처리되어야합니다 POLYGON. 가능하면 원래 WKT를 받으십시오.
Adam Matan

13

먼저 잘못된 형상이 데이터베이스에 입력되는 것을 방지 할 수 있습니다. PostgreSQL / PostGIS 사용자의 경우 이는 점검 제한 조건으로 간단합니다 . 예를 들어, public.my_valid_table다각형 기하학 열이 있는 테이블 을 고려할 geom경우 다음 SQL / DDL을 사용하십시오.

ALTER TABLE public.my_valid_table
  ADD CONSTRAINT enforce_valid_geom CHECK (st_isvalid(geom));

참고 :이 테이블에는 구속 조건을 적용하기 전에 유효한 다각형이 있어야합니다.

그런 다음 잘못된 형상을 삽입 / 추가하려고하면 오류가 표시됩니다.

ERROR:  new row for relation "my_valid_table" violates check constraint "enforce_valid_geom"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.