Şekil sayısının = tablo kayıtlarının sayısı olup olmadığını programatik olarak nasıl kontrol edebilirim?


9

Bozuk yaklaşık 1000 şekil dosyaları bir avuç var (ekli hata iletisine bakın). Şekil dosyaları eCognition Developer 8'den oluşturuldu . Bozuk olarak tanımlandıktan sonra şekil dosyasını tamir eden bir komut dosyası var .

resim açıklamasını buraya girin

Düzenle:

Tüm şekil dosyaları arasında döngü için hızlı bir komut dosyası oluşturmak ve şekil sayısının tablo kayıtlarına uyup uymadığını kontrol etmek istiyorum. Aşağıdakileri kullanarak tablo kayıtlarını sayabilirim:

# Name: fcCount.py
# Purpose: calculate the number of features in a featureclass

# Import system modules
import arcpy
from arcpy import env

env.workspace = "C:/data"
Sample = "MyShp.shp"
result_dbf = int(arcpy.GetCount_management(Sample).getOutput(0)) 
print result_dbf

Nihayetinde böyle bir mantık kontrolü oluşturmak istiyorum:

if result_dbf = result_shp:
    pass
else:
    print "There is a problem with" + str(Sample)

.Dbf dosyasına erişmeden şekilleri doğrudan nasıl sayabilirim? Veya başka bir deyişle, şekil sayısının tablo kayıtlarının sayısıyla eşleşip eşleşmediğini programlı olarak kontrol etmenin en iyi yolu nedir?


1
Dosyanın görüntülenebileceğini hayal ediyorum, ancak özellik tablosundaki öğelerin her biri bir nesne tarafından temsil ediliyor mu? sbn dosyası bununla ilgilenir. görüntülenip görüntülenmediğine bakılmaksızın sayı eşleşmiyor. Shapefilerepairer kullandığım şey.
Brad Nesom

1
Dekompilasyon senaryoyu yararlı olabilir, ama vay bazı eski kod olabilir! Dürüst olmak gerekirse bugün hala şekil dosyaları üzerinde çalışıyor şaşırıyorum.
Paul

1
@Brad Düzeltmeler yapmak için yazıyı güncelledim. .Sbn hatası, sahip olduğum farklı bir sorundur ve bu sorunla ilgisi yoktur.
Aaron

@Brad Shape Checker aracılığıyla bozuk bir dosyayı çalıştırdığımda, raporlar: "dbf dosyasında yeterli kayıt - boşluk ekleyerek".
Aaron

Yanıtlar:


5

Pyshp kullanmaya ne dersiniz ? Pip ile kurdum ve aşağıda denediğim şey neredeyse README'den çıktı :

>>> import shapefile
>>> sf = shapefile.Reader("/Users/chad/CoalOutcrops.shp")
>>> shapes = sf.shapes()
>>> len(shapes)
33732
>>> records = sf.records()
>>> len(records)
33732
>>>

Maalesef (ya da neyse ki?) şekiller olabilir! = hayır. kayıtları.

Bir dakika, aşağıdaki yorumlarda Kirk'ün fikri sayesinde artık bir şekil dosyam var. Dbf'yi yedekledim, tüm şekil dosyasının bir kopyasını yaptım, bazı özellikleri sildim, sonra yedeklenmiş dbf'yi orijinaline geri adlandırdım ve şekil sayısı <kayıt sayısı:

>>> sf = shapefile.Reader("/Users/chad/CoalOutcrops.shp")
>>> records = sf.records()
>>> len(records)
33732
>>> shapes = sf.shapes()
>>> len(shapes)
33721
>>>

2
Belki şekil dosyasının bir kopyasını oluşturmayı deneyin (aslında dosyalar). Sonra kopyada bazı özellikleri silin. Ardından, orijinal dbf'yi kopyalanan dbf (bazı satırları silinmiş olan) ile değiştirin.
Kirk Kuykendall

@KirkKuykendall - fikriniz işe yaradı, düzenlemelere bakın. Teşekkürler.
Chad Cooper

7
Sorun değil. Daha fazla veriyi bozmam için bana ihtiyacınız olursa, bana bildirin.
Kirk Kuykendall

@Chad yardım için teşekkürler, şekil dosyası modülü hile yaptı. Shapefiles'imi başarıyla kontrol etmek için kullanılan son komut dosyasını gönderdim Yaklaşık 50/1000 bozuk dosya vardı.
Aaron

5

Sorunuzun sesinden, gerçekten yapmak istediğiniz tek şey, bir şekil dosyasının kendisiyle ilgili sorunları olup olmadığını belirlemek gibi görünüyor (bu durumda, eşleşmeyen kayıtlar). Sorunlu olanları tanımlamanız gerekiyorsa, hatalı olup olmadığını belirlemek için DBF ve Shapefile'daki kayıtları saymanız gerekmez. İşte nedeni:

Farklı kayıt sayıları olan bir şekil dosyasında GetCount işlevini çalıştırmayı denerseniz, hata ile başarısız olur:

