9 votos

OGR CreateLayer devuelve TypeError

Estoy intentando crear una capa shapefile basada en la proyección espacial de un raster ya existente. (En última instancia, esto se utilizará en gdal.Polygonize para obtener una forma de mis datos raster). Sin embargo, me encuentro con un error al intentar utilizar CreateLayer.

  • raster_uri- ubicación del archivo raster que quiero convertir en un shapefile. Sé que esto existe.
  • out_uri- Lugar donde quiero que se imprima el nuevo shapefile.
  • layer_name- Cadena de entrada del nombre de la capa.
  • filed_name- Cadena de entrada del nombre del campo.

Este es el código que estaba utilizando.

raster = gdal.Open(raster_uri)
driver = ogr.GetDriverByName("ESRI Shapefile")
ds = driver.CreateDataSource(out_uri)

spat_ref = osr.SpatialReference()
proj = raster.GetProjectionRef()
spat_ref.ImportFromWkt(proj)

layer = ds.CreateLayer(layer_name, spat_ref, ogr.wkbPolygon)

El resultado es este mensaje de error:

TypeError: in method 'DataSource_CreateLayer', argument 2 of type 'char const *'

La salida del tipo de spat_ref aparece como <class 'osgeo.osr.SpatialReference'> por lo que no sé de qué char const * se está quejando.

Curiosamente, si trato de hacer todo esto desde un shell de python utilizando el mismo archivo, la capa crea sin problemas. ¿Alguna idea sobre lo que podría ser el problema?

10voto

cdecker Puntos 116

Resulta que la creación de un nombre de capa en un shapefile de ESRI no se puede hacer utilizando una cadena unicode. Desde que en mi sistema de archivos, estaba sacando dinámicamente los nombres de las capas de un conjunto de nombres de archivos, estaba permitiendo unicode, pero no está soportado con ese CreateLayer(). El problema se solucionó (más o menos) haciendo lo siguiente:

layer_name = layer_name.encode('utf-8')
layer = ds.CreateLayer(layer_name, spat_ref, ogr.wkbPolygon)

Ahora funciona muy bien, aunque con un conjunto de caracteres potenciales ligeramente menor.

0voto

strpt99 Puntos 11

Profundizando en esta cuestión he encontrado esta respuesta SO que proporcionó una solución al problema que tenía.

Parece que, en su caso, su layer_name contiene algunos Unicode que no pueden ser convertidos de manera trivial a un 'char const *', y la razón por la que se obtiene la excepción.

Por ello, la solución propuesta en la respuesta aceptada funciona, ya que cambia su codificación a una cadena de bytes UTF-8, que se puede convertir fácilmente a 'char const*' (casualmente, eso también se sugirió en otra respuesta en el mismo puesto del SO).

Lo que me ha funcionado como alternativa es simplemente _echa tu layer_name a la cadena_ haciendo:

layer = ds.CreateLayer(str(layer_name), spat_ref, ogr.wkbPolygon)

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