viernes, 20 de enero de 2017

Cómo crear nuevos campos en una geodataframe con GeoPandas y modificar sus valores

GeoPandas es un módulo python que facilita la manipulación de datos espaciales a través de instrucciones muy concisas. En este caso tocará introducir un nuevo campo al vectorial de la imagen siguiente (con un sólo campo en su tabla de atributos) cuando lo carguemos en memoria como geodataframe.


Las instrucciones siguientes preparan el sistema para crear, imprimir y graficar la geodataframe (gdf):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
>>>import geopandas as gpd
>>>gdf = gpd.read_file("pyqgis_data/test_polygon8.shp")
>>>from matplotlib import pyplot as plt
>>>plt.ion()
>>>gdf.plot()
<matplotlib.axes._subplots.AxesSubplot object at 0xab53b74c>
>>>print gdf
FID                                           geometry
0    0  POLYGON ((363445.8816669167 4460178.914137968,...
1    1  POLYGON ((410566.1276510805 4463034.251804442,...
2    2  POLYGON ((450747.2094816907 4445981.551269374,...
3    3  POLYGON ((425341.4022431545 4428919.808172906,...
4    4  POLYGON ((389474.3802593386 4424810.045237261,...
5    5  POLYGON ((353893.2286885064 4437738.459554237,...
6    6  POLYGON ((387280.3953692739 4446246.91081685, ...
7    7  POLYGON ((455879.5621058539 4428431.261835023,...

donde en la siguiente imagen se observa que lo graficado con matplotlib coincide con lo que se encuentra visualizado en la Map View de QGIS.


Las líneas a continuación añaden el nuevo campo a la geodataframe y se comprueba que fue éxitoso.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
>>>gdf['new_field'] = NULL
>>>new_values = gdf['new_field'].values
>>>print new_values
[NULL NULL NULL NULL NULL NULL NULL NULL]
>>>for i, value in enumerate(new_values):
...    new_values[i] = i
>>>print new_values
[0 1 2 3 4 5 6 7]
>>>print gdf
   FID                                           geometry new_field
0    0  POLYGON ((363445.8816669167 4460178.914137968,        0
1    1  POLYGON ((410566.1276510805 4463034.251804442,        1
2    2  POLYGON ((450747.2094816907 4445981.551269374,        2
3    3  POLYGON ((425341.4022431545 4428919.808172906,        3
4    4  POLYGON ((389474.3802593386 4424810.045237261,        4
5    5  POLYGON ((353893.2286885064 4437738.459554237,        5
6    6  POLYGON ((387280.3953692739 4446246.91081685,         6
7    7  POLYGON ((455879.5621058539 4428431.261835023,        7

Si se desea, se puede grabar como un nuevo archivo vectorial con:

1
>>>gdf.to_file("pyqgis_data/new_test_polygon8.shp")

Por defecto, se escribe como 'Esri shapefile' pero los drivers soportados se encuentran a continuación:

1
2
3
>>>import fiona
>>>fiona.supported_drivers
{'FileGDB': 'raw', 'ESRI Shapefile': 'raw', 'OpenFileGDB': 'r', 'PCIDSK': 'r', 'AeronavFAA': 'r', 'SUA': 'r', 'GPSTrackMaker': 'raw', 'ARCGEN': 'r', 'PDS': 'r', 'DGN': 'raw', 'GeoJSON': 'rw', 'GPKG': 'rw', 'MapInfo File': 'raw', 'Idrisi': 'r', 'GPX': 'raw', 'DXF': 'raw', 'BNA': 'raw', 'SEGY': 'r', 'GMT': 'raw'}



No hay comentarios: