1 votos

Python deja de funcionar en Windows al llamar a layer.GetFeatureCount() de OGR

Mi pregunta se refiere a OGR en Python3 en Windows . Así que he instalado gdal de la archivo de la rueda y empecé a jugar con OGR funciones, pero hay un problema que me encuentro y que no puedo entender. Si GetFeatureCount() es llamado en una capa que fue abierta en un archivo separado Python deja de funcionar, pero no si todo mi código está en el mismo script (leer y obtener el conteo de características).

El código siguiente funciona:

from osgeo import ogr

filename = '<path>'
driver = ogr.GetDriverByName("ESRI Shapefile")
datasource = driver.Open(filename)
layer = datasource.GetLayer()
print('Features count:', layer.GetFeatureCount())

Pero si muevo la apertura de la capa del shapefile a un archivo separado, ya no funciona (Python deja de funcionar de alguna manera):

class IO:
    @staticmethod
    def read_vector(filename):
        # load vector
        driver = ogr.GetDriverByName("ESRI Shapefile")
        datasource = driver.Open(filename)
        layer = datasource.GetLayer()

        return layer

Y llamó desde este archivo:

from gdal_io import IO

filename =  '<path>'
layer = IO.read_vector(filename)
print('Features count:', layer.GetFeatureCount())

¿Es necesario algo después de leer el vector shapefile con OGR ?

3voto

Lucas Puntos 128

Has sido mordido por un conocido GDAL/OGR Python "gotcha" .

Edición : Su referencia a la fuente de datos ha salido del ámbito (sólo se hace referencia a ella en el método estático) y ha dejado huérfano su objeto de capa, lo que provoca un fallo.

Nota : Esto no es porque hayas abierto la fuente de datos desde una clase de un módulo importado, podrías reproducirlo simplemente definiendo una función en tu script que abra una fuente de datos, obtenga una capa y devuelva sólo la capa. O incluso utilizando algo como layer = ogr.Open(filename).GetLayer() . De cualquier manera, el datasource es desreferenciado y python se bloqueará si se intenta utilizar el objeto de capa huérfano.

Solución : Devuelve la fuente de datos, no la capa. O utilice fiona una interfaz mucho más pitónica para OGR.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X