Necesito rasterizar un shapefile muy simple, un poco como esto http://tinyurl.com/odfbanu . Que no es más que un shapefile que contiene condados de EE.UU.. He visto esta respuesta anterior: ¿GDAL RasterizeLayer no graba todos los polígonos en raster? pero me preguntaba si hay una manera de hacerlo usando Geopandas o fiona y tal vez rasterio para la parte de escritura tiff.
Así que mi objetivo es rasterizarlo y asignar un valor a cada polígono que comparta un valor común, LSAD en el ejemplo.
Así que escribí el principio del código inspirado por shongololo en el hilo: ¿Disolver polígonos basándose en atributos con Python (shapely, 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'
Realmente fácil, así que ahora me pregunto cómo puedo escribir esas formas en un tiff. Empecé a trabajar con Geopandas como yo creía que era la mejor opción, pero si usted tiene una sugerencia fiona estoy dispuesto a ello también.
He encontrado un trozo de código de rasterio que parece ser capaz de tomar una geometría con forma y grabarlo en un nuevo raster 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))