Bagaimana secara pemrograman memeriksa apakah jumlah bentuk = jumlah catatan tabel?


9

Saya memiliki sekitar 1000 shapefile yang rusak (lihat pesan kesalahan terlampir). Shapefile dihasilkan dari Pengembang eCognition 8. Ada alat skrip yang tampaknya untuk memperbaiki shapefile setelah diidentifikasi sebagai rusak.

masukkan deskripsi gambar di sini

Edit:

Saya ingin membuat skrip cepat untuk mengulang semua shapefile saya dan memeriksa apakah jumlah shape cocok dengan record tabel. Saya bisa menghitung catatan tabel menggunakan yang berikut ini:

# 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

Saya pada akhirnya ingin membuat semacam pemeriksaan logika seperti:

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

Bagaimana saya bisa menghitung bentuk secara langsung tanpa mengakses file .dbf? Atau, dengan kata lain, apa cara terbaik untuk memeriksa secara terprogram apakah jumlah bentuk cocok dengan jumlah catatan tabel?


1
Saya membayangkan file dapat dilihat, tetapi apakah masing-masing item dalam tabel atribut diwakili oleh suatu objek? itulah yang dilakukan oleh file sbn. terlepas dari apakah itu menampilkan nomor tidak cocok. shapefilerepairer adalah apa yang saya gunakan.
Brad Nesom

1
Mengurai skrip mungkin berguna, tapi wow, itu kode lama! Jujur saya terkejut itu masih bekerja pada shapefile hari ini.
Paul

1
@Brad Saya memperbarui pos untuk melakukan koreksi. Kesalahan .sbn adalah masalah yang berbeda yang telah saya alami dan tidak terkait dengan masalah ini.
Harun

@Brad Ketika saya menjalankan file yang rusak melalui pemeriksa bentuk, ia melaporkan: "Tidak cukup catatan dalam file dbf - menambahkan kosong".
Harun

Jawaban:


5

Bagaimana dengan menggunakan pyshp ? Saya menginstalnya dengan pip dan apa yang saya coba di bawah ini hampir sama dengan README :

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

Sayangnya (atau mungkin untungnya?) Saya tidak punya shapefile yang didongkrak untuk menguji untuk melihat apakah tidak. bentuk bisa! = tidak. catatan.

Tunggu sebentar, saya sekarang punya shapefile yang didongkrak berkat ide Kirk di komentar di bawah. Saya mencadangkan dbf, membuat salinan seluruh shapefile, menghapus beberapa fitur, lalu mengganti nama dbf yang dicadangkan kembali ke aslinya, dan lihatlah, jumlah bentuk <jumlah catatan:

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

2
Mungkin mencoba membuat salinan file bentuk (file, sebenarnya). Kemudian di copy hapus beberapa fitur. Kemudian ganti dbf asli dengan dbf yang disalin (yang memiliki beberapa baris dihapus).
Kirk Kuykendall

@KirkKuykendall - ide Anda berhasil, lihat hasil edit. Terima kasih.
Chad Cooper

7
Tidak masalah. Jika Anda membutuhkan saya untuk merusak lebih banyak data, beri tahu saya.
Kirk Kuykendall

Terima kasih atas bantuan @Chad, modul shapefile berhasil. Saya memposting skrip terakhir yang digunakan untuk berhasil memeriksa shapefile saya. Ada sekitar 50/1000 file rusak.
Aaron

5

Dari bunyi pertanyaan Anda, sepertinya yang benar-benar ingin Anda lakukan adalah menentukan apakah shapefile memiliki masalah dengannya (dalam hal ini, catatan yang tidak cocok). Jika Anda hanya perlu mengidentifikasi mereka yang memiliki masalah, Anda sebenarnya tidak perlu menghitung catatan dalam DBF dan Shapefile untuk menentukan apakah itu salah. Inilah alasannya:

