ogr2ogr을 사용하여 shapegi를 postgis로 가져옵니다. 데이터 소스를 열 수 없습니다


13

postgis 데이터베이스에서 shapefile을 가져 오기 위해 ogr2ogr을 사용하고 싶습니다. ogr2ogr을 성공적으로 설치했으며 pgsql에서 다음 명령을 실행합니다.

ogr2ogr -f "PostgreSQL" PG:"host=localhost user=user_1 password=***** dbname=imports" world_boundaries.shp

내가 얻는 것은 오류 메시지입니다.

Unable to open datasource `world_boundaries.shp' with the following drivers: --a list of drivers follows (ESRI Shape File etc.)

또한 shapefile의 전체 경로를 정의하려고 시도했지만 동일한 메시지가 나타납니다.

또한 나는 다음을 실행하려고 시도했다.

ogrinfo world_boundaries.shp

같은 것.


파일 권한 문제를 해결 한 후 다음 오류가 발생합니다.

  ERROR 1: AddGeometryColumn failed for layer world_boundaries, layer creation has failed.
  ERROR 1: Terminating translation prematurely after failed
  translation of layer world_boundaries (use -skipfailures to skip errors)

또한 GUI shp2pgsql을 통해 가져 오려고했는데 다음 오류가 발생합니다.

ALTER TABLE "public".""
Failed in pgui_exec(): ERROR:  permission denied for relation spatial_ref_sys
 CONTEXT:  SQL statement "SELECT SRID         FROM spatial_ref_sys WHERE SRID = new_srid"
PL/pgSQL function addgeometrycolumn(character varying,character   varying,character varying,character varying,integer,character varying,integer,boolean) line 50 at SQL statement
 SQL statement "SELECT AddGeometryColumn('',$1,$2,$3,$4,$5,$6,$7)"
 PL/pgSQL function addgeometrycolumn(character varying,character  varying,character varying,integer,character varying,integer,boolean) line 5 at     SQL statement

Shapefile import failed.

이번 문제는이 데이터베이스 사용자에게 충분한 권한이 없다는 것입니다. 이것은 그것을 고쳤다 :

GRANT ALL ON TABLE spatial_ref_sys TO my_user_name;

다음 오류 메시지는 다음과 같습니다.

  Warning 1: Geometry to be inserted is of type 3D Multi Polygon, whereas the layer geometry type is 3D Polygon.
 Insertion is likely to fail
 ERROR 1: INSERT command for new feature failed.
 ERROR:  Geometry type (MultiPolygon) does not match column type (Polygon)

따라서 매개 변수를 사용해야 할 것 같습니다. -nlt MULTIPOLYGON 그러나 그렇게 할 때 또 다른 오류가 발생합니다.

ERROR 1: PostgreSQL driver doesn't currently support database creation.
Please create database with the `createdb' command.
PostgreSQL driver failed to create PG:host=localhost user=my_user_name dbname=my_database password=password -nlt POLYGON

그러나 shp2pgsql GUI를 사용하여로드됩니다.


@elrobis의 댓글이 마침내 작동했습니다. DB에 데이터가 올바르게로드되었습니다!

ogr2ogr -f "PostgreSQL" PG:"host=localhost user=geonode dbname=geonode_imports password=geonode" -nlt GEOMETRY wld_bnd_adm0_gaul_2015.shp

셰이프 파일이 유효하지 않은 것 같습니다. 다른 소프트웨어에서도 작동합니까?
Evil Genius

1
예. QGIS에 올바르게로드되었습니다.
user1919

1
또한 DB가 이미 존재하고 ogr2ogr 명령에서 철자가 정확하고 명령의 postgres 사용자에게 필요한 권한 (SELECT, INSERT, UPDATE, CREATE 등)이 모두 있다고 가정하면 -nln layername인수를 추가하십시오 . 아마 -overwrite그것이 생명에 관한 것인지를보기 위해 아마 함께 . 또한 내가 당신이라면, 나는 sudo권한과 특권을 배제하기 위해 supergres 인 postgres 수퍼 유저와 함께 ogr2ogr을 실행 합니다. 스크립트가 확실 해지면 성가신 권한과 특권을 얻을 수 있습니다. :)
elrobis

3
감사. -nlt POLYGON 대신 -nlt GEOMETRY를 추가하면 트릭을 수행했습니다.
user1919

1
다행이다. 나는 왜 그것이 효과가 있다고 생각하는지에 대한 답변으로 적절한 대응을 할 것입니다.
elrobis

답변:


17

시행 착오로 발견 한대로 해결해야 할 잔소리 문제가 거의 없었으며, 마지막 문제는 ogr2ogr의 -nlt GEOMETRY* 인수를 사용하여 해결되었습니다 .

* @LeeHachadoorian의 의견에서 권장 사항은 보조 혜택 외에도 모범 사례를 장려 -nlt PROMOTE_TO_MULTI하기 때문에 대신 기본 솔루션으로 사용됩니다 nlt GEOMETRY.

