Mengekspor shapefile ke PostGIS melalui skrip Python dari QGIS
Saya memposting pertanyaan ini di StackOverFlow di mana disarankan untuk mempostingnya di sini.
Saya ingin mengekspor shapefile ke PostGIS melalui skrip Python dari QGIS. Saya menggunakan QGIS 3.10, PostgreSQL 10 dan PostGIS 2.5 di Windows 10. Saya mencoba go use qgis:importintopostgis:
import processing
processing.run("qgis:importintopostgis",{
'INPUT': 'unioncrs',
'DATABASE': "HistoPG",
'SCHEMA': "public",
'TABLENAME': "testunion",
'PRIMARY_KEY': "Nummer"
})
Itu menghasilkan pesan kesalahan:
".... Ada kesalahan saat menjalankan algoritme."
Menariknya, ini bekerja dengan Manajer DB, yang tampaknya merupakan GUI qgis:importintopostgis.
Perbedaan yang dapat saya lihat adalah Sumber dan SRID Target. Saya tidak tahu cara memasukkan parameter ini di qgis: importintopostgis. Saya juga tidak yakin apakah saya tidak perlu memasukkan nama pengguna dan kata sandi untuk database, tetapi sekali lagi saya tidak melihat di mana harus memasukkan parameter ini qgis:importintopostgis.
Saya juga mencoba `gdal: importvectorintopostgisdatabaseavailableconnections:
processing.run("gdal:importvectorintopostgisdatabaseavailableconnections",{
'DATABASE': "HistoPG",
'INPUT': 'C:/QGIS/Vers1/Results/unioncrs.shp',
'GTYPE': 0,
'SCHEMA': "public",
'TABLE': "testunion"
})
Itu berjalan tanpa pesan kesalahan tetapi juga tidak mengimpor tabel ke PostGIS. Apa yang saya lakukan salah? Apakah ada metode yang berfungsi dengan Python dari QGIS?
Hai @Job. Itu bekerja. Terima kasih.
Hai @DirkB: Saya menjalankan:
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)
Saya kemudian mendapatkan pesan kesalahan berikut:
Traceback (panggilan terakhir terakhir): File "C: \ PROGRA ~ 2 \ QGIS3 ~ 1.10 \ apps \ Python37 \ lib \ code.py", baris 90, di runcode exec (code, self.locals) File "", baris 1, di File "", baris 98, di File "C: /PROGRA~2/QGIS3~1.10/apps/qgis-ltr /./ python / plugins \ processing \ tools \ general.py", baris 106, sedang dijalankan return Processing.runAlgorithm (algOrName, parameter, onFinish, feedback, konteks) File "C: /PROGRA~2/QGIS3~1.10/apps/qgis-ltr /./ python / plugins \ processing \ core \ Processing.py", baris 181, di runAlgorithm tingkatkan QgsProcessingException (msg) _core.QgsProcessingException: Ada kesalahan saat menjalankan algoritme.
Ini membuat tabel di database PostGIS saya. Tapi tabel kosong dan hanya memiliki field ‚nummer 'dan‚ geom'. Apakah saya harus menentukan bidang di suatu tempat di parameter? Atau apakah saya harus menambahkan ke tabel yang sudah memiliki kolom?
Saya menemukan Sejarah, itu bagus untuk diketahui. Tapi tidak masuk saat saya menjalankan DB Manager. Dan saya tidak menemukan plugin lain untuk mengimpor layer vektor ke PostGIS. Yang mana yang Anda maksud?
Saya menemukan fungsinya sekarang di kotak alat Pemrosesan. Saya berhasil menjalankannya dan menggunakan teks dari sejarah dengan Python. Itu dihasilkan setelah beberapa saat pesan kesalahan "... Ada kesalahan saat menjalankan algoritma." Tapi itu telah mengekspor tabel ke PostgreSQL. Jumlah fiturnya benar dan tabel sejauh ini terlihat baik-baik saja. Jadi saya tidak begitu yakin apa yang salah sebenarnya.
Jawaban
Untuk catatan. Contoh fungsi Python yang menggunakan OGR2OGR di luar QGIS dari OSGEO QGIS dist. Saya digunakan dalam perjalanan disk menemukan 900 file bentuk dalam direktori rekursif dan mengunggah ke PostGIS tanpa kesalahan. Untuk menyederhanakan kode, saya menghapus beberapa penamaan tabel GUID untuk menghindari nama tabel duplikat.
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)
Anda sudah berada di jalan yang benar:
Untuk mengekspor Shapefile dari QGIS 3 ke PostGIS melalui pyqgis, Anda dapat menggunakan kode berikut:
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)
Karena ada juga Plugin untuk mengimpor lapisan vektor ke PostGIS, Anda dapat menjalankannya dan kemudian melihat kode dari Protokol Sejarah.
Plugin tersebut adalah plugin GDAL dari Processing Toolbox "Ekspor ke PostgreSQL (koneksi yang tersedia)"
Plugin terlihat seperti berikut, dan mungkin akan lebih mudah untuk menggunakan ini terlebih dahulu dan setelah memeriksa Sejarah proses yang dijalankan, terapkan kode Anda.
Ini adalah tautan ke dokumentasi dari dokumen QGIS 2 QGIS 2.6
Ini adalah tautan ke dokumentasi untuk dokumen QGIS 3 QGIS 3.10
Kode Anda dengan:
'GTYPE': 0
berarti tidak ada tipe geometri btw. 5 akan menjadi poligon.
Info lebih lanjut ada di link ke dokumentasi QGIS 2 atau QGIS 3 tentang parameter.