OGR CreateLayer devuelve TypeError


9

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

  • raster_uri- ubicación del archivo ráster que quiero convertir en un archivo de forma. Sé que esto existe.
  • out_uri- Ubicación Quiero que se imprima el nuevo shapefile.
  • layer_name- Cadena de entrada de nombre de capa.
  • nombre_archivo- Entrada de nombre de campo de cadena.

Este es el código que estaba usando.

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)

Produce este mensaje de error:

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

La salida del tipo de spat_ref aparece <class 'osgeo.osr.SpatialReference'>así que no estoy seguro de qué char const * se está quejando.

Curiosamente, si trato de hacer todo esto desde un shell de Python usando el mismo archivo, la capa se crea muy bien. ¿Alguna idea sobre cuál podría ser el problema?

Respuestas:


10

Como resultado, la creación de un nombre de capa en un archivo de forma ESRI no se puede hacer usando una cadena Unicode. Desde hace mucho tiempo en mi sistema de archivos, estaba extrayendo dinámicamente los nombres de capa de un conjunto de nombres de archivos, estaba permitiendo unicode, pero no es compatible 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 bien, aunque con un conjunto de caracteres potenciales ligeramente más pequeños.


Gracias por la respuesta, finalmente me ayudó a resolver mi problema. Cavé más profundo y encontré una publicación relacionada en SO que lo explica bien; Condensaré mis hallazgos en una respuesta para que pueda ayudar a otros también. (spoiler: solo lanzar a una cadena resolvió mi problema)
DarkCygnus el

0

Profundizando en este tema, encontré esta respuesta SO que proporcionaba una solución al problema que estaba teniendo.

Parece que, en su caso aquí, layer_namecontiene algunos caracteres Unicode , que no se pueden convertir de manera trivial a 'char const *', y la razón por la que obtiene la excepción.

Esta es la razón por la cual 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 SO enviar).

Lo que funcionó para mí como alternativa es simplemente convertir su layer_namecadena a:

layer = ds.CreateLayer(str(layer_name), spat_ref, ogr.wkbPolygon)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.