QGIS에서 Python 스크립트를 통해 Shapefile을 PostGIS로 내보내기

Sep 28 2020

이 질문을 StackOverFlow에 게시했으며 여기에 게시하는 것이 좋습니다.

QGIS에서 Python 스크립트를 통해 셰이프 파일을 PostGIS로 내보내고 싶습니다. Windows 10에서 QGIS 3.10, PostgreSQL 10 및 PostGIS 2.5를 사용하고 있습니다 qgis:importintopostgis. 사용을 시도했습니다 .

import processing
processing.run("qgis:importintopostgis",{
                'INPUT': 'unioncrs',
                'DATABASE': "HistoPG",
                'SCHEMA': "public",
                'TABLENAME': "testunion",
                'PRIMARY_KEY': "Nummer"
                })

그러면 오류 메시지가 생성됩니다.

".... 알고리즘을 실행하는 동안 오류가 발생했습니다."

흥미롭게도 .NET의 GUI처럼 보이는 DB 관리자와 함께 작동합니다 qgis:importintopostgis.

내가 볼 수있는 차이점은 소스 및 대상 SRID입니다. 이 매개 변수를 qgis : importintopostgis에 입력하는 방법을 모르겠습니다. 또한 데이터베이스에 사용자 이름과 암호를 입력 할 필요가 없는지 확실하지 않지만 qgis:importintopostgis.

