PostGIS의 링 자체 교차점


10

이것은 이전의 질문 에 대한 후속 조치입니다 . 내가 새로운 PostGIS 사용자임을 알 수 있습니다.

데이터에서 토폴로지의 유효성을 살펴보고 랜드 커버 (폴리곤) 데이터 세트에서 약 1700 개의 토폴로지 문제를 발견했습니다. 이것들은 모두 "Ring Self_intersection"입니다.

Paul Ramsay (20 페이지) 의이 프레젠테이션 에서 유용한 정보를 사용하여 그에 따라 데이터를 버퍼링하려고 시도했습니다.

업데이트 schema.data SET the_geom = buffer (the_geom, 0.0) 여기서 isvalid (the_geom) = false 및 isvalid (buffer (the_geom, 0.0)) = true;

그러나 나는 대답을 얻습니다.

주의 사항 : 링 자체 교차점 또는 근처에서 링 자체 교차점 (편집 됨) 오류 : "sgm_buffer"관계의 새 행이 점검 제한 조건 "enforce_geotype_the_geom"을 위반합니다.

********** 오류 **********

오류 : "sgm_buffer"관계에 대한 새 행이 점검 제한 조건 "enforce_geotype_the_geom"을 위반합니다. SQL 상태 : 23514

나는 또한 시도했다 :

업데이트 csgn.sgm_buffer SET the_geom = buffer (the_geom, 0.0)

그리고 얻다:

오류 : "sgm_buffer"관계에 대한 새 행이 점검 제한 조건 "enforce_geotype_the_geom"을 위반합니다.

********** 오류 **********

오류 : "sgm_buffer"관계에 대한 새 행이 점검 제한 조건 "enforce_geotype_the_geom"을 위반합니다. SQL 상태 : 23514

그렇다면이 버퍼 기술이 내 문제에서 작동하지 않는다고 가정합니까? 아니면 내가 잘못하고 있습니까?

램지 씨는 같은 문서에서 "8의 다각형 그림"을 다루는 추가 기술을 제안하기 위해 계속합니다. 나는 이것을 코드로 작성하는 방법 (또는 그것이하는 일과 그것이 나를 도울 것인지)을 완전히 이해하지 못한다.

ST_BuildArea (ST_Union ( 'LINESTRING EMPTY', ST_ExteriorRing ( 'POLYGON ((...))')을 선택하십시오.

그래서 .. 누구든지 도울 수 있습니까? 이것은 PostGIS의 제한된 시간표와 제한된 기술로 진정한 악몽을 증명합니다.


1
"sgm_buffer limit 1에서 select geometry_type (the_geom)"은 무엇을 반환합니까? 또한 다른 질문에서 언급 된 40 시간의 런타임과 관련하여 테이블에 공간 인덱스가 정의되어 있습니까?
diciu

ST_Multi()모든 다각형을 MULTIPOLYGONs로 설정 해야 할 수도 있습니다 (이것은 가정 임)
Mike T

의견 주셔서 감사합니다 -diciu 인덱스가 있다고 생각합니다 .pgAdminIII에서 볼 수있는 것처럼 보이지만 새로 고쳐야합니까? 쿼리 속도를 높이기위한 솔루션을 찾는 것과 관련이 있습니다. 적절한 실행 시간이 얼마인지 모르겠습니다. 랜드 커버에는 약 2 천만 개의 기능이 있습니다.
ESRIHelp

답변:


12

무슨 일이 일어나고 있다고 생각하면 자체 교차 다각형이 버퍼링 할 때 MULTIPOLYGONS가됩니다.

두 가지 옵션이 있습니다.

1 "enforce_geotype_the_geom"제약 조건을 제거하면 pgAdmin
2에서 이전을 업데이트하는 대신 결과를 새 테이블에 넣을 수 있습니다. 원래 테이블에서 아무것도 변경하지 않기 때문에 종종 작업을 수행하는 좋은 방법입니다. 쿼리는 다음과 같습니다.

CREATE TABLE new_buffered_table as
SELECT ST_Buffer(the_geom,0.0) as the_geom, gid FROM original_table;

물론 새 테이블에 더 많은 필드를 가져올 수도 있습니다.

버퍼 트릭을 먼저 시도하십시오. 두 번째 접근 방식에서 Paul은 빈 줄 문자열에 어떤 영향을 미치는지 자신에게 말할 수 있습니다. 나는 그 마술이 어떻게 일어나는지 기억하지 못한다.


0

몇 달 전에 같은 문제가있었습니다. 데이터베이스에 자체 교차로가 많은 다각형이 있습니다. Niklas Aven의 방법을 사용했지만 작동하지 않았습니다. 다른 방법도 사용했습니다.

내 방법은 내 다각형에서 자기 교차를 제거하는 것입니다. 내가 사용한 SQL 쿼리는 다음과 같습니다.

     -- Create the new polygons 

SELECT ST_GeomFromText(polygone) as geom

   from (

    SELECT st_astext(ST_MakePolygon(linear)) as polygone

        from (
              SELECT st_astext
                ((ST_dump
                   (st_boundary
                      (ST_MakeValid
                     (ST_Transform
                        (ST_SETSRID
                           (geometry,4326),32631))))).geom) 
                          as linear from tables_name)
        as query2)

  as query1

where ST_area(polygone) > 1

다각형과 자기 교차 영역의 면적을 계산했으며 자기 교차 영역 1이 매우 작기 때문에 면적이 1보다 큰 다각형 만 유지합니다 . 또한 데이터가도 단위 인 경우 SRID를 미터로 변환하는 것이 중요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.