Saya perlu merasterisasi shapefile yang sangat sederhana sedikit seperti ini http://tinyurl.com/odfbanu . Yang hanya merupakan negara coutaining shapefile di AS. Saya telah melihat jawaban sebelumnya: GDAL RasterizeLayer tidak Membakar Semua Poligon ke Raster? tapi saya bertanya-tanya apakah ada cara untuk melakukannya menggunakan Geopanda atau fiona dan mungkin rasterio untuk bagian penulisan tiff.
Jadi tujuan saya adalah merasterisasi dan menetapkan nilai untuk setiap poligon yang berbagi nilai umum, LSAD dalam pengecualian.
Jadi saya menulis awal kode yang terinspirasi oleh shongololo di utas: Melarutkan poligon berdasarkan atribut dengan Python (rupawan, fiona)? .
from geopandas import GeoDataFrame
name_in = 'cb_2013_us_county_20m.shp'
#Open the file with geopandas
counties = GeoDataFrame.from_file(name_in)
#Add a column to the Geodataframe containing the new value
for i in range (len(counties)):
LSAD = counties.at[i,'LSAD']
if LSAD == 00 :
counties['LSAD_NUM'] == 'A'
elif LSAD == 03 :
counties['LSAD_NUM'] == 'B'
elif LSAD == 04 :
counties['LSAD_NUM'] == 'C'
elif LSAD == 05 :
counties['LSAD_NUM'] == 'D'
elif LSAD == 06 :
counties['LSAD_NUM'] == 'E'
elif LSAD == 13 :
counties['LSAD_NUM'] == 'F'
elif LSAD == 15 :
counties['LSAD_NUM'] == 'G'
elif LSAD == 25 :
counties['LSAD_NUM'] == 'I'
else :
counties['LSAD_NUM'] == 'NA'
Benar-benar hal yang mudah jadi sekarang saya bertanya-tanya bagaimana saya bisa benar-benar menulis bentuk-bentuk itu ke tiff. Saya mulai bekerja dengan Geopanda karena saya percaya itu adalah pilihan terbaik tetapi jika Anda memiliki saran fiona saya siap untuk itu juga.
Saya menemukan sepotong kode dari rasterio yang tampaknya dapat mengambil bentuk geometri dan membakarnya menjadi raster baru http://tinyurl.com/op49uek
# I guess that my goal should be to load my list of geometries under geometry to be able to pass it to rasterio later on
geometry = {'type':'Polygon','coordinates':[[(2,2),(2,4.25),(4.25,4.25),(4.25,2),(2,2)]]}
with rasterio.drivers():
result = rasterize([geometry], out_shape=(rows, cols))
with rasterio.open(
"test.tif",
'w',
driver='GTiff',
width=cols,
height=rows,
count=1,
dtype=numpy.uint8,
nodata=0,
transform=IDENTITY,
crs={'init': "EPSG:4326"}) as out:
out.write_band(1, result.astype(numpy.uint8))
sumber
Jawaban:
Anda berada di jalur yang benar dan geopandas GeoDataFrame adalah pilihan yang baik untuk rasterisasi di atas Fiona. Fiona adalah toolset yang hebat, tapi saya pikir bahwa DataFrame lebih cocok untuk shapefile dan geometri daripada kamus bersarang.
Siapkan nama file Anda
Buka file dengan GeoPANDAS read_file
Tambahkan kolom baru (seperti pada kode Anda di atas)
Buka file raster yang ingin Anda gunakan sebagai templat untuk pembakaran fitur menggunakan rasterio
salin dan perbarui metadata dari raster input untuk output
Sekarang bakar fitur-fiturnya ke dalam raster dan tuliskan
Gagasan keseluruhan adalah untuk membuat tuple berisi (geometri, nilai) yang dapat diubah, di mana geometri adalah geometri yang indah dan nilainya adalah apa yang ingin Anda bakar ke dalam raster di lokasi geometri itu. Baik Fiona dan GeoPANDAS menggunakan geometri yang indah sehingga Anda beruntung di sana. Dalam contoh ini generator digunakan untuk beralih melalui pasangan (geometri, nilai) yang diekstrak dari GeoDataFrame dan bergabung bersama menggunakan zip ().
Pastikan Anda membuka
out_fn
file dalamw+
mode, karena itu harus digunakan untuk membaca dan menulis.sumber
geocube adalah alat baru yang dirancang khusus untuk meraster data geopanda yang membungkus rasterio. Ini menyederhanakan proses dan menghilangkan kebutuhan untuk raster template.
https://github.com/corteva/geocube
Dalam konteks contoh di atas:
Surat itu dapat diatur pada kerangka data seperti:
Namun, hanya nilai numerik yang dapat dirasterisasi. Berikut ini adalah contoh kategorikal: https://corteva.github.io/geocube/stable/examples/categorical.html
Jadi, alih-alih menggunakan itu, gunakan angka dalam format string dan konversikan ke integer:
Kemudian, rasterisasi data:
Terakhir, ekspor ke raster:
sumber