사용자 권한 및 오류 메시지

첫째, ogr2ogr에서 shapefile을 열 수 없었으며 권한 문제가 실제로 shapefile에 액세스하는 OS 사용자에게 영향을 미치고 있음을 깨달았습니다. 그러나 다른 사람들에게 중요한 교훈이 있습니다. 특히 ogr2ogr의 오류 메시지는이 시점에서 오도되었습니다! 실제로, 첫 번째 주석가 중 하나는 shapefile이 유효하지 않다고 생각했으며, 필자의 첫 번째 추측은 경로 / 파일 이름에 오류 / 오타가 있거나 파일 경로에 틀린 문자가있을 수 있다는 것입니다. 공간-모양 파일을 가리키는 ogr2ogr의 기능을 손상 시켰습니다. 알다시피, 실제로는 사용자 권한 문제 일뿐입니다. 오류 메시지가 빨간색 청어를 생성하기 때문에 다른 사람들이 자신의 마음을 사로 잡아야 할 가능성이 있습니다. :)

SQL 사용자 권한 및 미스터리 실패

나는 두 번째 오류로 잠시 멈췄을 것입니다. 그러나 똑똑한 다른 가져 오기 유틸리티 (shp2pgsql)를 사용하여 SQL 사용자를 테스트하면보다 정확한 오류 메시지가 표시되고 SQL 사용자에게 spatial_ref_sys테이블 에 대한 필요한 권한을 부여했습니다 . 따라서 ogr2ogr 가져 오기 명령이 제대로 작동하지 못하는 사람은 SQL 사용자에게 데이터베이스 자체 'spatial_ref_sys'테이블 모두에 대해 충분한 권한이 있는지 확인해야 합니다.

혼합 지오메트리 유형 및 모범 사례

마지막으로 발생한 장애물은 모양 파일을 사용하여 단일 및 다중 부분 형상이 동일한 데이터 세트 / 파일에 공존 할 수 있다는 사실과 관련이있는 것 같습니다. 동일한 피처 유형의 단일 / 여러 부분에 대해서도 동일한 테이블에서 지오메트리 유형을 혼합하는 것은 좋지 않은 것으로 간주되며 기본적으로 툴체인의 오픈 소스 플레이어는 지오메트리 유형을 혼합하지 못하도록 보호합니다. 그러나 다행히도 몇 가지 옵션을 제공합니다. 처음에는 ogr2ogr 명령어 에서 -nlt GEOMETRY* 인수를 설정하는 것이 좋습니다 . ESRI의 느슨한 규칙에도 불구하고 다각형 데이터 세트를 가져올 수 있습니다. 그러나 이것은 아마도 테이블에 단일 부품 및 다중 부품 형상이 있고 나중에 다른 두통을 유발할 수 있음을 의미합니다!

ogr2ogr에는 -nlt고려해야 할 다른 옵션, 즉 PROMOTE_TO_MULTI. 문서 를 인용하려면 ..

GDAL 1.10부터 PROMOTE_TO_MULTI를 사용하여 다각형 또는 다중 다각형을 혼합하는 레이어를 다중 다각형으로 승격시키고, 선 스트링 또는 다중 라인 문자열을 다중 선 스트링으로 혼합하는 레이어를 자동으로 승격시킬 수 있습니다. 형상 파일을 PostGIS 및 지오메트리 유형에 대한 엄격한 검사를 구현하는 다른 대상 드라이버로 변환 할 때 유용 할 수 있습니다.

즉, PROMOTE_TO_MULTI플래그 를 사용하면 모든 기능이 단일 부품으로 구성되어 있어도 모든 기능이 다중 부품 기능으로 변환됩니다. 의견에 @LeeHachadoorian이 언급했듯이 (그리고 대부분 동의 할 것입니다) 모범 사례를 준수하여 테이블의 기능 기하학을 통합하여 PROMOTE_TO_MULTI느슨한 GEOMETRY플래그 보다 선호하는 것이 좋습니다 . 기본적으로 작성하는 모든 코드는 여러 부분으로 구성된 기하학적 구조를 기대해야합니다. 분명히 이것은 더 깨끗하고 일부 개발을 단순화 할 수 있습니다.

SHP를 통해 POST 가져 오기에 문제가있는 사람에 대한 일반적인 조언

  1. 경로에 펑키 문자가없고 경로 나 파일 이름에 오타 나 철자가 틀리지 않아야합니다.
  2. @ user1919가 발견 한대로 OS 사용자에게 shapefile에 액세스 할 수있는 충분한 권한이 있는지 확인하십시오! 시연 한 것처럼 QGIS와 같은 다른 소프트웨어에서 쉐이프 파일을 열어 보는 것이 도움이 될 수 있습니다. 한 소프트웨어에서 작동하면 손상되지 않으며 다른 소프트웨어에서도 작동해야합니다.

