OGR CreateLayer gibt TypeError zurück


9

Ich versuche, eine Shapefile-Ebene basierend auf der räumlichen Projektion eines bereits vorhandenen Rasters zu erstellen. (Letztendlich wird dies in gdal.Polygonize verwendet, um eine Form aus meinen Rasterdaten zu erhalten.) Beim Versuch, CreateLayer zu verwenden, tritt jedoch ein Fehler auf.

  • raster_uri- Speicherort der Rasterdatei, die ich in ein Shapefile umwandeln möchte. Ich weiß, dass es das gibt.
  • out_uri- Speicherort Ich möchte, dass das neue Shapefile gedruckt wird.
  • Layername - Eingabe des String-Layernamens.
  • file_name- Eingabe des String-Feldnamens.

Dies ist der Code, den ich verwendet habe.

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)

Es wird folgende Fehlermeldung angezeigt:

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

Die Ausgabe des Typs spat_ref wird <class 'osgeo.osr.SpatialReference'>so angezeigt, dass ich nicht sicher bin, über welches char const * es sich beschwert.

Interessanterweise wird die Ebene einwandfrei erstellt, wenn ich versuche, dies alles über eine Python-Shell mit derselben Datei zu tun. Irgendwelche Ideen, was das Problem sein könnte?

Antworten:


10

Wie sich herausstellt, kann das Erstellen eines Ebenennamens in einem ESRI-Shapefile nicht mit einer Unicode-Zeichenfolge durchgeführt werden. Seit ich in meinem Dateisystem Layernamen dynamisch aus einer Reihe von Dateinamen gezogen habe, habe ich Unicode zugelassen, dies wird jedoch von CreateLayer () nicht unterstützt. Das Problem wurde (irgendwie behoben) wie folgt behoben:

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

Jetzt läuft es einwandfrei, allerdings mit einem etwas kleineren potenziellen Zeichensatz.


Vielen Dank für die Antwort, die mir geholfen hat, mein Problem zu lösen. Ich habe tiefer gegraben und einen verwandten Beitrag auf SO gefunden, der es gut erklärt. Ich werde meine Ergebnisse in einer Antwort zusammenfassen, damit sie auch anderen helfen kann. (Spoiler: Nur Casting auf String hat mein Problem gelöst)
DarkCygnus

0

Als ich mich eingehender mit diesem Thema befasste, fand ich diese SO-Antwort , die eine Lösung für das Problem bot, das ich hatte.

Es scheint, dass in Ihrem Fall hier layer_nameeinige Unicode- Zeichen enthalten sind, die nicht auf einfache Weise in eine 'char const *' konvertiert werden können, und der Grund, warum Sie die Ausnahme erhalten.

Aus diesem Grund funktioniert die in der akzeptierten Antwort vorgeschlagene Lösung, da sie die Codierung in eine UTF-8-Byte-Zeichenfolge ändert, die leicht in 'char const *' konvertiert werden kann (zufällig wurde dies auch in einer anderen Antwort auf derselben SO vorgeschlagen Post).

Was für mich als Alternative funktioniert hat, ist, einfach Ihre layer_nameZeichenfolge zu besetzen, indem Sie Folgendes tun:

layer = ds.CreateLayer(str(layer_name), spat_ref, ogr.wkbPolygon)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.