ArcGIS olmadan Python üzerinden mevcut Shapefile'a nitelik alanı nasıl eklenir?


24

Eğer yoksa bir Shapefile'a nitelik alanı ekleyen bir Python betiğim var. Bu ArcGIS (grafiksel ya da Python üzerinden) ile yapmak kolaydır, ancak ArcGIS'e bağlı olmayan bir şey arıyorum.

Shapefile özellik içeriyor çünkü bu başarısız OGR ile denedim .

Pyshp'e baktım , ancak benzer şekilde, oluşturulduktan sonra şemayı değiştirmenin bir yolu yok. Shapefile (Python için) ile hiç denemedim , ancak bu özelliğin reklamını görmedim. Ayrıca bunun DBF dosyası ile dbfpy aracılığıyla düzeltilerek nasıl yapılacağını da göremiyorum .

Bir fikri olan var mı?


Mevcut şekil dosyası yapısını klonlamak, yeni bir sütun eklemek ve ardından orijinal şekil dosyasını temel alarak doldurmak kabul edilebilir mi?
DavidF



Evet, aslında aynı. Baktım ama görmedim.
Mike T

Yanıtlar:




4

DBF olarak adlandırılan oldukça beyinsiz bir format sayesinde, mevcut özellik verileri ile şekil dosyalarına alan eklemek, yeniden yazma veya DBF'ye dolgu eklemeden mümkün değildir. Hazır bir çözümü bilmiyorum, fakat yapacağım şey var olanı temel alan yeni bir şekil dosyası oluşturmak için bir komut dosyası yazmak ve fazladan alanları yeni şekil dosyasına eklemek. Ardından geometri / özellik verilerini eskiden yeni şekil dosyasına kopyalayın. Ve son adım olarak, eski şekil dosyasını kaldırın ve yenisini yeniden adlandırın. Tüm bunlar, OGR piton bağları kullanılarak oldukça kolay bir şekilde gerçekleştirilir.

Alternatif olarak, yukarıda yalnızca DBF dosyasıyla yapmak için dbfpy komutunu kullanabilirsiniz. Adımların sırası aynı kalır:

  1. Özgünle aynı yapıya sahip yeni bir DBF oluşturun
  2. Yeni DBF'de yeni özellik alanları oluşturun
  3. Verileri orijinal DBF'den yeni DBF'ye kopyala
  4. Eski DBF'yi kaldırın, yeni DBF'yi eski DBF olarak yeniden adlandırın

DBF'de yer alan özellik bilgilerine referans vermediklerinden, shapefile (.shp) dosyasının kendisinde veya diğer dosyalarda herhangi bir değişiklik yapmanız gerekmez. Bununla birlikte, eski ve yeni DBF'deki kayıtların sırasını tamamen aynı tutmanız gerekir.


3

DBFpy bunun için çalışmalıdır. Daha sonra bu sayfada örnek gördünüz mü:

http://dbfpy.sourceforge.net/

Kilitleme sırasında sorunlara yol açabileceğinden, şekil dosyasının ArcGIS dahil başka bir uygulama tarafından düzenlenmediğinden emin olun.


DBF dosyasında zaten verileriniz varsa, bunun işe yaradığını sanmıyorum. Daha önce bakmıştım, ancak bir hata alıyorum: "En az bir kayıt eklendi, yapı değiştirilemez". Aklında belirli bir örnek var mı?
Mike T

Ah, şimdi evet, Sasa'nın yeni bir DBF'nin oluşturulması gerekeceğini söylediğini hatırlıyorum. Şemayı (alanlardaki vb.) Kopyalayın, sonra eklemeler yapın, sonra kayıtları kopyalayın. "Harika" DBF ... :(
Rob Clark

@Mike Tek yapmak istediğiniz alan bir alan eklemek olduğunda, bir kayıt nasıl eklendi ? Kayıt eklemek bir hatadır çünkü özellikler ve şekiller arasındaki bağlantıyı mahveder. Bir alan eklemek hiçbir şekilde zarar vermez. DBF dosyalarını düzenleyebilen herhangi bir kütüphane işi doğru şekilde yapar.
whuber

@ whuber: Bu onların hata mesajı. Verileri olan mevcut bir dbf'yi açın ve şunu görün:from dbfpy import dbf; db = dbf.Dbf('my.dbf'); db.addField(("FOO", "C", 15))
Mike T

@Mike Durumu açıklığa kavuşturduğun için teşekkürler. Dbfpy :-( 'de gereksiz bir sınırlamanın sonucu gibi geliyor. Neden olduğunu tahmin edebilirim: boş olmayan bir veritabanına bir alan eklemek tüm kayıtların fiziksel olarak okunmasını, genişletilmesini ve tekrar yazılmasını gerektirir. farklı bir dBase kütüphanesi bulmak veya başka bir yazılımı kullanmak için ;-).
whuber

1

OGR kullanarak bir çözüm buldum ve önceki bir sorudan dolayı teşekkürler . İşte tam bir örnek:

from osgeo import ogr

# Open a Shapefile, and get field names
source = ogr.Open('my.shp', update=True)
layer = source.GetLayer()
layer_defn = layer.GetLayerDefn()
field_names = [layer_defn.GetFieldDefn(i).GetName() for i in range(layer_defn.GetFieldCount())]
print len(field_names), 'MYFLD' in field_names

# Add a new field
new_field = ogr.FieldDefn('MYFLD', ogr.OFTInteger)
layer.CreateField(new_field)

# Close the Shapefile
source = None

Benim sorunum, onun layer_defn.AddFieldDefn(new_field)yerine kullanmamdı layer.CreateField(new_field). Yardım için çok teşekkürler, ve benzer diğer soruları iyice kontrol etmediğim için üzgünüm.

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.