'NoneType' ऑब्जेक्ट में कोई विशेषता नहीं है


10

मैं अजगर भू-स्थानिक प्रोग्रामिंग के लिए नया हूं। मैंने निम्नलिखित स्क्रिप्ट चलाई और संबंधित त्रुटि संदेश मिला

>>> import osgeo
>>> import osgeo.ogr
>>> shapefile = osgeo.ogr.Open("tl_2009_us_state.shp")
>>> numLayers = shapefile.GetLayerCount()

Traceback (most recent call last):   
    File "<pyshell#5>", line 1, in <module>
    numLayers = shapefile.GetLayerCount() AttributeError: 'NoneType' object has no attribute 'GetLayerCount'

आपके कोड को स्थानीय रूप से आज़माया और यह काम करता है। तो, GDAL के किस संस्करण को आपने स्थापित किया है?
क्रिस्चन

स्क्रिप्ट आपके आकार डेटा को एक्सेस नहीं कर सकी। कृपया अपने डेटा यानी tl_2009_us_state.shpफ़ाइल वाले फ़ोल्डर के भीतर अजगर स्क्रिप्ट को बचाएं ।
कालेबज

जवाबों:


17

तो मूल रूप से, यह जो कह रहा है, पायथन में बोलते हैं, यह है कि शेपफाइल को खोलने का आपका प्रयास विफल हो गया। जब osgeo.ogr.Open () की तरह कुछ विफल हो जाता है, तो यह आमतौर पर कोई भी नहीं लौटाता है, जो आपके मामले में, आपके चर "शेपफाइल" को सौंपा जाता है। जब आप बाद में शेपफाइल का उपयोग करने का प्रयास करते हैं, तो यह आपको बताता है कि शेपफाइल "नोइंग टाइप" है (ऑस्गेओ ने बनाई गई वस्तु के प्रकार के बजाय) और यह कि किसी भी टाइप ऑब्जेक्ट में गेटलेयरकाउंट विधि नहीं है।

आप इसे कैसे ठीक करते हैं? सबसे पहले, अपने कोड में त्रुटियों के लिए परीक्षण करें - यह आपको बेहतर संदेश देगा। कुछ इस तरह:

import osgeo
import osgeo.ogr
try:
    shapefile = osgeo.ogr.Open("tl_2009_us_state.shp")

    if shapefile: # checks to see if shapefile was successfully defined
        numLayers = shapefile.GetLayerCount()
    else: # if it's not successfully defined
        print "Couldn't load shapefile"
except: # Seems redundant, but if an exception is raised in the Open() call,
    #   # you get a message
    print "Exception raised during shapefile loading"

    # if you want to see the full stacktrace - like you are currently getting,
    # then you can add the following:
    raise

तो, अब हमें इस सवाल का जवाब देने की आवश्यकता है कि आपका शेपफाइल लोड क्यों नहीं हो रहा है। मेरा अनुमान है कि आपको पूरी तरह से योग्य पथ (यानी, "C: \ Users ... \ tl_2009_us_state.shp") प्रदान करने की आवश्यकता है, क्योंकि ओस्जियो वर्तमान में प्रदान किए गए पथ के साथ आपके आकार को नहीं पा सकता है। हालांकि यह एक कूबड़ है।


1
नहीं, यह "पायथन स्पीक" नहीं है। जैसा कि माइक नीचे कहते हैं, कोई भी वापस लौटने के बजाय, यह ओस्गे.ओगॉर को क्या करना चाहिए: "IOError [संक्षिप्त विवरण]"।
sgillies

क्षमा करें, जो मैं कहने का प्रयास कर रहा था कि "'कोई नहीं' ऑब्जेक्ट में कोई विशेषता नहीं है 'GetLayerCount'" एक सुंदर मानक पायथन त्रुटि संदेश है जो अक्सर तब होता है जब आप किसी ऑब्जेक्ट की अपेक्षा करते हैं कि उसे असाइन किया गया है, जो भी कारण के लिए, नहीं किया सौंपा गया। खेद है कि स्पष्ट नहीं था।
निक्सन

7

@ निक का जवाब सही है: "कोई नहीं" का अर्थ है कि डेटा स्रोत नहीं खोला जा सकता है। OGR (और GDAL) उन अपवादों को नहीं उठाते हैं जहां उन्हें सामान्य रूप से होना चाहिए, और दुर्भाग्य ogr.UseExceptions()से कुछ भी उपयोगी नहीं लगता है। यहाँ वास्तव में उचित अपवाद जुटाने के लिए मेरा सामान्य कोड ब्लॉक है:

from osgeo import ogr

# Change this to your OGR data source
ds_fname = r'C:\temp\tl_2009_us_state.shp'

ds = ogr.Open(ds_fname)
if not ds:
    raise IOError("Could not open '%s'"%ds_fname)

numLayers = ds.GetLayerCount()
...

1

मैंने पहले भी इस त्रुटि का सामना किया है और इतने लंबे समय तक इसके साथ अटका रहा। मुझे यह एक अलग आकार-प्रकार का उपयोग करके काम करने के लिए मिला। यूएस टाइगर शेपफाइल भ्रष्ट या कुछ और रहा होगा। मैं यहाँ gdal1.6 का उपयोग कर रहा हूँ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.