처음에는 sudo스크립트가 의도 한대로 작동하는지 알 때까지 권한 문제를 배제 하기 위해 ogr2ogr 명령을 실행하는 것이 좋습니다.

  1. 또한 @ user1919가 인식 한 것처럼 SQL 사용자에게 스크립트가 대상으로하는 데이터베이스와 spatial_ref_sys테이블 에 대한 충분한 권한이 있는지 확인하십시오 .

다시, 처음에는 스크립트가 작동 할 때까지 PostGRESql 수퍼 유저를 사용하여 SQL 권한 문제를 배제하는 것을 고려하십시오. 스크립트가 수퍼 유저와 함께 작동하고 선호하는 자동화 사용자로 실패하면 데이터 나 환경 (gdal / ogr 설치 등)이 아니라 SQL 사용자와 관련된 문제임을 알 수 있습니다.

  1. -nlt플래그를 PROMOTE_TO_MULTI또는로 설정하십시오 GEOMETRY. 쉐이프 파일은 더 느슨한 피처 타입 규칙을 허용하기 때문에 때로는 오픈 소스 유틸리티가 더 수용하도록 지시해야합니다 :)

  2. 당신이 PostgreSQL을하거나 MySQL로 가져 오는 경우, 설정하려고 -lco PRECISION=no내가 정확히이 인수가 무엇을 이해하지 못하고, ..fair 경고를하지만, 여기에 내가 경험했던거야 ... 당신도 알다시피, 모양 파일은 종종 포함 SHAPE_LENGTH하고 SHAPE_AREA필드, 그리고 '수수께끼 오류가 발생했을 때 가끔 나타났습니다. 해당 필드를 삭제하면 데이터를 올바르게 가져올 수 있습니다. 그러나를 사용하면 -lco PRECISION=no해당 필드를 삭제하지 않고도 데이터를 가져올 수 있습니다. 이 매개 변수를 문제 해결 단계로 사용하는 것이 좋지만 프로덕션 솔루션에서 가져 오기를 수락하기 전에 실제로 해결되는 문제를 이해하는 것이 좋습니다.

  3. 마지막으로, MySQL을 사용하는 경우 매우 큰 기능 구조가 MySQL의 max_allowed_packet매개 변수를 손상시킬 수 있습니다 . 이에 대한 자세한 내용 은 MySQL 드라이버 설명서를 참조하십시오. 그러나 해결책은 기본값보다 큰 값을 허용하도록 MySQL 구성을 변경하는 것입니다.

ogr2ogr의 PostGIS Import 명령에 대한 SHP 예

여기를 돌아 다니는 초보자를 위해, 이것은 대부분의 SHP to Post 수입품이 ogr2ogr을 사용하는 것처럼 보입니다. 파일 경로 / 이름을 따옴표로 묶으면 터미널의 공백, 이상한 문자 및 줄 바꿈을 방지 할 수 있습니다. 또한 지오메트리 이름 필드에 대한 재정의 외에도 FID 필드 및 레이어 이름 :

ogr2ogr -f "PostgreSQL" "PG:host=127.0.0.1 user=myuser dbname=mydb password=mypassw0rd" "C:/path/to/some_shapefile.shp" -lco GEOMETRY_NAME=the_geom -lco FID=gid -lco PRECISION=no -nlt PROMOTE_TO_MULTI -nln new_layername -overwrite


3
에 관해서는 -nlt PROMOTE_TO_MULTI, 이것은 실제로 다각형 지오메트리에 대한 최상의 방법입니다. 신중하게 고려한 후에 만 ​​위반하도록 강력한 기본 선택으로 조언하도록 답변을 변경하는 것이 좋습니다. 또한 geometry사용자 / 개발자가 수행중인 작업을 실제로 알고 있고 다각형, 선 및 점 유형을 혼합 해야하는 경우가 아니라면 혼합 다각형 / 다중 다각형을 처리하기 위해 일반 유형을 사용 하지 않는 것이 좋습니다.
Lee Hachadoorian

1
@LeeHachadoorian은 동의했다. 권장대로 답변을 편집했습니다. 내 방어에서, PROMOTE_TO_MULTI이 모든 것을 시작할 때 사용할 수 있었던 원래 솔루션을 여전히 기본값으로 사용하는 새로운 기능 (GDAL 1.10)이 있습니다. :) .. 모든 공정성에서 shapefile은 단일 및 다중 부분 유형 만 결합하므로 ogr2ogr이 shp를 밀어 -nlt GEOMETRY포인트, 선 폴리가 있는 테이블을 작성 하는 시나리오는 절대 없습니다. :))))) 그러나 나는 그 문제에 대한 당신의 입장에 전적으로 동의합니다.
elrobis

1
셰이프 파일은 다각형 유형에 여러 다각형을 허용합니다. 그들은 MultiPolygon 타입도 가지고 있지 않습니다. 따라서 이런 종류의 모양 파일을 만났을 때에도이 -nlt PROMOTE_TO_MULTI작업을 수행해야합니다.
CMCDragonkai
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.