Rasterize ang isangefefile na may Geopandas o fiona - python

Rasterize Shapefile With Geopandas



Solusyon:

Nasa tamang track ka at ang geopandas GeoDataFrame ay isang mahusay na pagpipilian para sa rasterization sa paglipas ng Fiona. Ang Fiona ay isang mahusay na toolet, ngunit sa palagay ko ang DataFrame ay mas angkop sa mga hugis ng larawan at geometry kaysa sa mga nakapugad na mga diksyonaryo.

i-import ang mga geopandas bilang gpd import rasterio mula sa mga tampok sa pag-import ng rasterio

I-set up ang iyong mga filename



shp_fn = 'cb_2013_us_county_20m.shp' rst_fn = 'template_raster.tif' out_fn = './rasterized.tif'

Buksan ang file gamit ang GeoPANDAS read_file



counties = gpd.read_file (shp_fn)

Idagdag ang bagong haligi (tulad ng sa iyong code sa itaas)



para sa saklaw (len (counties)): LSAD = counties.at [i, 'LSAD'] kung 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'

Buksan ang raster file na nais mong gamitin bilang isang template para sa pagsunog ng tampok gamit ang rasterio

rst = rasterio.open (rst_fn)

kopyahin at i-update ang metadata mula sa input raster para sa output

meta = rst.meta.copy () meta.update (compress = 'lzw')

Ngayon sunugin ang mga tampok sa raster at isulat ito



na may rasterio.open (out_fn, 'w +', ** meta) tulad ng out: out_arr = out.read (1) # dito tayo lumilikha ng isang generator ng geom, mga pares ng halaga na gagamitin sa pag-rasterize ng mga hugis = ((geom, halaga ) para sa geom, halaga sa zip (counties.geometry, counties.LSAD_NUM)) burn = Features.rasterize (mga hugis = hugis, punan = 0, out = out_arr, transform = out.transform) out.write_band (1, sinunog)

Ang pangkalahatang ideya ay upang lumikha ng isang umuulit na naglalaman ng mga tuple ng (geometry, halaga), kung saan ang geometry ay isang hugis na geometry at ang halaga ay nais mong sunugin sa raster sa lokasyon ng geometry na iyon. Parehong gumagamit ng magandang geometry ang parehong Fiona at GeoPANDAS kaya't swerte ka doon. Sa halimbawang ito ang isang generator ay ginagamit upang umulit sa pamamagitan ng (mga geometry, halaga) na mga pares na nakuha mula sa GeoDataFrame at pinagsama gamit ang zip ().

Siguraduhin na buksan mo angout_fn file saw + mode, dahil kakailanganin itong magamit para sa pagbabasa at pagsusulat.


Ang geocube ay isang bagong tool na partikular na idinisenyo para sa pag-rasterize ng data ng geopandas na bumabalot sa rasterio. Pinapasimple nito ang proseso at inaalis ang pangangailangan para sa isang template raster.

https://github.com/corteva/geocube

Sa konteksto ng halimbawa sa itaas:

mula sa geocube.api.core import make_geocube import geopandas counties = geopandas.read_file ('zip: //cb_2013_us_county_20m.zip/cb_2013_us_county_20m.shp')

Ang titik ay maaaring itakda sa dataframe tulad nito:

counties ['LSAD_LETTER'] = 'NA' lsad_letter = counties.LSAD_LETTER.copy () lsad_letter [counties.LSAD == '00'] = 'A' lsad_letter [counties.LSAD == '03'] = 'B' lsad_letter [counties.LSAD == '04'] = 'C' lsad_letter [counties.LSAD == '05'] = 'D' lsad_letter [counties.LSAD == '06'] = 'E' lsad_letter [counties.LSAD = = '13 '] =' F 'lsad_letter [counties.LSAD ==' 15 '] =' G 'lsad_letter [counties.LSAD ==' 25 '] =' I 'counties [' LSAD_LETTER '] = lsad_letter

Gayunpaman, ang mga halagang bilang lamang ang maaaring ma-rasterize. Narito ang isang kategoryang halimbawa: https://corteva.github.io/geocube/stable/examples/categorical.html

Kaya, sa halip na gamitin iyon, gamitin ang mga numero sa format ng string at i-convert sa mga integer:

counties ['LSAD_NUM'] = counties.LSAD.astype (int)

Pagkatapos, rasterize ang data:

cube = make_geocube (mga lalawigan, pagsukat = ['LSAD_NUM'], resolusyon = (1, -1),)

ipasok ang paglalarawan ng imahe dito

Panghuli, i-export ito sa isang raster:

cube.LSAD_NUM.rio.to_raster ('lsad_num.tif')