O objeto 'NoneType' não tem atributo


10

Eu sou novo na programação geoespacial python. Eu executei o seguinte script e recebi a mensagem de erro correspondente

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

Tentei seu código localmente e ele funciona. Então, qual versão do GDAL você instalou?
Crischan

O script não pôde acessar seus dados do shapefile. Salve o script python na pasta que contém seus dados, ou seja, o tl_2009_us_state.shparquivo.
precisa saber é

Respostas:


17

Então, basicamente, o que isso está dizendo, no Python fala, é que sua tentativa de abrir o shapefile falhou. Quando algo como osgeo.ogr.Open () falha, geralmente retorna None, que, no seu caso, é atribuído à sua variável "shapefile". Quando você tenta acessar o shapefile posteriormente, ele informa que o shapefile é "NoneType" (em vez do tipo de objeto que osgeo teria criado) e que os objetos NoneType não possuem o método GetLayerCount.

Como você conserta isso? Primeiro, teste se há erros no seu código - ele fornecerá mensagens melhores. Algo como:

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

Portanto, agora precisamos responder à pergunta de por que o seu shapefile não está carregando. Meu palpite é que você precisa fornecer o caminho completo (por exemplo, "C: \ Users ... \ tl_2009_us_state.shp") porque o osgeo não consegue encontrar seu shapefile com o caminho atualmente fornecido. Isso é um palpite.


1
Não, isso não é "Python speak". Como Mike diz abaixo, em vez de retornar None, é isso que osgeo.ogr deve fazer: "IOError [breve descrição]".
Sgillies

Desculpe, o que eu estava tentando dizer era que "o objeto 'NoneType' não tem atributo 'GetLayerCount'" é uma mensagem de erro bastante padrão do Python que geralmente ocorre quando você espera que um objeto tenha sido atribuído e, por qualquer motivo, não ser designado. Desculpe isso não estava claro.
Nicksan

7

@ A resposta de Nick está correta: "NoneType" significa que a fonte de dados não pôde ser aberta. OGR (e GDAL) não geram exceções onde normalmente deveriam e, infelizmente ogr.UseExceptions(), não parecem fazer nada útil. Aqui está o meu bloco de código usual para realmente gerar as exceções apropriadas:

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

Eu encontrei esse erro antes e fiquei preso por tanto tempo. Eu consegui trabalhar usando um shapefile diferente. O shapefile dos EUA deve estar corrompido ou algo assim. Estou usando o gdal1.6 aqui.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.