วิธีตรวจสอบโดยทางโปรแกรมว่าจำนวนรูปร่าง = จำนวนระเบียนในตาราง?


9

ฉันมีรูปร่างหนึ่งไฟล์ประมาณ 1,000 รูปที่เสียหาย (ดูข้อความแสดงข้อผิดพลาดที่แนบมา) ShapeFiles ถูกสร้างขึ้นจาก eCognition Developer 8 มีเครื่องมือสคริปต์ที่ดูเหมือนว่าจะซ่อม Shapefile เมื่อมันถูกระบุว่าเสียหาย

ป้อนคำอธิบายรูปภาพที่นี่

แก้ไข:

ฉันต้องการสร้างสคริปต์อย่างรวดเร็วเพื่อวนลูปไฟล์ทั้งหมดและตรวจสอบว่าจำนวนรูปร่างตรงกับเรคคอร์ดตารางหรือไม่ ฉันสามารถนับบันทึกตารางโดยใช้สิ่งต่อไปนี้:

# 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

ในที่สุดฉันต้องการสร้างการตรวจสอบตรรกะบางประเภทเช่น:

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

ฉันจะนับรูปร่างโดยตรงโดยไม่ต้องเข้าถึงไฟล์. dbf ได้อย่างไร หรืออีกวิธีหนึ่งคือวิธีที่ดีที่สุดในการตรวจสอบโดยทางโปรแกรมว่าจำนวนรูปร่างที่ตรงกับจำนวนระเบียนในตารางคืออะไร


1
ฉันจินตนาการถึงไฟล์ที่สามารถดูได้ แต่แต่ละรายการในตารางคุณลักษณะแสดงโดยวัตถุหรือไม่ นั่นคือสิ่งที่ไฟล์ sbn ดูแล ไม่ว่าจะแสดงหมายเลขไม่ตรงกันหรือไม่ shapefilerepairer คือสิ่งที่ฉันใช้
แบรด Nesom

1
Decompilingสคริปต์อาจมีประโยชน์ แต่ว้าวนั่นคือรหัสเก่า! ฉันประหลาดใจโดยสุจริตว่ามันยังคงใช้ได้กับรูปร่างของวันนี้
Paul

1
@Brad ฉันได้อัปเดตโพสต์เพื่อทำการแก้ไข ข้อผิดพลาด. sbn เป็นปัญหาอื่นที่ฉันมีและไม่เกี่ยวข้องกับปัญหานี้
แอรอน

@Brad เมื่อฉันเรียกใช้ไฟล์ที่เสียหายผ่าน Shape Checker จะรายงาน: "บันทึกไม่เพียงพอในไฟล์ dbf - การเพิ่มช่องว่าง"
แอรอน

คำตอบ:


5

แล้วการใช้pyshpล่ะ? ฉันติดตั้งด้วย pip และสิ่งที่ฉันลองด้านล่างนั้นค่อนข้างตรงจากREADME :

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

น่าเสียดายที่ (หรืออาจโชคดี?) ฉันไม่มีรูปทรงที่ถูกยกขึ้นเพื่อทดสอบเพื่อดูว่าไม่ รูปร่างสามารถ! = ไม่ ของบันทึก

รอสักครู่ตอนนี้ฉันมีไฟล์รูปร่างขึ้นมาขอบคุณความคิดของเคิร์กในความคิดเห็นด้านล่าง ฉันสำรอง dbf แล้วทำสำเนาทั้งรูปร่างไฟล์ลบคุณลักษณะบางอย่างออกจากนั้นเปลี่ยนชื่อ dbf ที่สำรองไว้กลับไปเป็นต้นฉบับและแท้จริงแล้วดูเถิดจำนวนรูปร่าง <จำนวนของบันทึก:

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

2
อาจลองทำสำเนาของไฟล์รูปร่าง (ไฟล์จริง ๆ ) จากนั้นในการคัดลอกลบคุณสมบัติบางอย่าง จากนั้นแทนที่ dbf ดั้งเดิมด้วย dbf ที่คัดลอก (ซึ่งมีบางแถวที่ถูกลบ)
Kirk Kuykendall

@KirkKuykendall - ความคิดของคุณใช้งานได้ดูการแก้ไข ขอบคุณ
Chad Cooper

7
ไม่มีปัญหา. หากคุณต้องการให้ฉันเสียหายข้อมูลเพิ่มเติมให้แจ้งให้เราทราบ
Kirk Kuykendall

ขอบคุณสำหรับความช่วยเหลือ @Chad โมดูล shapefile ได้หลอกลวง ฉันโพสต์สคริปต์สุดท้ายที่ใช้ในการตรวจสอบ shapefiles ของฉันสำเร็จ มีไฟล์เสียหายประมาณ 50/1000 ไฟล์
แอรอน

5

จากเสียงคำถามของคุณดูเหมือนว่าทุกสิ่งที่คุณต้องการคือกำหนดว่ารูปร่างไฟล์มีปัญหาหรือไม่ (ในกรณีนี้บันทึกที่ไม่ตรงกัน) หากคุณเพียงแค่ต้องระบุผู้ที่มีปัญหาคุณไม่จำเป็นต้องนับระเบียนใน DBF และ Shapefile เพื่อตรวจสอบว่ามีข้อผิดพลาดหรือไม่ นี่คือเหตุผล:

