QGIS, Postgis: Jenis geometri tidak cocok dengan jenis kolom

30

Saya mencoba mengimpor beberapa polifon shapefile ke Postgis di QGIS via SPIT. Salah satunya tidak dapat diimpor dan mengembalikan kesalahan ini:

ERROR: Geometry type (Polygon) does not match column type (MultiPolygon)

Saya sudah mencoba mengubah atribut "Feature Class" dalam tabel itu di SPIT widnow, dari MULTIPOLYGON ke POLYGON, tetapi tidak ada yang terjadi.

Apakah ada cara untuk membuat Postgis menerima kedua jenis (poligon dan multipoligon)? Atau mungkin entah bagaimana saya dapat mengubah geometri shapefile dari poligon ke multipoligon? Ada ide?

Saya sudah mencoba Qgis 2.0.1 di Windows dan Qgis 2.3 di ArchLinux.

dmh126
sumber

Jawaban:

14

Meludah tidak dirawat dan tidak direkomendasikan lagi. Saya sarankan menggunakan toolbox pemrosesan dan memilih algoritma "Impor ke PostGIS". Saya lebih beruntung menggunakan rutinitas itu. Beberapa hal yang perlu diperhatikan:

  • Parameter database (nama koneksi) harus cocok dengan apa yang Anda beri nama koneksi database Anda dari dialog "Tambahkan layer PostGIS".
  • Skema harus sudah ada - skema tidak akan dibuat secara otomatis
ndawson
sumber
Ini bekerja dengan sempurna. Terima kasih. Saya juga memuat shapefile ini dengan DB Manager. Pertama saya memuat layer lain dengan Multipolygon oleh SPIT, lalu saya menimpanya dengan layer POLYGON di DBM (Import layer / file). Ini juga berhasil.
dmh126
Basis data tidak akan ditampilkan (walaupun memiliki nama yang sama di QGIS 2.10 pada Windows)
Menelaos Kotsollaris
19

Ini tampaknya merupakan masalah yang diketahui yang tidak akan diperbaiki: lihat http://hub.qgis.org/issues/5328

Jika Anda membutuhkan solusi, coba ubah jenis kolom geometri tabel Anda menjadi 'geometri' umum:

ALTER TABLE my_table ALTER COLUMN geom SET DATA TYPE geometry;

Setelah melakukan impor, Anda dapat kembali ke MultiPolygon:

ALTER TABLE my_table ALTER COLUMN geom 
    SET DATA TYPE geometry(MultiPolygon) USING ST_Multi(geom);

Atau, coba muat data Anda menggunakan ogr2ogr .

dbaston
sumber
jawab jawaban Anda @dbaston. ini lebih baik dari milikku. :)
sfletche
19

Saya menggunakan ogr2ogr untuk mengotomatiskan penggunaan shapefile ke dalam database PostGIS. Khusus terkait dengan pertanyaan, gunakan opsi:

-nlt PROMOTE_TO_MULTI

Ini akan memaksa ogr2ogr untuk mempromosikan geometri POLYGON ke MULTIPOLYGON, menghindari kesalahan. Contoh yang sangat sederhana:

ogr2ogr -f "PostgreSQL" PG:"dbname='<my_db>'" -nlt PROMOTE_TO_MULTI <shapefile>

Saya telah menghilangkan detail host / auth pgsql. Untuk batch beberapa shapefile Anda dapat melakukan sesuatu seperti:

find ./ -name *.shp | xargs -n1 ogr2ogr <ogr2ogr args omitting the shapefile>
rampok
sumber
Ini berfungsi dan lebih mudah daripada jawaban lain. Layak upvotes.
Joe Germuska
5

Walaupun saya mencoba menyelesaikannya dengan algoritma "Impor ke PostGis", saya tidak berhasil (database saya tidak muncul dalam daftar - saya menggunakan QGIS 2.10).

Sebagai gantinya, saya menggunakan shp2pgsql , yang merupakan tugas Command Prompt sederhana seperti yang dijelaskan di bawah ini:

  • Buka Command Prompt ( sebagai administrator )
  • Masuk ke folder PostgreSQL / bin yang seharusnya terlihat seperti ini: C:\Program Files\PostgreSQL\9.4\bin>
  • Cukup salin & tempel .shpfile Anda ke direktori ini. (Saya menyalin seluruh folder saya dengan .shpfile saya .
  • Pada Command Prompt ketikkan yang berikut: di shp2pgsql -s 4326 MyShpDir/MySHPFile.shp> MYSQLFile.sqlmana MyShpDirdirektori Anda, 4326 adalah SRID WGS84 jadi ubah jika Anda menggunakan SSID yang berbeda, MySHPFile.shpfile khusus Anda ( MYSQLFileakan dibuat secara otomatis). Jelas lakukan ini untuk semua file yang ingin Anda konversi. File akan disimpan di direktori Anda saat ini ( C:\Program Files\PostgreSQL\9.4\bindalam kasus saya)

Kemudian cukup salin & tempel file SQL di PLSQL DataBase Anda.

Selain itu, satu hal keren tambahan tentang shp2pgsqlkenyataan bahwa Anda dapat langsung membuat indeks di tabel Anda hanya dengan menambahkan Iparameter dalam perintah, seperti ini:

shp2pgsql -s 4326 -I MyShpDir/MySHPFile.shp> MYSQLFile.sql

Keuntungan! :)

Menelaos Kotsollaris
sumber
3

Ya, Anda bisa memberi tahu PostGIS untuk menerima semua jenis geometri (poligon, multipoligon, titik, linestring, dll) dengan menambahkan batasan berikut ke tabel Anda.

Untuk PostGIS 2.x (menggunakan typemod Geometry generik)

ALTER TABLE my_table ALTER COLUMN geom TYPE geometry(Geometry,4326);

Jawaban Sebelumnya (untuk PostGIS 1.x menggunakan Kendala)

CONSTRAINT enforce_geometry_type CHECK (geometrytype(geom) = 'MULTIPOLYGON'::text OR geometrytype(geom) = 'POLYGON'::text OR geom IS NULL)
sfletche
sumber
Kesalahan sintaks di atau dekat CONSTRAINT. Saya sudah mencoba SET CONSTRAINTS tetapi saya mendapatkan error yang sama di dekat CHECK.
dmh126
versi postgis apa yang Anda gunakan?
sfletche
Postgis 2.1 untuk PostgreSQL 9.3
dmh126
coba gunakan enforce_geotype_geomdaripada enforce_geometry_type. beri tahu saya jika itu berhasil, dan saya akan mengedit respons saya jika berhasil.
sfletche
Itu tidak bekerja. Kesalahan yang sama.
dmh126
2

Saya mencoba solusi algoritma 'Impor ke PostGIS' tetapi ternyata tidak berhasil. Solusi termudah yang saya temukan adalah pergi ke Database > DB Manager , navigasikan ke database Anda, dan klik tombol Impor layer / file (panah bawah) .

Brideau
sumber