OGR CreateLayer retorna TypeError


9

Estou tentando criar uma camada de shapefile com base na projeção espacial de uma varredura já existente. (Por fim, isso será usado no gdal.Polygonize para obter uma forma dos meus dados de varredura.) No entanto, estou encontrando um erro ao tentar usar o CreateLayer.

  • raster_uri- local do arquivo raster que eu quero transformar em um shapefile. Eu sei que isso existe.
  • out_uri- Location Quero que o novo shapefile seja impresso.
  • layer_name - Entrada do nome da camada de string.
  • filename_name- String nome do campo de entrada.

Este é o código que eu estava 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)

Ele gera esta mensagem de erro:

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

A saída do tipo de spat_ref aparece <class 'osgeo.osr.SpatialReference'>assim, não tenho certeza do que caractere const * está reclamando.

Curiosamente, se eu tentar fazer tudo isso a partir de um shell python usando o mesmo arquivo, a camada cria muito bem. Alguma idéia sobre qual pode ser o problema?

Respostas:


10

Como se vê, a criação de um nome de camada em um shapefile ESRI não pode ser feita usando uma string unicode. Desde o meu sistema de arquivos, eu estava puxando dinamicamente nomes de camadas de um conjunto de nomes de arquivos, estava permitindo unicode, mas isso não é suportado por esse CreateLayer (). O problema foi (meio que corrigido), fazendo o seguinte:

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

Agora ele funciona muito bem, embora com um conjunto de caracteres potencial ligeiramente menor.


Obrigado pela resposta, me ajudou a resolver meu problema. Eu cavei mais fundo e encontrei um post relacionado no SO que explica bem; Condensarei minhas descobertas em uma resposta para que também possa ajudar outras pessoas. (Spoiler: basta lançar a corda resolvido meu problema)
DarkCygnus

0

Indo mais fundo nesta questão, encontrei esta resposta para fornecer uma solução para o problema que estava tendo.

Parece que, no seu caso aqui, o seu layer_namecontém alguns caracteres Unicode , que não podem ser convertidos de maneira trivial em um 'char const *' e a razão pela qual você recebe a exceção.

É por isso que a solução proposta na resposta aceita funciona, pois altera a codificação para uma sequência de bytes UTF-8, que pode ser facilmente convertida em 'char const *' (coincidentemente, isso também foi sugerido em outra resposta na mesma SO postar).

O que funcionou para mim como alternativa é simplesmente converter sua layer_namestring fazendo:

layer = ds.CreateLayer(str(layer_name), spat_ref, ogr.wkbPolygon)
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.