HATA 000229 : Açılamıyor. (GetCount) yürütülemedi.

GetCount işlevi bu senaryoda başarısız olduğundan ve tek yapmanız gereken yanlışlıkla şekil dosyalarını tanımlamak olduğundan, bunu daha önce kullanmaya çalıştığınız if / else yerine kodunuzda bir try / hariç yan tümcesi ile yakalayabilirsiniz.

Her birini manuel olarak test etmek zorunda kalmadan çalışma alanınızdaki tüm FC'leri test edebilmeniz için "FeatureClasses Listesi" kodunu ve döngüsünü ekleme özgürlüğünü aldım.

# Import system modules
import arcpy
from arcpy import env

env.workspace = "C:/data"

fcList = arcpy.ListFeatureClasses()

for fc in fcList:
    try:
        result_dbf = int(arcpy.GetCount_management(fc).getOutput(0))
        print fc + ": " + str(result_dbf) + " records"
    except:
        print "There is a problem with: " + str(fc)

Teşekkürler Ryan, bu Chad'in çözümüne iyi bir alternatif ve hile de yapıyor.
Aaron

2

Şekil dosyası biçimi belgelenmiştir. Shp dosyasındaki kayıtların sayısının dbf dosyasındaki kayıt sayısına karşılık gelmediğini tahmin ediyorum.

Shp dosya biçimi burada belgelenmiştir . Böylece şekil sayısını saymak için bir program yazabilirsiniz. Dbf biçimi birçok yerde belgelenmiştir ve satırları saymak için örnekler bulabilmeniz gerekir, örneğin burada .


Bir dBase dosyasındaki satırlar iki şekilde sayılabilir: (1) başlıktaki bir kayıt, kaç satır içerdiğini belirler ve (2) başlık uzunluğunu toplam dosya uzunluğundan (bayt cinsinden) çıkarır ve kayıt uzunluğuna böler ( bir artı alanların uzunluklarının toplamına eşittir). Dosyanın fiziksel olarak kesilmesi durumunda her ikisini de yapmak genellikle iyi bir fikirdir. Ne olursa olsun, sayımlar eşleşse bile, .shp ve .dbf dosyaları .shp dosyasını dizine alan .shx dosyası olmadan neredeyse işe yaramaz. Bu nedenle .shx kayıtlarının sayısını hızlı bir şekilde kontrol etmek, tüm .shp dosyasını okumaktan daha iyi olabilir.
whuber

2

Ekli komut dosyası bir dizinde dolaşır ve şekil sayısının her şekil dosyası için kayıt sayısıyla eşleşip eşleşmediğini denetler.

import arcpy, os, shapefile
from arcpy import env

env.workspace = r"C:\path\to\shapefiles"
Dir = env.workspace

fclist = arcpy.ListFeatureClasses()

for fc in fclist:

    myfc = os.path.join(Dir, fc)
    sf = shapefile.Reader(str(myfc))
    shapes = sf.shapes()
    shape_total = len(shapes)
    records = sf.records()
    record_total = len(records)

    if shape_total != record_total:
        print "There is a problem with " + str(fc)
    else:
        print str(fc) + " passed"

1

Kontrol geometrisini kullanmak ilk adımda size yol göstermelidir.
Onus
Onarım Geometrisi , onarmak istediğiniz sorunun sırasını ve önceliğini seçmenizi sağlar.
diğer bazı eski sürüm bağlantıları . Shapefile denetleyicisini çalıştırdığınızda, yeniden derleme dbf ile bitirir misiniz?
Bu, eşleşecek kayıtları oluşturan adımdır. Hataya neden olan iki şeyden biri meydana geldi.

  1. Shp, başka bir yazılım / işlem tarafından silinen / bırakılan bir nesneye (uzamsal) sahiptir.
  2. Dbf, boş geometriye gönderme yapan bir kayda sahiptir.
    Birkaç şey buna neden olabilir.
    Shx aslında ikisi arasındaki indekstir.
    Dbf kayıtlarını saymadan şekilleri saymak çözümün sadece yarısıdır.

Ne yazık ki, onarım geometrisi hatayı gidermez.
Aaron

1

Shapefiles üzerindeki wikipedia makalesine bakıldığında , .shx dosyası .dbf dosyasında değil .shp dosyasında bir dizin içermelidir. Bu nedenle, .shx ve .shp'nin birbirine uygun olup olmadığını kontrol etmek gerekebilir.

.Dbf olmadan bir şekil dosyası açmak mümkündür (yani öznitelik tablonuz yoktur), ancak bozuk bir dizin bir hata mesajı oluşturur.


Kim tarafından "izin verilmiyor"? Tüm özellik bilgilerini sadece .shp dosyasından kurtarmak mümkündür .
whuber

1
İyi işleyen bir dizin bekleyen yazılım tarafından. Doğru şartlar değil, cevabı biraz değiştirdim ...
AndreJ
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.