Poligon GDAL dalam python membuat poligon kosong?

12

Saya mengalami masalah menggunakan fungsi Polygonize di python. Contoh buku resep untuk ini dapat ditemukan di sini .

Bagian yang relevan dari kode saya adalah:

sourceRaster = gdal.Open('myraster.tif')
band = sourceRaster.GetRasterBand(1)
bandArray = band.ReadAsArray()
outShapefile = "polygonized"
driver = ogr.GetDriverByName("ESRI Shapefile")
if os.path.exists(outShapefile+".shp"):
    driver.DeleteDataSource(outShapefile+".shp")
outDatasource = driver.CreateDataSource(outShapefile+ ".shp")
outLayer = outDatasource.CreateLayer("polygonized", srs=None)
gdal.Polygonize( band, None, outLayer, -1, [], callback=None )
outDatasource.Destroy()
sourceRaster = None

Saya tahu bahwa band ini memiliki informasi yang relevan, berikut adalah cuplikan dari bandArray:

array([[ 4.,  4.,  3.,  3.,  3.,  2.,  2.,  2.,  2.,  3.,  3.,  3.,  3.,
         3.,  3.,  3.,  3.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,
         4.,  4.,  4.,  4.],

Ketika saya membuka tabel atribut di QGIS, itu kosong: Screencapture QGIS

Edit:

Konversi berfungsi dengan baik di QGIS menggunakan Raster -> Conversion -> Polygonize tool

Cuplikan layar raster yang akan dipoligonisasi:

raster untuk poligonisasi

Dan tangkapan layar konversi yang dihasilkan dari alat QGIS:

raster poligonisasi dari alat QGIS

Saya menggunakan distro Enthought pada Windows 7, GDAL versi 1.10.0-3

Masalahnya adalah bahwa saya tidak dapat mempolarisasi raster di python menggunakan GDAL dan contoh buku masak, saya bisa mempolimerisasi raster yang sama ini tanpa masalah di GUI QGIS

Camdenl
sumber
Seperti apa rupa raster Anda? Apakah ini benar-benar mengandung poligon? Apakah itu berfungsi jika Anda menggunakan gdal_polygonize.py?
BradHards
Diedit untuk menambahkan tangkapan layar proses kerja di QGIS
camdenl
Apa masalah sebenarnya di sini?
Fezter
Menambahkan masalah khusus
camdenl
3
Saya memiliki masalah serupa (blank shapefile sedang dibuat), dan membuat bidang tidak membantu. Apa yang saya lakukan salah adalah bahwa saya belum menutup shapefile dalam kode saya sebelum memanggil poligon. Anda menutupnya dalam contoh Anda, saya hanya memposting ini untuk referensi orang lain.
Stephanie

Jawaban:

19

Masalahnya adalah saya tidak membuat bidang untuk menyimpan band raster. Setelah menggali melalui file gdal_polygonize.py, saya menyadari ini tidak secara otomatis dilakukan saat memanggil gdal.Polygonize, yang alih-alih menggunakan fungsi yang ditemukan di sini .

Inilah langkah ekstra yang diperlukan untuk membuat bidang dan menulis band ke bidang:

newField = ogr.FieldDefn('MYFLD', ogr.OFTInteger)
outLayer.CreateField(newField)

Kami kemudian dapat menulis band ke bidang ini, dengan indeks 0:

gdal.Polygonize(band, None, outLayer, 0, [], callback=None )
Camdenl
sumber
Saya juga mencoba menggunakan fungsi gdal.Polygonize () untuk mendapatkan raster saya sebagai poligon dalam python. Tetapi pada garis akhir itu menunjukkan kesalahan runtime !! Mengapa?
Shiuli Pervin
Ini berfungsi baik dengan file raster yang di-georeferensi. Hasilnya terlalu banyak poligon, tetapi saya hanya ingin satu poligon besar yang menunjukkan garis besar raster. Adakah yang tahu cara kerjanya sekaligus?
Shiuli Pervin
Masih saya mendapatkan shapefile kosong, tetapi saya memiliki baris dalam file dbf. Tolong jelaskan saya!
Satya Chandra
Saya baru saja mengalami masalah ini tetapi alih-alih menambahkan bidang dummy, Anda dapat memasukkan indeks -1. Lihat di sini bahwa bidang hanya ditambahkan jika indeks> = 0.
jon_two