L'objet 'NoneType' n'a pas d'attribut


10

Je suis nouveau dans la programmation géospatiale en python. j'ai exécuté le script suivant et obtenu le message d'erreur correspondant

>>> 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'

J'ai essayé votre code localement et ça marche. Alors, quelle version de GDAL avez-vous installée?
Crischan

Le script n'a pas pu accéder aux données de votre fichier de formes. Veuillez enregistrer le script python dans le dossier contenant vos données, c'est-à-dire le tl_2009_us_state.shpfichier.
CalebJ

Réponses:


17

Donc, fondamentalement, ce que cela signifie, en langage Python, c'est que votre tentative d'ouverture du fichier de formes a échoué. Quand quelque chose comme osgeo.ogr.Open () échoue, il retourne généralement None, qui, dans votre cas, est assigné à votre variable "shapefile". Lorsque vous essayez d'accéder ensuite au fichier de formes plus tard, il vous indique que le fichier de formes est "NoneType" (plutôt que le type d'objet qu'osgeo aurait créé) et que les objets NoneType n'ont pas la méthode GetLayerCount.

Comment réparez-vous ceci? Tout d'abord, testez les erreurs dans votre code - cela vous donnera de meilleurs messages. Quelque chose comme:

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

Donc, maintenant nous devons répondre à la question de savoir pourquoi votre fichier de formes ne se charge pas. Je suppose que vous devez fournir le chemin d'accès complet (par exemple, "C: \ Users ... \ tl_2009_us_state.shp") car osgeo ne peut pas trouver votre fichier de formes avec le chemin d'accès actuellement fourni. C'est un pressentiment cependant.


1
Non, ce n'est pas du tout "parler Python". Comme Mike le dit ci-dessous, au lieu de renvoyer None, c'est ce que osgeo.ogr devrait faire: "IOError [brève description]".
sgillies

Désolé, ce que j'essayais de dire était que «l'objet« NoneType »n'a pas d'attribut« GetLayerCount »» est un message d'erreur Python assez standard qui se produit souvent lorsque vous vous attendez à ce qu'un objet ait été attribué qui, pour une raison quelconque, n'a pas se faire assigner. Désolé, ce n'était pas clair.
nicksan

7

@ La réponse de Nick est correcte: "NoneType" signifie que la source de données n'a pas pu être ouverte. OGR (et GDAL) ne soulèvent pas d'exceptions là où ils devraient normalement, et ogr.UseExceptions()ne semblent malheureusement rien faire d'utile. Voici mon bloc de code habituel pour lever les exceptions appropriées:

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

J'ai rencontré cette erreur auparavant et je suis resté avec elle pendant si longtemps. Je l'ai fait fonctionner en utilisant un fichier de formes différent. Le fichier de formes US Tiger doit avoir été corrompu ou quelque chose. J'utilise gdal1.6 ici.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.