나는 또한`gdal : importvectorintopostgisdatabaseavailableconnections :

processing.run("gdal:importvectorintopostgisdatabaseavailableconnections",{
                'DATABASE': "HistoPG",
                'INPUT': 'C:/QGIS/Vers1/Results/unioncrs.shp',
                'GTYPE': 0,
                'SCHEMA': "public",
                'TABLE': "testunion"
                })

이는 오류 메시지없이 실행되지만 테이블을 PostGIS로 가져 오지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? QGIS에서 Python으로 작동하는 방법이 있습니까?

안녕하세요 @Jakob. 작동합니다. 감사합니다.

안녕하세요 @DirkB : 저는 다음을 실행합니다.

PARAMETERS = {'DATABASE':'HistoPG','INPUT':'C:\\QGIS\\Vers1\\Results\\unioncrs.shp', 
'SHAPE_ENCODING':'utf-8','GTYPE':0,'A_SRS':QgsCoordinateReferenceSystem('EPSG:31467'),'T_SRS':None,'S_SRS':None,
    'SCHEMA':'public','TABLE':'testunion','PK':'Nummer','PRIMARY_KEY':'','GEOCOLUMN':'geom','DIM':0,'SIMPLIFY':'',
   'SEGMENTIZE':'','SPAT':None,'CLIP':False,'WHERE':'','GT':'','OVERWRITE':True,'APPEND':False,
    'ADDFIELDS':False,'LAUNDER':False,'INDEX':False,'SKIPFAILURES':False,'PROMOTETOMULTI':True,
    'PRECISION':True,'OPTIONS':''}

processing.run("gdal:importvectorintopostgisdatabaseavailableconnections", PARAMETERS)

그런 다음 다음과 같은 오류 메시지가 나타납니다.

역 추적 (최근 호출 마지막) : 파일 "C : \ PROGRA ~ 2 \ QGIS3 ~ 1.10 \ apps \ Python37 \ lib \ code.py", 행 90, 실행 코드 exec (code, self.locals) 파일 "", 행 1, 파일 "", 줄 98, 파일 "C : /PROGRA~2/QGIS3~1.10/apps/qgis-ltr /./ python / plugins \ processing \ tools \ general.py", 줄 106, 실행 중 return Processing.runAlgorithm (algOrName, parameters, onFinish, feedback, context) File "C : /PROGRA~2/QGIS3~1.10/apps/qgis-ltr /./ python / plugins \ processing \ core \ Processing.py", 줄 181, runAlgorithm에서 QgsProcessingException (msg) _core.QgsProcessingException 발생 : 알고리즘을 실행하는 동안 오류가 발생했습니다.

내 PostGIS 데이터베이스에 테이블을 생성합니다. 그러나 테이블은 비어 있고 'nummer'및 'geom'필드 만 있습니다. 매개 변수 어딘가에 필드를 정의해야합니까? 아니면 이미 필드가있는 테이블에 추가해야합니까?

나는 역사를 찾았습니다. 하지만 DB 관리자를 실행하면 기록되지 않습니다. 벡터 레이어를 PostGIS로 가져올 수있는 다른 플러그인을 찾지 못했습니다. 어떤 것을 언급 했습니까?

이제 처리 도구 상자에서 함수를 찾았습니다. 나는 그것을 성공적으로 실행하고 Python에서 역사의 텍스트를 사용했습니다. 잠시 후 "... 알고리즘을 실행하는 동안 오류가 발생했습니다."라는 오류 메시지가 생성되었지만 테이블을 PostgreSQL로 내보냈습니다. 기능의 수는 정확하고 지금까지 표는 괜찮아 보입니다. 그래서 실제로 무엇이 잘못되었는지 잘 모르겠습니다.

답변

4 Jakob Sep 29 2020 at 14:42

기록을 위해. OSGEO QGIS dist의 QGIS 외부에서 OGR2OGR을 사용하는 Python 함수의 예입니다. 나는 디스크 워크에서 재귀 디렉토리에서 900 개의 shape 파일을 찾고 오류없이 PostGIS에 업로드했습니다. 코드를 단순화하기 위해 중복 테이블 이름을 피하기 위해 일부 GUID 테이블 이름을 제거했습니다.

def upload_to_db(shpfile):
    """
    Uploades shape files to PostgreSQL with org2ogr
    :param shpfile: Shapefile to upload to database
    :return: None
    """

    dbname = 'mydb'
    schema = 'myschema'
    host = 'xx.xx.xxx.xx'
    user = 'myuser'
    password = 'mypw'
    port = '5432'

    tablename = f'{os.path.basename(shpfile)}'

    # https://gdal.org/drivers/vector/pg.html
    command = f"""SET PGCLIENTENCODING=LATIN1 && ogr2ogr -f "PostgreSQL" PG:"host={host} dbname={dbname} user={user} password={password} port={port}" "{shpfile}" -nln {schema}.{tablename} -lco geometry_name=geom -lco precision=NO -nlt promote_to_multi -a_srs epsg:25832"""

    #print(command)
    os.system(command)
4 DirkB. Sep 28 2020 at 16:58

당신은 이미 올바른 길을 가고있었습니다.

pyqgis를 통해 QGIS 3에서 PostGIS로 Shapefile을 내보내려면 다음 코드를 사용할 수 있습니다.

import processing
PARAMETERS = {'DATABASE':'nameofdatabase','INPUT':'C:\\Users\\yourpath\\shapename.shp|layername=shapename',
    'SHAPE_ENCODING':'utf-8','GTYPE':5,'A_SRS':QgsCoordinateReferenceSystem('EPSG:4326'),'T_SRS':None,'S_SRS':None,
    'SCHEMA':'schemaname','TABLE':'filenameinpostgis','PK':'id','PRIMARY_KEY':'','GEOCOLUMN':'geom','DIM':0,'SIMPLIFY':'',
    'SEGMENTIZE':'','SPAT':None,'CLIP':False,'WHERE':'','GT':'','OVERWRITE':True,'APPEND':False,
    'ADDFIELDS':False,'LAUNDER':False,'INDEX':False,'SKIPFAILURES':False,'PROMOTETOMULTI':True,
    'PRECISION':True,'OPTIONS':''}

processing.run("gdal:importvectorintopostgisdatabaseavailableconnections", PARAMETERS)

벡터 레이어를 PostGIS로 가져 오는 플러그인도 있으므로이를 실행 한 다음 히스토리 프로토콜에서 코드를 볼 수 있습니다.

플러그인은 Processing Toolbox "Export to PostgreSQL (사용 가능한 연결)"의 GDAL 플러그인입니다.

플러그인은 다음과 같으며 먼저 이것을 사용하고 실행 된 프로세스의 내역을 확인한 후 코드를 구현하는 것이 더 쉬울 것입니다.

다음은 QGIS 2 QGIS 2.6 문서의 문서 링크입니다.

다음은 QGIS 3 QGIS 3.10 문서에 대한 링크입니다.

코드 :

 'GTYPE': 0

지오메트리 유형 btw가 없음을 의미합니다. 5는 다각형입니다.

더 많은 정보는 매개 변수에 대한 QGIS 2 또는 QGIS 3 문서 링크에 있습니다.