यदि प्रोग्राम की आकृतियों की संख्या = तालिका रिकॉर्ड की संख्या की जाँच कैसे करें?


9

मेरे पास लगभग 1000 शेपफाइल्स हैं जो दूषित हैं (संलग्न त्रुटि संदेश देखें)। शेपफाइल्स को ईकोग्निशन डेवलपर 8 से उत्पन्न किया गया था। एक स्क्रिप्ट टूल है जो दूषित होने के बाद पहचाने जाने पर शेपफाइल की मरम्मत करता है।

यहां छवि विवरण दर्ज करें

संपादित करें:

मैं अपने सभी शेपफाइल्स के माध्यम से एक त्वरित स्क्रिप्ट बनाना चाहता हूं और जांचता हूं कि क्या आकृतियों की संख्या तालिका के रिकॉर्ड से मेल खाती है। मैं निम्नलिखित का उपयोग करते हुए तालिका रिकॉर्ड की गणना कर सकता हूं:

# 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 फ़ाइल का ख्याल रखता है। इसकी परवाह किए बिना कि यह संख्या से मेल नहीं खाता है। शेपफिलरेपीयर वह है जो मैं उपयोग करता हूं।
ब्रैड नेसोम जूल

1
स्क्रिप्ट को अपघटित करना उपयोगी हो सकता है, लेकिन वाह यह कुछ पुराना कोड है! मैं ईमानदारी से आश्चर्यचकित हूं कि यह आज भी शेपफाइल्स पर काम करता है।
पॉल

1
@ ब्रैड I ने सुधार करने के लिए पोस्ट को अपडेट किया। .Sbn त्रुटि एक अलग समस्या है जो मैं रहा है और इस समस्या से संबंधित नहीं है।
हारून

@ ब्रैड जब मैं आकृति परीक्षक के माध्यम से एक दूषित फ़ाइल चलाता हूं, तो यह रिपोर्ट करता है: "dbf फ़ाइल में पर्याप्त रिकॉर्ड नहीं - रिक्त स्थान जोड़ना"।
हारून

जवाबों:


5

Pyshp का उपयोग करने के बारे में क्या ? मैंने इसे पिप के साथ स्थापित किया और जो मैंने नीचे आजमाया वह README से बहुत सीधा है :

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

दुर्भाग्य से (या शायद सौभाग्य से?) मेरे पास कोई जैकेड-अप शेपफाइल्स नहीं है, यह देखने के लिए कि क्या है। आकार की कर सकते हैं! = नहीं। अभिलेखों का।

बस एक मिनट रुकिए, मेरे पास अब नीचे टिप्पणियों में किर्क के विचार के लिए एक जैकेड शेपफाइल है। मैंने dbf का समर्थन किया, संपूर्ण आकृति की प्रतिलिपि बनाई, कुछ विशेषताओं को हटा दिया, फिर मूल, और lo और वापस देखने के लिए बैक-अप dbf का नाम बदल दिया, आकृतियों की संख्या <रिकॉर्ड की संख्या:

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

2
शायद आकृति फ़ाइल (फ़ाइलों, वास्तव में) की एक प्रतिलिपि बनाने का प्रयास करें। फिर कॉपी में कुछ सुविधाओं को हटा दें। फिर मूल डीबीएफ को कॉपी किए गए डीबीएफ (जिसमें कुछ पंक्तियों को हटा दिया गया है) से बदल दें।
कर्क कुयकेंडल

@KirkKuykendall - आपके विचार ने काम किया, संपादन देखें। धन्यवाद।
चाड कूपर

7
कोई दिक्कत नहीं है। यदि आपको कभी कुछ और डेटा को दूषित करने की आवश्यकता है, तो मुझे बताएं।
कर्क कुयकेंडल

@Chad की मदद के लिए धन्यवाद, शेपफाइल मॉड्यूल ने चाल चली। मैंने अपने स्क्रिप्टफ़ाइल्स की सफलतापूर्वक जांच करने के लिए उपयोग की जाने वाली अंतिम स्क्रिप्ट पोस्ट की। लगभग 50/1000 दूषित फाइलें थीं।
आरोन

5

