OGR CreateLayer mengembalikan TypeError


9

Saya mencoba membuat layer shapefile berdasarkan proyeksi spasial dari raster yang sudah ada. (Pada akhirnya, ini akan digunakan di gdal.Polygonize untuk mendapatkan bentuk dari data raster saya.) Namun, saya menghadapi kesalahan ketika mencoba menggunakan CreateLayer.

  • raster_uri- lokasi file raster yang ingin saya buat menjadi shapefile. Saya tahu ini ada.
  • out_uri- Lokasi Saya ingin cetakan baru untuk dicetak.
  • layer_name- Input nama lapisan.
  • diajukan_name- Masukan nama bidang string.

Ini adalah kode yang saya gunakan.

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)

Ini menghasilkan pesan kesalahan ini:

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

Mengeluarkan tipe spat_ref muncul <class 'osgeo.osr.SpatialReference'>jadi saya tidak yakin apa yang dikeluhkan oleh char const *.

Menariknya, jika saya mencoba melakukan ini semua dari shell python menggunakan file yang sama, layer akan baik-baik saja. Ada ide tentang apa yang mungkin menjadi masalah?

Jawaban:


10

Ternyata, membuat nama layer pada ESRI shapefile tidak dapat dilakukan menggunakan string unicode. Sejak kembali ke sistem file saya, saya secara dinamis menarik nama-nama layer dari satu set nama file, saya mengizinkan unicode, tetapi tidak didukung dengan CreateLayer itu (). Masalahnya adalah (semacam diperbaiki) dengan melakukan hal berikut:

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

Sekarang berjalan dengan baik, meskipun dengan set karakter potensial yang sedikit lebih kecil.


Terima kasih atas jawabannya, membantu saya akhirnya menyelesaikan masalah saya. Saya menggali lebih dalam dan menemukan posting terkait di SO yang menjelaskannya dengan baik; Saya akan memadatkan temuan saya dalam jawaban sehingga dapat membantu orang lain juga. (spoiler: hanya casting ke string memecahkan masalah saya)
DarkCygnus

0

Menggali lebih dalam tentang masalah ini saya menemukan jawaban SO ini yang memberikan solusi untuk masalah yang saya alami.

Tampaknya, dalam kasus Anda di sini, Anda layer_nameberisi beberapa karakter Unicode , yang tidak dapat dikonversi secara sepele menjadi 'char const *', dan alasan mengapa Anda mendapatkan pengecualian.

Inilah sebabnya mengapa solusi yang diusulkan dalam jawaban yang diterima berfungsi, karena mengubah itu pengkodean ke string byte UTF-8, yang dapat dengan mudah dikonversi ke 'char const *' (kebetulan, yang juga disarankan dalam jawaban lain pada SO yang sama pos).

Apa yang berhasil bagi saya sebagai alternatif adalah dengan hanya melemparkan Anda layer_nameke string dengan melakukan:

layer = ds.CreateLayer(str(layer_name), spat_ref, ogr.wkbPolygon)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.