Impor shapefile ke postgis dengan ogr2ogr memberi: Tidak dapat membuka sumber data

12

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
pengguna1919
sumber
Sepertinya shapefile Anda tidak valid. Apakah ini berfungsi di perangkat lunak lain?
Evil Genius
1
Iya. Ini dimuat dengan benar di QGIS.
user1919
1
Juga, dengan asumsi DB Anda sudah ada dan itu dieja dengan benar dalam instruksi ogr2ogr Anda, dan bahwa pengguna postgres dalam perintah memiliki pelengkap lengkap dari hak istimewa yang diperlukan (SELECT, INSERT, UPDATE, BUAT .. dll), coba tambahkan -nln layernameargumen, mungkin bersama -overwriteuntuk melihat apakah itu datang untuk hidup. Juga, jika saya jadi Anda, saya akan menjalankan ogr2ogr sudobersama 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. :)
elrobis
3
Terima kasih. Menambahkan -tidak GEOMETRI bukan -tidak POLYGON yang melakukannya.
user1919
1
Senang itu berhasil. Saya akan melanjutkan dan membuat tanggapan yang tepat dalam jawaban yang juga menjelaskan mengapa saya pikir itu berhasil.
elrobis

Jawaban:

17

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_MULTIdigunakan sebagai solusi default, alih-alih nlt 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_sysmeja. 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 -nltopsi lain yang harus Anda pertimbangkan, yaitu PROMOTE_TO_MULTI. Mengutip dokumentasi ..

Dimulai dengan GDAL 1.10, PROMOTE_TO_MULTI dapat digunakan untuk secara otomatis mempromosikan lapisan yang mencampur poligon atau multipoligon ke multipoligon, dan lapisan yang mencampur linestrings atau multilinestrings ke multilinestrings. Dapat berguna saat mengonversi shapefile ke PostGIS dan driver target lain yang menerapkan pemeriksaan ketat untuk tipe geometri.

Dengan kata lain, jika Anda menggunakan PROMOTE_TO_MULTIbendera, 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 memilih PROMOTE_TO_MULTIdaripada GEOMETRYflag 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

  1. Pastikan jalur Anda tidak memiliki karakter funky di dalamnya dan tidak ada kesalahan ketik atau salah eja dalam jalur atau nama file
  2. Ketika @ user1919 ditemukan, pastikan pengguna OS Anda memiliki hak yang cukup untuk mengakses shapefile! Seperti yang mereka tunjukkan, ini dapat membantu untuk mencoba membuka shapefile di perangkat lunak lain, seperti QGIS — jika ia bekerja di satu perangkat lunak, maka itu tidak rusak, dan itu seharusnya berfungsi di perangkat lunak lain.

Pada awalnya, pertimbangkan untuk mengeksekusi perintah ogr2ogr Anda sudountuk mengesampingkan masalah izin sampai setelah Anda tahu pasti bahwa skrip Anda berfungsi sebagaimana dimaksud.

  1. Juga ketika @ user1919 menyadari, pastikan pengguna SQL Anda memiliki hak yang cukup baik pada database yang ditargetkan oleh skrip Anda, maupun spatial_ref_systabel.

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.)

  1. Coba atur -nltbendera ke salah satu PROMOTE_TO_MULTIatau GEOMETRY. Karena shapefile memungkinkan konvensi jenis fitur yang lebih longgar, kadang-kadang Anda harus menginstruksikan utilitas open source Anda agar lebih akomodatif :)

  2. 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 menyertakan SHAPE_LENGTHdan SHAPE_AREAbidang, 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.

  3. Akhirnya, jika Anda menggunakan MySQL, perhatikan bahwa beberapa geometri fitur yang sangat besar dapat menyinggung max_allowed_packetparameter 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

elrobis
sumber
3
Mengenai -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 menggunakan geometrytipe 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.
Lee Hachadoorian
1
@LeeHachadoorian, setuju. Saya mengedit jawaban seperti yang disarankan. Dalam pembelaan saya, PROMOTE_TO_MULTIcukup 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 GEOMETRYdan membangun tabel dengan titik, garis dan polys :))))))) Namun saya sepenuhnya setuju dengan posisi Anda dalam masalah ini.
elrobis
1
Shapefile memungkinkan banyak poligon dalam jenis Poligonnya. Mereka bahkan tidak memiliki tipe MultiPolygon. Jadi, bahkan ketika hanya menemukan file bentuk seperti ini, orang perlu menggunakan -nlt PROMOTE_TO_MULTIuntuk membuat ini berfungsi.
CMCDragonkai