Jika Anda mencoba menjalankan fungsi GetCount pada shapefile yang memiliki jumlah catatan berbeda, itu akan gagal dengan kesalahan:

GALAT 000229 : Tidak bisa dibuka. Gagal menjalankan (GetCount).

Karena fungsi GetCount gagal dalam skenario ini, dan semua yang Anda ingin lakukan adalah mengidentifikasi shapefile dalam kesalahan, Anda dapat menangkap ini dengan klausa coba / kecuali dalam kode Anda, alih-alih jika / kalau Anda sebelumnya mencoba untuk menggunakan.

Saya mengambil kebebasan untuk menambahkan kode dan loop "Daftar FeatureClasses" sehingga Anda dapat menguji semua FC di ruang kerja Anda tanpa harus menguji masing-masing secara manual.

# 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)

Terima kasih Ryan, ini adalah alternatif yang baik untuk solusi Chad dan juga berhasil.
Aaron

2

Format shapefile didokumentasikan. Saya kira jumlah catatan dalam file shp tidak sesuai dengan jumlah catatan dalam file dbf.

Format file shp didokumentasikan di sini . Jadi Anda bisa menulis program untuk menghitung jumlah bentuk. Format dbf didokumentasikan di banyak tempat dan Anda harus dapat menemukan sampel untuk menghitung baris, misalnya di sini .


Baris dalam file dBase dapat dihitung dengan dua cara: (1) catatan di header menetapkan berapa banyak baris yang dikandungnya dan (2) kurangi panjang header dari total panjang file (dalam byte) dan dibagi dengan panjang catatan ( sama dengan satu ditambah jumlah panjang bidang). Biasanya merupakan ide yang baik untuk melakukan keduanya jika file secara fisik terpotong. Apapun, bahkan ketika perhitungan cocok, file .shp dan .dbf hampir tidak berguna tanpa file .shx, yang diindeks ke dalam file .shp. Jadi, periksa cepat jumlah catatan .shx mungkin lebih baik daripada membaca seluruh file .shp.
Whuber

2

Script terlampir loop melalui direktori dan memeriksa apakah jumlah bentuk cocok dengan jumlah catatan untuk setiap shapefile.

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

Menggunakan check geometry akan membantu Anda melalui langkah pertama.
Onus
Repair Geometry akan memungkinkan Anda memilih urutan dan prioritas masalah yang ingin Anda perbaiki.
berikut adalah beberapa tautan versi lama lainnya . Ketika Anda menjalankan shapefile checker, maka Anda selesai dengan membangun kembali dbf?
Itu adalah langkah yang menciptakan catatan yang cocok. Satu dari dua hal telah terjadi yang menyebabkan kesalahan.

  1. Shp memiliki objek (spasial) yang telah dihapus / dijatuhkan oleh perangkat lunak / proses lain.
  2. Dbf memiliki catatan yang mereferensikan geometri nol.
    Beberapa hal dapat menyebabkan ini.
    SHX sebenarnya adalah indeks antara keduanya.
    Menghitung bentuk tanpa menghitung catatan dbf hanya setengah dari solusi.

Sayangnya, perbaikan geometri tidak menghapus kesalahan.
Aaron

1

Melihat artikel wikipedia tentang shapefile , file .shx harus berisi indeks pada file .shp, bukan pada file .dbf. Jadi mungkin perlu untuk memeriksa apakah .shx dan .shp cocok bersama.

Dimungkinkan untuk membuka shapefile tanpa .dbf (artinya Anda tidak memiliki tabel atribut), tetapi indeks yang rusak akan menghasilkan pesan kesalahan.


Oleh siapa itu "tidak diizinkan"? Dimungkinkan untuk memulihkan semua informasi fitur hanya dari file .shp.
Whuber

1
Oleh perangkat lunak yang mengharapkan indeks berfungsi dengan baik. Bukan istilah yang tepat, saya mengubah sedikit jawabannya ...
AndreJ
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.