QGIS, Postgis : 형상 유형이 열 유형과 일치하지 않습니다


30

SPIT를 통해 일부 다각형 shapefile을 QGIS의 Postgis로 가져 오려고합니다. 그중 하나를 가져올 수 없으며이 오류를 반환합니다.

ERROR: Geometry type (Polygon) does not match column type (MultiPolygon)

SPIT widnow의 해당 테이블에서 "Feature Class"속성을 MULTIPOLYGON에서 POLYGON으로 변경하려고 시도했지만 아무 일도 일어나지 않았습니다.

Postgis가 두 유형 (폴리곤 및 멀티 폴리곤)을 모두 수용 할 수있는 방법이 있습니까? 아니면 어떻게 든 shapefile 지오메트리를 다각형에서 다중 다각형으로 변환 할 수 있습니까? 어떤 아이디어?

Windows에서는 Qgis 2.0.1을, ArchLinux에서는 Qgis 2.3을 사용해 보았습니다.

답변:


14

침은 유지되지 않으며 더 이상 권장되지 않습니다. 처리 툴박스를 사용하고 "PostGIS로 가져 오기"알고리즘을 선택하는 것이 좋습니다. 나는 그 루틴을 사용하여 훨씬 더 운이 있었다. 몇 가지 참고할 사항 :

  • 데이터베이스 (연결 이름) 매개 변수는 "PostGIS 레이어 추가"대화창에서 데이터베이스 연결 이름을 지정한 것과 일치해야합니다.
  • 스키마가 이미 존재해야합니다. 자동으로 생성되지 않습니다

완벽하게 작동합니다. 감사. 또한이 shapefile을 DB Manager로로드했습니다. 먼저 SPIT에서 Multipolygon으로 다른 레이어를로드 한 다음 DBM의 POLYGON 레이어로 덮어 썼습니다 (레이어 / 파일 가져 오기). 작동합니다.
dmh126

데이터베이스가 표시되지 않습니다 (Windows의 QGIS 2.10에서 동일한 이름을 사용하더라도)
Menelaos Kotsollaris

19

이 문제는 해결되지 않는 알려진 문제인 것 같습니다. http://hub.qgis.org/issues/5328 참조

해결 방법이 필요한 경우 테이블의 지오메트리 열 유형을 일반 '형상'으로 변경하십시오.

ALTER TABLE my_table ALTER COLUMN geom SET DATA TYPE geometry;

가져 오기를 완료하면 다음으로 되돌릴 수 있습니다 MultiPolygon.

ALTER TABLE my_table ALTER COLUMN geom 
    SET DATA TYPE geometry(MultiPolygon) USING ST_Multi(geom);

또는 ogr2ogr을 사용하여 데이터를로드하십시오 .


귀하의 답변 @dbaston을 upvoting. 내 것보다 낫다. :)
sfletche

19

ogr2ogr을 사용하여 모양 파일을 PostGIS 데이터베이스로 자동 수집합니다. 특히 질문과 관련하여 다음 옵션을 사용하십시오.

-nlt PROMOTE_TO_MULTI

이것은 ogr2ogr이 오류를 피하면서 POLYGON 지오메트리를 MULTIPOLYGON으로 승격 시키도록합니다. 매우 간단한 예 :

ogr2ogr -f "PostgreSQL" PG:"dbname='<my_db>'" -nlt PROMOTE_TO_MULTI <shapefile>

pgsql 호스트 / 인증 세부 정보를 생략했습니다. 여러 shapefile을 일괄 처리하려면 다음과 같은 작업을 수행하십시오.

find ./ -name *.shp | xargs -n1 ogr2ogr <ogr2ogr args omitting the shapefile>

이것은 작동하며 다른 답변보다 쉽습니다. 공감할 가치가 있습니다.
Joe Germuska

5

"PostGis로 가져 오기"알고리즘으로 해결하려고했지만 성공하지 못했습니다 (데이터베이스가 목록에 표시되지 않았습니다-QGIS 2.10을 사용하고 있습니다).

대신 shp2pgsql을 사용 했는데 아래에서 설명하는 간단한 명령 프롬프트 작업이었습니다.

  • 열기 명령 프롬프트 ( 관리자 권한으로 )
  • 다음과 같은 PostgreSQL / bin 폴더로 이동하십시오. C:\Program Files\PostgreSQL\9.4\bin>
  • .shp파일을이 디렉토리에 복사하여 붙여 넣기 만하면 됩니다. (폴더 전체를 파일로 복사했습니다 .shp.
  • 명령 프롬프트에서 다음을 입력하십시오. shp2pgsql -s 4326 MyShpDir/MySHPFile.shp> MYSQLFile.sql여기서 MyShpDir디렉토리, 4326은 WGS84의 SRID 이므로 다른 SSID를 사용하는 경우 MySHPFile.shp특정 파일 ( MYSQLFile자동으로 생성됨)을 변경하십시오. 변환하려는 모든 파일에 대해이 작업을 수행하십시오. 파일은 현재 디렉토리에 저장됩니다 ( C:\Program Files\PostgreSQL\9.4\bin필자의 경우)

그런 다음 PLSQL 데이터베이스에 SQL 파일을 복사하여 붙여 넣기 만하면됩니다.

또한 멋진 추가 사항 shp2pgsql은 다음 과 같이 명령에 매개 변수를 추가하여 테이블에 인덱스 를 즉시 만들 수 있다는 것입니다 I.

shp2pgsql -s 4326 -I MyShpDir/MySHPFile.shp> MYSQLFile.sql

이익! :)


3

예, 테이블에 다음 제약 조건을 추가하여 PostGIS에 모든 지오메트리 유형 (다각형, 다중 다각형, 점, 선 스트링 등)을 허용하도록 지정할 수 있습니다.

PostGIS 2.x (일반 지오메트리 typemod 사용)

ALTER TABLE my_table ALTER COLUMN geom TYPE geometry(Geometry,4326);

이전 답변 (제약을 사용하는 PostGIS 1.x의 경우)

CONSTRAINT enforce_geometry_type CHECK (geometrytype(geom) = 'MULTIPOLYGON'::text OR geometrytype(geom) = 'POLYGON'::text OR geom IS NULL)

CONSTRAINT에 또는 근처에 구문 오류가 있습니다. SET CONSTRAINTS를 시도했지만 CHECK 근처에서 동일한 오류가 발생했습니다.
dmh126

어떤 버전의 postgi를 사용하고 있습니까?
sfletche

PostgreSQL 9.3 용 Postgis 2.1
dmh126

enforce_geotype_geom보다는을 사용해보십시오 enforce_geometry_type. 작동하는지 알려 주시면 가능하면 답변을 수정하겠습니다.
sfletche

작동하지 않습니다. 같은 오류입니다.
dmh126

2

'PostGIS로 가져 오기'알고리즘 솔루션을 시도했지만 작동하지 않는 것으로 나타났습니다. 내가 찾은 가장 쉬운 해결책은 데이터베이스 > DB 관리자 로 이동하여 데이터베이스로 이동 한 다음 레이어 / 파일 가져 오기 (아래쪽 화살표) 버튼을 클릭하는 것입니다.

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