आपके प्रश्न की ध्वनि से, ऐसा लगता है कि आप वास्तव में करना चाहते हैं या नहीं, यह निर्धारित करना है कि क्या आकृति के साथ इसके मुद्दे हैं (इस मामले में, बेमेल रिकॉर्ड)। यदि आपको केवल उन मुद्दों की पहचान करने की आवश्यकता है, तो आपको वास्तव में यह निर्धारित करने के लिए डीबीएफ और शेपफाइल में रिकॉर्ड की गणना करने की आवश्यकता नहीं है कि क्या यह त्रुटि है। यहाँ पर क्यों:

यदि आप GetCount फ़ंक्शन को किसी आकृति रिकॉर्ड पर चलाने का प्रयास करते हैं, जिसमें अलग-अलग रिकॉर्ड मायने रखता है, तो यह त्रुटि के साथ विफल हो जाएगा:

ERROR 000229 : खुल नहीं सकता। निष्पादित करने में विफल (GetCount)।

चूंकि GetCount फ़ंक्शन इस परिदृश्य में विफल रहता है, और आप जो भी करना चाहते हैं, वह त्रुटि में आकार-प्रकार की पहचान करता है, आप इसे अपने कोड में एक प्रयास के अलावा / पकड़ को छोड़कर पकड़ सकते हैं, इसके बजाय यदि आप / पहले उपयोग करने का प्रयास कर रहे थे।

मैंने "लिस्ट फीचरक्लास" कोड और लूप को जोड़ने की स्वतंत्रता ली ताकि आप अपने कार्यक्षेत्र में सभी एफसी को मैन्युअल रूप से परीक्षण कर सकें।

# 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

आकार स्वरूप प्रारूप प्रलेखित है। मुझे लगता है कि shp फ़ाइल में रिकॉर्ड की संख्या dbf फ़ाइल में रिकॉर्ड की संख्या के अनुरूप नहीं होगी।

यहाँ shp फ़ाइल प्रारूप का दस्तावेजीकरण किया गया है । इसलिए आप आकृतियों की संख्या गिनने के लिए एक कार्यक्रम लिख सकते हैं। 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

चेक ज्यामिति का उपयोग करना आपको पहले चरण के माध्यम से प्राप्त करना चाहिए।
ओनस
रिपेयर ज्योमेट्री आपको उस समस्या के क्रम और प्राथमिकता का चयन करने की अनुमति देगा जिसके लिए आप मरम्मत करना चाहते हैं।
यहाँ कुछ अन्य पुराने संस्करण लिंक हैं । जब आप शेपफाइल चेकर चलाते हैं, तो आप dbf को फिर से बनाते हैं?
यह वह कदम है जो रिकॉर्ड बनाने के लिए मैच करता है। त्रुटि के कारण दो चीजों में से एक हुई है।

  1. Shp में एक ऑब्जेक्ट (स्थानिक) है जिसे किसी अन्य सॉफ़्टवेयर / प्रक्रिया द्वारा हटा दिया गया है / गिरा दिया गया है।
  2. Dbf के पास एक रिकॉर्ड है जो अशक्त ज्यामिति को संदर्भित कर रहा है।
    कई चीजें इसका कारण बन सकती हैं।
    Shx वास्तव में दोनों के बीच का सूचकांक है।
    Dbf रिकॉर्ड्स की गिनती के बिना आकृतियों की गणना समाधान का केवल आधा हिस्सा है।

दुर्भाग्य से, मरम्मत ज्यामिति त्रुटि को साफ नहीं करती है।
आरोन

1

आकार के लेखों पर विकिपीडिया लेख को देखते हुए , .shx फ़ाइल में .shp फ़ाइल पर एक इंडेक्स होना चाहिए, .dbf फ़ाइल पर नहीं। तो यह जांचना आवश्यक हो सकता है कि .shx और .shp एक साथ फिट हैं या नहीं।

यह .dbf (जिसका अर्थ है कि आपके पास कोई विशेषता तालिका नहीं है) के बिना एक आकृति को खोलने के लिए संभव है, लेकिन एक टूटा हुआ सूचकांक त्रुटि संदेश उत्पन्न करेगा।


किसके द्वारा इसे "अनुमति नहीं है"? केवल .shp फ़ाइल से सभी फ़ीचर जानकारी को पुनर्प्राप्त करना संभव है ।
whuber

1
सॉफ्टवेयर द्वारा जो एक अच्छी तरह से कार्य सूचकांक की उम्मीद करता है। सही शब्द नहीं, मैंने उत्तर को थोड़ा बदल दिया ...
आंद्रे जूल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.