ถ้าคุณพยายามเรียกใช้ฟังก์ชัน GetCount บน Shapefile ที่มีจำนวนเร็กคอร์ดที่แตกต่างกันมันจะล้มเหลวด้วยข้อผิดพลาด:

ข้อผิดพลาด000229 : ไม่สามารถเปิดได้ ไม่สามารถดำเนินการ (GetCount)

เนื่องจากฟังก์ชัน GetCount ล้มเหลวในสถานการณ์นี้และสิ่งที่คุณต้องทำคือการระบุ shapefiles ที่มีข้อผิดพลาดคุณสามารถตรวจจับสิ่งนี้ด้วยการลอง / ยกเว้นข้อในรหัสของคุณแทนการใช้ if / else ที่คุณเคยพยายามใช้มาก่อน

ฉันใช้เสรีภาพในการเพิ่มรหัส "List Feature Class" และวนรอบเพื่อให้คุณสามารถทดสอบ FC ทั้งหมดในพื้นที่ทำงานของคุณโดยไม่ต้องทดสอบด้วยตนเอง

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

ขอบคุณไรอันนี่เป็นทางเลือกที่ดีในการแก้ปัญหาของแช้ดและใช้กลอุบาย
แอรอน

2

รูปแบบ shapefile มีการจัดทำเป็นเอกสาร ฉันจะเดาจำนวนระเบียนในไฟล์ shp ไม่ตรงกับจำนวนระเบียนในไฟล์ dbf

รูปแบบไฟล์บราเป็นเอกสารที่นี่ ดังนั้นคุณสามารถเขียนโปรแกรมเพื่อนับจำนวนรูปร่าง รูปแบบ DBF เป็นเอกสารในหลายสถานที่และคุณควรจะสามารถที่จะหาตัวอย่างสำหรับแถวนับเช่นที่นี่


แถวในไฟล์ dBase สามารถนับได้สองวิธี: (1) บันทึกในส่วนหัวกำหนดจำนวนแถวที่มีและ (2) ลบความยาวส่วนหัวออกจากความยาวไฟล์ทั้งหมด (เป็นไบต์) และหารด้วยความยาวเรคคอร์ด ( เท่ากับหนึ่งบวกผลรวมของความยาวของฟิลด์) เป็นความคิดที่ดีที่จะทำทั้งสองอย่างในกรณีที่ไฟล์ถูกตัดทอน แม้จะมีการนับที่ตรงกันไฟล์. shp และ. dbf เกือบจะไร้ประโยชน์หากไม่มีไฟล์. shx ซึ่งจะจัดทำดัชนีลงในไฟล์. shp ดังนั้นการตรวจสอบอย่างรวดเร็วของจำนวนระเบียน. shx อาจดีกว่าการอ่านไฟล์. shp ทั้งหมด
whuber

2

สคริปต์ที่แนบมาจะวนลูปผ่านไดเรกทอรีและตรวจสอบว่าจำนวนรูปร่างตรงกับจำนวนเร็กคอร์ดสำหรับแต่ละไฟล์หรือไม่

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

การใช้รูปทรงเรขาคณิตตรวจสอบควรนำคุณผ่านขั้นตอนแรก
Onus
Repair Geometryจะอนุญาตให้คุณเลือกลำดับและลำดับความสำคัญของปัญหาที่คุณต้องการซ่อมแซม
นี่คือบางส่วนอื่น ๆ ที่มีอายุมากกว่าการเชื่อมโยงรุ่น เมื่อคุณรันตัวตรวจสอบ shapefile คุณจะสร้าง dbf ใหม่อีกครั้งหรือไม่
นั่นคือขั้นตอนที่สร้างระเบียนให้ตรงกัน หนึ่งในสองสิ่งเกิดขึ้นเพื่อทำให้เกิดข้อผิดพลาด

  1. shp มีวัตถุ (อวกาศ) ที่ถูกลบ / ปล่อยโดยซอฟต์แวร์ / กระบวนการอื่น
  2. dbf มีเร็กคอร์ดที่อ้างถึงเรขาคณิตว่าง
    มีหลายสิ่งที่สามารถทำให้เกิดสิ่งนี้
    shx คือดัชนีระหว่างทั้งสอง
    การนับรูปร่างโดยไม่นับเร็กคอร์ด dbf เป็นเพียงครึ่งหนึ่งของโซลูชัน

น่าเสียดายที่รูปทรงการซ่อมแซมไม่สามารถแก้ไขข้อผิดพลาดได้
แอรอน

1

ดูที่บทความวิกิพีเดียเรื่องรูปร่างไฟล์. shx ควรมีดัชนีในไฟล์. shp ไม่ใช่ไฟล์. dbf ดังนั้นจึงอาจจำเป็นต้องตรวจสอบว่า. shx และ. shp พอดีกันหรือไม่

เป็นไปได้ที่จะเปิด shapefile โดยไม่มี. dbf (หมายถึงคุณไม่มีตารางแอตทริบิวต์) แต่ดัชนีที่ใช้งานไม่ได้จะสร้างข้อความแสดงข้อผิดพลาด


ใครคือ "ไม่อนุญาต" มันเป็นไปได้ที่จะกู้คืนทุกข้อมูลคุณลักษณะเพียงจากไฟล์ .shp
whuber

1
โดยซอฟต์แวร์ที่คาดว่าดัชนีทำงานได้ดี ไม่ใช่คำศัพท์ที่ถูกต้องฉันเปลี่ยนคำตอบเล็กน้อย ...
AndreJ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.