J'ai besoin de pixelliser un fichier de formes vraiment simple un peu comme ceci http://tinyurl.com/odfbanu . Ce qui est juste un fichier de formes contenant des pays aux États-Unis.J'ai vu cette réponse précédente: GDAL RasterizeLayer ne brûle pas tous les polygones en raster? mais je me demandais s'il y avait un moyen de le faire en utilisant Geopandas ou fiona et peut-être rasterio pour la partie d'écriture tiff.
Mon objectif est donc de le pixelliser et d'attribuer une valeur à chaque polygone partageant une valeur commune, LSAD dans l'exempe.
J'ai donc écrit le début du code inspiré du shongololo dans le fil: Dissoudre des polygones basés sur des attributs avec Python (galbe, 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'
Des trucs vraiment faciles alors maintenant je me demande comment puis-je réellement écrire ces formes sur un tiff. J'ai commencé à travailler avec Geopandas car je pensais que c'était la meilleure option, mais si vous avez une suggestion de Fiona, je suis d'accord.
J'ai trouvé un morceau de code de rasterio qui semble pouvoir prendre une géométrie galbée et la graver dans un nouveau 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))
la source
Réponses:
Vous êtes sur la bonne voie et les géopandas GeoDataFrame sont un bon choix pour la pixellisation sur Fiona. Fiona est un excellent ensemble d'outils, mais je pense que le DataFrame est mieux adapté aux fichiers de formes et aux géométries que les dictionnaires imbriqués.
Configurez vos noms de fichiers
Ouvrez le fichier avec GeoPANDAS read_file
Ajoutez la nouvelle colonne (comme dans votre code ci-dessus)
Ouvrez le fichier raster que vous souhaitez utiliser comme modèle pour la gravure d'entités à l'aide de rasterio
copier et mettre à jour les métadonnées du raster en entrée pour la sortie
Maintenant, gravez les entités dans le raster et écrivez-les
L'idée générale est de créer un itérable contenant des tuples de (géométrie, valeur), où la géométrie est une géométrie galbée et la valeur est ce que vous voulez graver dans le raster à l'emplacement de cette géométrie. Fiona et GeoPANDAS utilisent des géométries galbées, vous avez donc de la chance. Dans cet exemple, un générateur est utilisé pour parcourir les paires (géométrie, valeur) qui ont été extraites du GeoDataFrame et réunies à l'aide de zip ().
Assurez-vous d'ouvrir le
out_fn
fichier enw+
mode, car il devra être utilisé pour la lecture et l'écriture.la source
geocube est un nouvel outil spécialement conçu pour rasteriser les données géopandas qui encapsule rasterio. Il simplifie le processus et élimine le besoin d'un raster de modèle.
https://github.com/corteva/geocube
Dans le cadre de l'exemple ci-dessus:
La lettre peut être définie sur la trame de données comme suit:
Cependant, seules les valeurs numériques peuvent être pixellisées. Voici un exemple catégorique: https://corteva.github.io/geocube/stable/examples/categorical.html
Donc, au lieu d'utiliser cela, utilisez les nombres au format chaîne et convertissez-les en entiers:
Ensuite, pixellisez les données:
Enfin, exportez-le vers un raster:
la source