Saya ingin menggunakan ogr2ogr untuk mengimpor shapefile di database postgis. Saya telah berhasil menginstal ogr2ogr dan saya menjalankan dari pgsql perintah berikut:
ogr2ogr -f "PostgreSQL" PG:"host=localhost user=user_1 password=***** dbname=imports" world_boundaries.shp
Apa yang saya dapatkan kembali adalah pesan kesalahan:
Unable to open datasource `world_boundaries.shp' with the following drivers: --a list of drivers follows (ESRI Shape File etc.)
Saya juga mencoba mendefinisikan path lengkap dari shapefile tetapi saya mendapatkan pesan yang sama.
Saya juga mencoba menjalankan:
ogrinfo world_boundaries.shp
Hal yang sama.
Setelah memperbaiki masalah dengan izin file saya mendapatkan kesalahan berikut:
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)
Saya juga mencoba mengimpornya melalui GUI shp2pgsql dan saya mendapatkan kesalahan berikut:
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.
Masalahnya kali ini adalah bahwa pengguna basis data ini tidak memiliki izin yang memadai. Ini memperbaikinya:
GRANT ALL ON TABLE spatial_ref_sys TO my_user_name;
Pesan kesalahan berikutnya adalah:
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)
Jadi sepertinya saya perlu menggunakan parameter: -tidak MULTIPOLYGON Tapi ketika saya melakukannya saya mendapatkan kesalahan lain, yang tidak masuk akal bagi saya:
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
Tapi itu dimuat menggunakan GUI shp2pgsql.
Komentar @elrobis memungkinkan ini akhirnya berfungsi. Data dimuat dalam db dengan benar!
ogr2ogr -f "PostgreSQL" PG:"host=localhost user=geonode dbname=geonode_imports password=geonode" -nlt GEOMETRY wld_bnd_adm0_gaul_2015.shp
sumber
-nln layername
argumen, mungkin bersama-overwrite
untuk melihat apakah itu datang untuk hidup. Juga, jika saya jadi Anda, saya akan menjalankan ogr2ogrsudo
bersama dengan superuser postgres saya hanya untuk menjadi super super pasti untuk mengesampingkan izin dan hak istimewa. Setelah skrip Anda solid, maka Anda bisa mematuk izin dan hak istimewa sial. :)Jawaban:
Seperti yang Anda temukan dengan coba-coba, ada beberapa masalah yang perlu Anda perbaiki, yang terakhir diselesaikan dengan menggunakan argumen ogr2ogr
-nlt GEOMETRY
* .* Catat rekomendasi dalam komentar @ LeeHachadoorian yang
-nlt PROMOTE_TO_MULTI
digunakan sebagai solusi default, alih-alihnlt GEOMETRY
, karena yang pertama mempromosikan praktik terbaik selain manfaat tambahan.Izin Pengguna dan Pesan Kesalahan
Pertama, ogr2ogr tidak dapat membuka shapefile Anda, dan Anda menyadari bahwa masalah perizinan ternyata memengaruhi pengguna OS yang mengakses shapefile Anda. Tapi ada pelajaran penting di sini untuk orang lain, khususnya, pesan kesalahan ogr2ogr tentang hal ini menyesatkan! Memang, salah satu komentator pertama mengira shapefile Anda tidak valid, dan memang, tebakan pertama saya adalah bahwa mungkin ada kesalahan / kesalahan ketik pada path / nama file, atau bahwa mungkin ada karakter yang tidak konvensional dalam path file — seperti space — itu melanggar kemampuan ogr2ogr untuk menunjuk ke shapefile. Ketika Anda menemukan, itu sebenarnya hanya masalah dengan izin pengguna. Karena pesan kesalahan menciptakan herring merah, ini adalah kemungkinan orang lain perlu mengingatnya. :)
Keistimewaan Pengguna SQL dan Kegagalan Misteri
Saya akan bingung dengan kesalahan kedua Anda untuk sementara waktu, tetapi dengan menguji pengguna SQL Anda dengan utilitas impor yang berbeda (shp2pgsql), yang cerdas, Anda mendapat pesan kesalahan yang lebih tepat dan memberikan hak istimewa yang diperlukan pengguna SQL Anda di atas
spatial_ref_sys
meja. Jadi seseorang yang mengalami kesulitan dalam mendapatkan instruksi impor ogr2ogr mereka agar berfungsi dengan baik harus memastikan pengguna SQL mereka memiliki hak yang cukup baik pada database itu sendiri dan tabel 'spatial_ref_sys'.Jenis Geometri Campuran dan Praktik Terbaik
Rintangan terakhir yang Anda temui tampaknya terkait dengan fakta bahwa shapefile memungkinkan geometri tunggal dan multipart untuk hidup berdampingan dalam dataset / file yang sama. Ini dianggap praktik buruk untuk mencampur tipe geometri dalam tabel yang sama, bahkan untuk satu / multipart dari tipe fitur yang sama, dan secara default, pemain open source di toolchain Anda akan mencoba melindungi Anda dari pencampuran tipe geometri. Untungnya, mereka memberi Anda beberapa opsi. Awalnya saya merekomendasikan pengaturan argumen
-nlt GEOMETRY
* pada instruksi ogr2ogr Anda, yang memungkinkan Anda untuk mengimpor dataset poligon Anda terlepas dari konvensi looser ESRI. Maklum, ini berarti Anda mungkin memiliki geometri bagian tunggal dan banyak bagian di meja Anda, dan itu bisa membuat sakit kepala lain untuk nanti!Perlu disebutkan bahwa ogr2ogr memiliki
-nlt
opsi lain yang harus Anda pertimbangkan, yaituPROMOTE_TO_MULTI
. Mengutip dokumentasi ..Dengan kata lain, jika Anda menggunakan
PROMOTE_TO_MULTI
bendera, maka SEMUA fitur Anda akan dikonversi ke fitur multi-bagian, bahkan ketika mereka terdiri dari satu bagian. Seperti yang dicatat oleh @LeeHachadoorian dalam komentar — dan saya yakin sebagian besar akan setuju — Anda disarankan untuk lebih memilihPROMOTE_TO_MULTI
daripadaGEOMETRY
flag yang lebih longgar , karena sesuai dengan praktik terbaik, menyatukan geometri fitur di tabel Anda. Pada dasarnya, kode apa pun yang Anda tulis semestinya hanya mengharapkan geometri multi bagian. Diakui, ini bisa menjadi lebih bersih dan menyederhanakan beberapa pengembangan.Nasihat Umum untuk Seseorang Yang Memiliki Masalah dengan SHP untuk POST Impor
Pada awalnya, pertimbangkan untuk mengeksekusi perintah ogr2ogr Anda
sudo
untuk mengesampingkan masalah izin sampai setelah Anda tahu pasti bahwa skrip Anda berfungsi sebagaimana dimaksud.spatial_ref_sys
tabel.Sekali lagi, pada awalnya, pertimbangkan untuk menggunakan pengguna super PostGRESql di sini untuk menyingkirkan masalah hak istimewa SQL hingga skrip Anda berfungsi. Jika skrip Anda berfungsi dengan superuser kemudian gagal dengan pengguna otomasi yang disukai, Anda tahu masalahnya terkait dengan pengguna SQL dan bukan data atau lingkungan Anda (instalasi gdal / ogr, dll.)
Coba atur
-nlt
bendera ke salah satuPROMOTE_TO_MULTI
atauGEOMETRY
. Karena shapefile memungkinkan konvensi jenis fitur yang lebih longgar, kadang-kadang Anda harus menginstruksikan utilitas open source Anda agar lebih akomodatif :)Jika Anda mengimpor ke PostGRESql atau MySQL, coba atur
-lco PRECISION=no
..fair warning, saya tidak benar-benar mengerti apa argumen ini, tapi inilah yang saya alami .. Seperti yang Anda tahu, shapefile sering menyertakanSHAPE_LENGTH
danSHAPE_AREA
bidang, dan saya Kadang-kadang saya perhatikan ketika saya mengalami kegagalan misteri, jika saya menghapus bidang-bidang itu saya bisa mendapatkan data untuk diimpor dengan benar. Namun, jika saya gunakan-lco PRECISION=no
, saya bisa mendapatkan data untuk diimpor tanpa harus menghapus bidang itu. Rekomendasi saya adalah menggunakan parameter ini sebagai langkah pemecahan masalah, tetapi untuk memahami masalah apa yang benar-benar diselesaikan sebelum Anda menerima impor dalam solusi produksi.Akhirnya, jika Anda menggunakan MySQL, perhatikan bahwa beberapa geometri fitur yang sangat besar dapat menyinggung
max_allowed_packet
parameter MySQL . Anda dapat membaca lebih lanjut tentang ini di dokumentasi untuk driver MySQL .. tetapi solusinya adalah mengubah konfigurasi MySQL Anda untuk memungkinkan lebih besar dari nilai default.Contoh SHP ke PostGIS Import Command untuk ogr2ogr
Demi pemula yang mungkin berkeliaran di sini, seperti inilah sebagian besar SHP to Post import saya menggunakan ogr2ogr. Perhatikan bahwa saya membungkus jalur file / nama dalam tanda kutip, ini melindungi terhadap spasi, karakter aneh, dan pemecah baris di terminal .. juga saya sudah memasukkan sebagian besar argumen yang dibahas di atas, selain menimpa bidang nama geometri, Bidang FID, dan nama layer:
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
sumber
-nlt PROMOTE_TO_MULTI
, ini benar-benar praktik terbaik untuk geometri poligon. Saya sarankan mengubah jawaban Anda untuk menyarankan ini sebagai pilihan default yang kuat, hanya untuk dilanggar setelah pertimbangan cermat. Saya juga sangat menyarankan untuk tidak menggunakangeometry
tipe generik untuk menangani campuran poligon / multipoligon, kecuali jika pengguna / pengembang benar-benar tahu apa yang mereka lakukan dan perlu mencampur jenis poligon, garis, dan titik.PROMOTE_TO_MULTI
cukup baru (GDAL 1.10) yang saya masih default untuk solusi asli yang tersedia ketika saya memulai semua ini. :) ..di semua kewajaran, sebuah shapefile hanya akan menggabungkan tipe tunggal dan multi-bagian, jadi tidak akan pernah ada skenario di mana ogr2ogr akan mendorong shp melalui-nlt GEOMETRY
dan membangun tabel dengan titik, garis dan polys :))))))) Namun saya sepenuhnya setuju dengan posisi Anda dalam masalah ini.-nlt PROMOTE_TO_MULTI
untuk membuat ini berfungsi.