Ogr2ogr ile postgis'e bir shapefile içe aktarma sağlar: Veri kaynağı açılamıyor


13

Postgis veritabanında bir shapefile almak için ogr2ogr kullanmak istiyorum. Başarılı ogr2ogr yükledim ve pgsql aşağıdaki komutu çalıştırın:

ogr2ogr -f "PostgreSQL" PG:"host=localhost user=user_1 password=***** dbname=imports" world_boundaries.shp

Ne geri almak bir hata mesajı:

Unable to open datasource `world_boundaries.shp' with the following drivers: --a list of drivers follows (ESRI Shape File etc.)

Ayrıca şekil dosyasının tam yolunu tanımlamaya çalıştım ama aynı mesajı aldım.

Ayrıca çalıştırmak için çalıştı:

ogrinfo world_boundaries.shp

Aynı şey.


Dosyanın izinleriyle ilgili sorunları giderdikten sonra aşağıdaki hatayı alıyorum:

  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)

Ayrıca GUI shp2pgsql üzerinden almaya çalıştı ve aşağıdaki hatayı alıyorum:

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.

Bu seferki sorun, bu veritabanı kullanıcısının yeterli izinlere sahip olmamasıydı. Bu sorunu düzeltti:

GRANT ALL ON TABLE spatial_ref_sys TO my_user_name;

Bir sonraki hata mesajı:

  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)

Bu yüzden parametre kullanmanız gerekiyor gibi görünüyor: -nlt MULTIPOLYGON Ama bunu yaptığımda başka bir hata alıyorum, bu benim için bir anlam ifade etmiyor:

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

Ancak shp2pgsql GUI kullanılarak yüklenir.


@Elrobis yorumu, bunun sonunda çalışmasını sağladı. Veri doğru db yüklendi!

ogr2ogr -f "PostgreSQL" PG:"host=localhost user=geonode dbname=geonode_imports password=geonode" -nlt GEOMETRY wld_bnd_adm0_gaul_2015.shp

Şekil dosyanız geçersiz görünüyor. Başka bir yazılımda çalışıyor mu?
Evil Genius

1
Evet. QGIS'de doğru yüklendi.
user1919

1
Ayrıca, DB'nizin zaten var olduğunu ve ogr2ogr komutunuzda doğru bir şekilde yazıldığını ve komuttaki postgres kullanıcısının gerekli ayrıcalıkların (SELECT, INSERT, UPDATE, CREATE .. vb.) Tamamlandığını varsayarak, -nln layernameargümanı eklemeyi deneyin , belki de -overwritehayatın gelip gelmediğini görmek için. Ayrıca, ben olsaydım, sudoizinler ve ayrıcalıkları dışlamak için süper süper emin olmak için postgres süper kullanıcı ile birlikte ogr2ogr çalıştırırdım . Senaryo sağlam olduğunda, sinir bozucu izinleri ve ayrıcalıkları gagalayabilirsin. :)
elrobis

3
Teşekkürler. -Nlt POLYGON yerine -nlt GEOMETRY eklemek hile yaptı.
user1919

1
Çalıştığına sevindim. Devam edeceğim ve neden işe yaradığını düşündüğüm bir yanıta doğru bir cevap vereceğim.
elrobis

Yanıtlar:


17

Deneme yanılma yoluyla keşfettiğiniz gibi, düzeltmeniz gereken az sayıda nagging sorunu vardı, bunların sonuncusu ogr2ogr'un -nlt GEOMETRY* argümanı kullanılarak çözüldü .

* @ LeeHachadoorian'ın , önceki faydaların yan faydalara ek olarak en iyi uygulamaları desteklemesinden -nlt PROMOTE_TO_MULTIziyade, varsayılan bir çözüm olarak kullanılan yorumundaki tavsiyeye dikkat edin nlt GEOMETRY.

Kullanıcı İzinleri ve Hata Mesajları

Birincisi, ogr2ogr şekil dosyanızı açamadı ve izin sorunlarının aslında şekil dosyanıza erişen işletim sistemi kullanıcısını etkilediğini fark ettiniz. Ama burada diğerleri için önemli bir ders var, özellikle ogr2ogr'un bu noktadaki hata mesajı yanıltıcıydı! Aslında, ilk yorumculardan biri şekil dosyanızın geçersiz olduğunu düşündü ve kuşkusuz, ilk tahminim yol / dosya adında muhtemelen bir hata / yazım hatası olduğu veya dosya yolunda alışılmadık bir karakter olabileceği idi. boşluk — ogr2ogr'un şekil dosyasına işaret etme yeteneğini kırıyordu. Bildiğiniz gibi, bu aslında kullanıcı izinleriyle ilgili bir sorundu. Hata mesajı kırmızı bir ringa balığı oluşturduğundan, bu başkalarının zihinlerinin arkasında tutması gereken bir olasılıktır. :)

SQL Kullanıcı Ayrıcalıkları ve Gizem Hataları

Ben bir süre için ikinci hata tarafından stumped olurdu, ama SQL kullanıcı akıllı farklı bir ithalat yardımcı programı (shp2pgsql) ile test ederek, daha kesin bir hata mesajı var ve SQL kullanıcı spatial_ref_systablo üzerinde gerekli ayrıcalıkları verdi . Birisi zorluk yapmalıdır düzgün çalışması için kendi ogr2ogr ithalat talimat alma sahip Yani emin onların SQL kullanıcı veritabanı kendisi hem yeterli ayrıcalıklara sahip ve 'spatial_ref_sys' masaya.

Karışık Geometri Türleri ve En İyi Uygulamalar

Karşılaştığınız son engel, şekil dosyalarının hem tek hem de çok parçalı geometrilerin aynı veri kümesinde / dosyada bir arada var olmasına izin vermesiyle ilişkili gibi görünüyor. Aynı tablodaki geometri türlerini, aynı özellik türünün tek / çok parçalı için bile karıştırmanın kötü bir uygulama olduğu düşünülür ve varsayılan olarak, araç zincirinizdeki açık kaynak oynatıcılar sizi geometri türlerini karıştırmaya karşı korumaya çalışır. Neyse ki, size bazı seçenekler sunuyorlar. Başlangıçta , ogr2ogr komutunuzda, ESRI'nin gevşek kuralına rağmen çokgen veri kümenizi içe aktarmanıza izin veren -nlt GEOMETRY* bağımsız değişkenini ayarlamanız önerilir . Bununla birlikte, bu, muhtemelen tablonuzda hem tek parçalı hem de çok parçalı geometrilere sahip olduğunuz anlamına gelir ve bu, daha sonra için başka baş ağrıları oluşturabilir!

Ogr2ogr'un -nltdikkate almanız gereken başka bir seçeneği olduğunu belirtmek gerekir PROMOTE_TO_MULTI. Belgeleri alıntılamak için ..

GDAL 1.10'dan başlayarak, PROMOTE_TO_MULTI, çokgen veya çokgenleri çokgenlere karıştıran katmanları ve satır dizelerini veya çok satırlı dizeleri çok satırlı dizilere karıştıran katmanları otomatik olarak tanıtmak için kullanılabilir. Şekil dosyalarını PostGIS ve geometri türleri için sıkı denetimler uygulayan diğer hedef sürücülere dönüştürürken yararlı olabilir.

Başka bir deyişle, PROMOTE_TO_MULTIbayrağı kullanırsanız, TÜM özellikleriniz tek bir parçadan oluşsa bile çok parçalı özelliklere dönüştürülür. @LeeHachadoorian tarafından yorumlarda belirtildiği gibi - ve eminim çoğu kabul edersiniz - PROMOTE_TO_MULTIdaha GEOMETRYiyi uygulamaya uyduğundan, tablonuzdaki özellik geometrilerini birleştirerek daha gevşek bayrağı tercih etmeniz önerilir . Temel olarak, yazdığınız herhangi bir kod çok parçalı geometriler beklemelidir. Kuşkusuz, bu daha temiz olabilir ve bazı gelişmeleri basitleştirebilir.

İthalat sonrası bir SHP ile sorun yaşayan biri için genel tavsiye

  1. Yollarınızda korkak karakterler bulunmadığından ve yol ya da dosya adında yazım hatası ya da yazım hatası olmadığından emin olun
  2. @ User1919 tarafından keşfedildiği gibi, OS kullanıcınızın şekil dosyasına erişmek için yeterli ayrıcalığa sahip olduğundan emin olun! Gösterdikleri gibi, şekil dosyasını QGIS gibi başka bir yazılımda açmayı denemeye yardımcı olabilir - bir yazılımda çalışıyorsa, bozuk değildir ve diğer yazılımlarda çalışması gerekir.

İlk olarak sudo, komut dosyanızın amaçlandığı şekilde çalıştığından emin olana kadar izin sorunları ile ilgili kuralların dışlanması için ogr2ogr komutunuzu çalıştırmayı düşünün .

  1. Ayrıca @ user1919'un gerçekleştirdiği gibi, SQL kullanıcınızın hem komut dosyanız tarafından hedeflenen veritabanında hem de spatial_ref_systabloda yeterli ayrıcalıklara sahip olduğundan emin olun .

Yine, ilk olarak, komut dosyası çalışana kadar SQL ayrıcalık sorunlarını ekarte etmek için PostGRESql süper kullanıcısını burada kullanmayı düşünün. Betiğiniz süper kullanıcıyla çalışıyorsa, tercih edilen bir otomasyon kullanıcısıyla başarısız olursa, sorunun verilerinizle veya ortamınızla (gdal / ogr yüklemesi vb.) Değil SQL kullanıcısıyla ilgili olduğunu bilirsiniz.

  1. -nltBayrağı PROMOTE_TO_MULTIveya olarak ayarlamayı deneyin GEOMETRY. Şekil dosyaları daha gevşek bir özellik türü kuralına izin verdiğinden, bazen açık kaynak yardımcı programlarınıza daha uygun olmaları talimatını vermeniz gerekir :)

  2. -lco PRECISION=noPostGRESql veya MySQL'e aktarıyorsanız, ayarlamayı deneyin. Adil uyarı, bu argümanın ne yaptığını tam olarak anlamıyorum, ama burada yaşadığım şey .. Bildiğiniz gibi, şekil dosyaları genellikle SHAPE_LENGTHve SHAPE_AREAalanlarını içerir ve ben Gizem hataları yaşadığımda bazen farkettim, bu alanları silersem verilerin doğru şekilde içe aktarılmasını sağlayabilirim. Ancak, kullanırsam -lco PRECISION=no, bu alanları silmek zorunda kalmadan içe aktarılacak verileri alabilirim. Benim önerim, bu parametreyi bir sorun giderme adımı olarak kullanmak, ancak bir üretim çözümüne aktarmayı kabul etmeden önce hangi sorunu gerçekten çözdüğünü anlamaktır.

  3. Son olarak, MySQL kullanıyorsanız, bazı çok büyük özellik geometrilerinin MySQL max_allowed_packetparametresini bozabileceğini unutmayın . Bu konuda daha fazla bilgiyi MySQL sürücüsünün belgelerinde okuyabilirsiniz .. ancak çözüm, MySQL yapılandırmanızı varsayılandan daha büyük bir değere izin verecek şekilde değiştirmektir.

Ogr2ogr için PostGIS Alma Komutuna Örnek SHP

Burada dolaşabilecek yeni başlayanlar uğruna, SHP to Post ithalatlarımın çoğu ogr2ogr kullanmak gibi görünüyor. Dosya yollarını / adlarını tırnak içine aldığım dikkat edin, bu boşluklara, garip karakterlere ve terminal boyunca kesmeye karşı korur .. Ayrıca geometri adı alanı için geçersiz kılmaya ek olarak yukarıda tartışılan argümanların çoğunu dahil ettim. FID alanı ve katman adı:

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


3
İle ilgili olarak -nlt PROMOTE_TO_MULTI, bu gerçekten poligon geometrileri için en iyi yöntemdir. Yanıtınızı, yalnızca dikkatli bir şekilde değerlendirildikten sonra ihlal edilmek üzere güçlü bir varsayılan seçenek olarak önermek için değiştirmenizi öneririm. Ayrıca geometry, kullanıcı / geliştirici ne yaptığını gerçekten bilmediği ve çokgen, çizgi ve nokta tiplerini karıştırması gerekmediği sürece, karışık poligon / çokgengonu işlemek için genel tipin kullanılmasını şiddetle tavsiye ederim .
Lee Hachadoorian

1
@LeeHachadoorian, kabul etti. Cevabı önerilen şekilde düzenledim. Savunmamda, PROMOTE_TO_MULTItüm bunlara başladığımda mevcut olan orijinal çözümü hala varsayılan olarak yeterince yeni (GDAL 1.10). :) .. tüm adalet içinde, ancak, bir şekil dosyası sadece tek ve çok parçalı türleri birleştirecek, bu yüzden ogr2ogr bir shp itmek -nlt GEOMETRYve noktalar, çizgiler ve polys ile bir tablo oluşturmak asla bir senaryo olmaz :)))) Ancak bu konudaki tutumunuza tamamen katılıyorum.
elrobis

1
Şekil dosyaları, Poligon türlerinde birden çok çokgene izin verir. MultiPolygon tipi bile yok. Bu nedenle, bu tür bir şekil dosyasıyla karşılaşırken bile, -nlt PROMOTE_TO_MULTIbu işi yapmak için kullanılması gerekir.
CMCDragonkai
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.