QGIS, Postgis: Geometri tipi sütun tipi ile eşleşmiyor


30

SPG ile QGIS'deki bazı çokgen şekil dosyalarını Postgis'e aktarmaya çalışıyorum. Bunlardan biri alınamıyor ve bu hatayı veriyor:

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

SPIT widnow'daki bu tabloda "Özellik Sınıfı" özelliğini MULTIPOLYGON'dan POLYGON'a değiştirmeye çalıştım, ancak hiçbir şey olmadı.

Postgis'i her iki türü de kabul etmenin bir yolu var mı (çokgen ve çokgen)? Ya da belki bir şekilde shapefile geometrisini poligondan çoklu poligona dönüştürebilir miyim? Herhangi bir fikir?

Windows'ta Qgis 2.0.1 ve ArchLinux'ta Qgis 2.3'ü denedim.

Yanıtlar:


14

Tükürük bakımsız ve artık tavsiye edilmez. İşleme araç kutusunu kullanmanızı ve "PostGIS'e İçe Aktar" algoritmasını seçmenizi öneririm. Bu rutini kullanırken çok daha fazla şansım oldu. Unutulmaması gereken birkaç şey:

  • Veritabanı (bağlantı adı) parametresi, "PostGIS katmanı ekle" iletişim kutusundan veritabanı bağlantınızı adlandırdığınızla eşleşmelidir.
  • Şema zaten mevcut olmalı - otomatik olarak oluşturulmayacak

Mükemmel çalışıyor. Teşekkürler. Ayrıca bu shapefile'i DB Manager ile yükledim. Önce SPIT'den Multipolygon ile başka bir katman yükledim, sonra DBM'deki POLYGON katmanı ile yazdım (Katman / dosya al). O da çalışıyor.
dmh126

Veritabanı gösterilmiyor (Windows'ta QGIS 2.10'da aynı adı taşıyan olsa bile)
Menelaos Kotsollaris 16:15

19

Bu, düzeltilmeyecek bilinen bir sorun olarak görünüyor: bkz. Http://hub.qgis.org/issues/5328

Bir geçici çözüme ihtiyacınız varsa, tablonuzun geometri sütun tipini genel bir 'geometri' olarak değiştirmeyi deneyin:

ALTER TABLE my_table ALTER COLUMN geom SET DATA TYPE geometry;

İçe aktarma işleminizi yaptıktan sonra geri dönebilirsiniz MultiPolygon:

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

Alternatif olarak, verilerinizi ogr2ogr kullanarak yüklemeyi deneyin .


Cevabınızı @dbaston. benimkinden daha iyi. :)
sfletche

19

PostGIS veritabanına şekil dosyalarının girişini otomatikleştirmek için ogr2ogr kullanıyorum. Özellikle soru ile ilgili olarak, seçeneği kullanın:

-nlt PROMOTE_TO_MULTI

Bu, ogr2ogr'u POLYGON geometrilerini MULTIPOLYGON'a yükseltmeye zorlayarak hatadan kaçınır. Çok basit bir örnek:

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

Pgsql host / auth detaylarını ihmal ettim. Birden çok shapefile toplu iş yapmak için şöyle bir şey yapabilirsiniz:

find ./ -name *.shp | xargs -n1 ogr2ogr <ogr2ogr args omitting the shapefile>

Bu işe yarar ve diğer cevaplardan daha kolaydır. Olumsuz oy hak ediyor.
Joe Germuska,

5

Her ne kadar "PostGis'e İçe Aktar" algoritmasıyla çözmeyi denesem de başarılı olamadım (veritabanım listede görünmüyordu - QGIS 2.10 kullanıyorum).

Bunun yerine, aşağıda açıklandığı gibi basit bir Komut İstemi görevi olan shp2pgsql kullandım :

  • Komut İstemi'ni açın ( yönetici olarak )
  • Şunun gibi görünmesi gereken PostgreSQL / bin klasörüne gidin: C:\Program Files\PostgreSQL\9.4\bin>
  • .shpDosyalarınızı kopyalayıp bu dizine yapıştırmanız yeterlidir . (Klasörümün tamamını .shpdosyalarımla kopyaladım .
  • Komut İstemi tip şu üzerinde: dizin, 4326 WGS84 en olduğunu SRID farklı SSID kullanıyorsanız değişim böylece, belirli dosya ( otomatik olarak oluşturulur). Açıkçası bunu dönüştürmek istediğiniz tüm dosyalar için yapın. Dosyalar geçerli dizine kaydedilir ( benim durumumda)shp2pgsql -s 4326 MyShpDir/MySHPFile.shp> MYSQLFile.sqlMyShpDirMySHPFile.shpMYSQLFileC:\Program Files\PostgreSQL\9.4\bin

Ardından SQL dosyalarını kopyalayıp PLSQL DataBase'inize yapıştırın.

Üstelik, bir başka harika şey shp2pgsqlde tablonun içindeki parametreyi ekleyerek, tablonuzda anında bir indeks oluşturabilmenizdir.I

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

Kar! :)


3

Evet, PostGIS'e masanıza aşağıdaki kısıtlamayı ekleyerek herhangi bir geometri türünü (çokgen, çokgen, nokta, çizgi vb.) Kabul etmesini söyleyebilirsiniz.

PostGIS 2.x için (genel Geometri yazım modunu kullanarak)

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

Önceki Cevap (PostGIS 1.x için Kısıtlamaları kullanarak)

CONSTRAINT enforce_geometry_type CHECK (geometrytype(geom) = 'MULTIPOLYGON'::text OR geometrytype(geom) = 'POLYGON'::text OR geom IS NULL)

CONSTRAINT konumunda veya yakınında sözdizimi hatası. SET CONSTRAINTS'ü denedim ancak bunun yerine CHECK'in yanında aynı hatayı aldım.
dmh126

Postgis'in hangi sürümünü kullanıyorsunuz?
sfletche

PostgreSQL 9.3 için Postgis 2.1
dmh126

enforce_geotype_geomyerine kullanmayı deneyin enforce_geometry_type. işe yarayıp yaramadığını bana bildirin, eğer işe yararsa cevabımı düzenlerim.
sfletche

Çalışmıyor. Aynı hatayı.
dmh126

2

'PostGIS'e içe aktar' algoritması çözümünü denedim ancak bunun da işe yaramadığını öğrendim. Bulduğum en kolay çözüm Veri Tabanı > Veri Tabanı Yöneticisi'ne gitmek , veri tabanınıza gitmek ve Katmanı / dosyayı al (aşağı ok) düğmesini tıklamaktı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.