Introduction à GeoPandas¶
Ce didacticiel rapide présente les concepts clés et les fonctionnalités de base de GeoPandas pour vous aider à démarrer vos projets.
Concepts¶
GeoPandas, comme son nom l'indique, étend la populaire bibliothèque de science des données pandas en ajoutant la prise en charge des données géospatiales. Si vous n'êtes pas familier avec « pandas », nous vous recommandons de jeter un coup d'œil rapide à sa documentation de démarrage avant de continuer.
La structure de données de base de GeoPandas est « geopandas.GeoDataFrame », une sous-classe de « pandas.DataFrame », qui peut stocker des colonnes géométriques et effectuer des opérations spatiales. Le geopandas.GeoSeries
, une sous-classe de pandas.Series
, gère les géométries. Par conséquent, votre GeoDataFrame
est une combinaison de pandas.Series
, avec des données traditionnelles (numériques, booléennes, texte, etc.), et de geopandas.GeoSeries
, avec des géométries (points, polygones, etc.). Vous pouvez avoir autant de colonnes avec des géométries que vous le souhaitez ; il n'y a pas de limite typique pour les logiciels SIG de bureau.
Chaque « GeoSeries » peut contenir n'importe quel type de géométrie (vous pouvez même les mélanger dans un seul tableau) et possède un attribut « GeoSeries.crs », qui stocke des informations sur la projection (CRS signifie Coordonnées Reference System). Par conséquent, chaque GeoSeries
dans un GeoDataFrame
peut se trouver dans une projection différente, vous permettant par exemple d'avoir plusieurs versions (projections différentes) de la même géométrie.
Une seule GeoSeries
dans un GeoDataFrame
est considérée comme la géométrie active, ce qui signifie que toutes les opérations géométriques appliquées à un GeoDataFrame
opèrent sur cette colonne active.
En savoir plus sur les structures de données dans le guide de l'utilisateur.
Voyons comment certains de ces concepts fonctionnent dans la pratique.
Lecture et écriture de fichiers¶
Tout d’abord, nous devons lire certaines données.
Lecture de fichiers¶
En supposant que vous disposez d'un fichier contenant à la fois des données et de la géométrie (par exemple GeoPackage, GeoJSON, Shapefile), vous pouvez le lire en utilisant geopandas.read_file()
, qui détecte automatiquement le type de fichier et crée un GeoDataFrame
. Ce didacticiel utilise le jeu de données « nybb », une carte des arrondissements de New York, disponible via le package « geodatasets ». Par conséquent, nous utilisons geodatasets.get_path()
pour télécharger l'ensemble de données et récupérer le chemin d'accès à la copie locale.
import geopandas
import fiona
gpkg = "./data/bouira_com.gpkg"
layers = fiona.listlayers(gpkg)
layers
['landuse', 'Autoroute', 'place', 'output', 'waterway', 'lac', 'batiments', 'Autoroutes', 'places', 'cbouira']
path_to_data ="./data/wbouira.shp"
gdf = geopandas.read_file(path_to_data)
gdf
ID_0 | ISO | NAME_0 | ID_1 | NAME_1 | ID_2 | NAME_2 | TYPE_2 | ENGTYPE_2 | X | Y | Population | superficie | geometry | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 5 | DZA | Algeria | 12 | Bouira | 353 | AGHBALOU | Commune | Commune | None | None | None | None | POLYGON ((478679.140 4354598.121, 478546.437 4... |
1 | 5 | DZA | Algeria | 12 | Bouira | 354 | AHL-EL-KSAR | Commune | Commune | None | None | None | None | POLYGON ((458096.559 4339404.491, 458085.518 4... |
2 | 5 | DZA | Algeria | 12 | Bouira | 355 | AHNIF | Commune | Commune | None | None | None | None | POLYGON ((473835.421 4332764.866, 473715.086 4... |
3 | 5 | DZA | Algeria | 12 | Bouira | 356 | AIN-BESSEM | Commune | Commune | None | None | None | None | POLYGON ((410218.793 4335155.776, 410175.479 4... |
4 | 5 | DZA | Algeria | 12 | Bouira | 357 | AIN-EL-HADJAR | Commune | Commune | None | None | None | None | POLYGON ((426730.571 4349243.480, 426751.618 4... |
5 | 5 | DZA | Algeria | 12 | Bouira | 358 | AIN-LALOUI | Commune | Commune | None | None | None | None | POLYGON ((414504.920 4348625.545, 414544.439 4... |
6 | 5 | DZA | Algeria | 12 | Bouira | 359 | AIN-TURK | Commune | Commune | None | None | None | None | POLYGON ((428803.448 4359789.178, 428789.328 4... |
7 | 5 | DZA | Algeria | 12 | Bouira | 360 | AIT-LAAZIZ | Commune | Commune | None | None | None | None | POLYGON ((438557.715 4363083.038, 438550.470 4... |
8 | 5 | DZA | Algeria | 12 | Bouira | 361 | AOMAR | Commune | Commune | None | None | None | None | POLYGON ((427249.759 4363316.919, 427215.814 4... |
9 | 5 | DZA | Algeria | 12 | Bouira | 362 | ATH-MANSOUR | Commune | Commune | None | None | None | None | POLYGON ((476926.874 4347296.472, 476937.331 4... |
10 | 5 | DZA | Algeria | 12 | Bouira | 363 | BECHLOUL | Commune | Commune | None | None | None | None | POLYGON ((448654.516 4340431.766, 448587.580 4... |
11 | 5 | DZA | Algeria | 12 | Bouira | 364 | BIR-GHBALOU | Commune | Commune | None | None | None | None | POLYGON ((405529.010 4338312.000, 405500.293 4... |
12 | 5 | DZA | Algeria | 12 | Bouira | 365 | BORDJ-OKHRISS | Commune | Commune | None | None | None | None | POLYGON ((426167.406 4307012.819, 426155.834 4... |
13 | 5 | DZA | Algeria | 12 | Bouira | 366 | BOUDERBALA | Commune | Commune | None | None | None | None | POLYGON ((392844.922 4384172.391, 393300.784 4... |
14 | 5 | DZA | Algeria | 12 | Bouira | 367 | BOUIRA | Chef-Lieu-Wilaya | Chef-Lieu-Wilaya | None | None | None | None | POLYGON ((426730.571 4349243.480, 426779.672 4... |
15 | 5 | DZA | Algeria | 12 | Bouira | 368 | BOUKRAM | Commune | Commune | None | None | None | None | POLYGON ((367367.903 4376059.806, 367446.384 4... |
16 | 5 | DZA | Algeria | 12 | Bouira | 369 | CHORFA | Commune | Commune | None | None | None | None | POLYGON ((482711.458 4348736.265, 482508.635 4... |
17 | 5 | DZA | Algeria | 12 | Bouira | 370 | DECHMIA | Commune | Commune | None | None | None | None | POLYGON ((408931.705 4328727.688, 408930.484 4... |
18 | 5 | DZA | Algeria | 12 | Bouira | 371 | DIRRAH | Commune | Commune | None | None | None | None | POLYGON ((425063.899 4306334.275, 424907.601 4... |
19 | 5 | DZA | Algeria | 12 | Bouira | 372 | DJEBAHIA | Commune | Commune | None | None | None | None | POLYGON ((420478.102 4359749.067, 420458.276 4... |
20 | 5 | DZA | Algeria | 12 | Bouira | 373 | EL-ADJIBA | Commune | Commune | None | None | None | None | POLYGON ((460499.867 4340479.707, 460328.679 4... |
21 | 5 | DZA | Algeria | 12 | Bouira | 374 | EL-ASNAM | Commune | Commune | None | None | None | None | POLYGON ((448654.516 4340431.766, 448578.928 4... |
22 | 5 | DZA | Algeria | 12 | Bouira | 375 | EL-HACHIMIA | Commune | Commune | None | None | None | None | POLYGON ((422183.497 4320581.606, 422180.949 4... |
23 | 5 | DZA | Algeria | 12 | Bouira | 376 | EL-HAKIMIA | Commune | Commune | None | None | None | None | POLYGON ((426167.406 4307012.819, 426180.092 4... |
24 | 5 | DZA | Algeria | 12 | Bouira | 377 | EL-KHABOUZIA | Commune | Commune | None | None | None | None | POLYGON ((406837.782 4338739.186, 406761.875 4... |
25 | 5 | DZA | Algeria | 12 | Bouira | 378 | EL-MOKRANI | Commune | Commune | None | None | None | None | POLYGON ((396860.440 4360082.101, 396878.913 4... |
26 | 5 | DZA | Algeria | 12 | Bouira | 379 | GUERROUMA | Commune | Commune | None | None | None | None | POLYGON ((389988.008 4371789.183, 389836.169 4... |
27 | 5 | DZA | Algeria | 12 | Bouira | 380 | HADJERA-ZERGA | Commune | Commune | None | None | None | None | POLYGON ((426299.313 4306507.583, 426368.239 4... |
28 | 5 | DZA | Algeria | 12 | Bouira | 381 | HAIZER | Commune | Commune | None | None | None | None | POLYGON ((438349.557 4351516.227, 438372.700 4... |
29 | 5 | DZA | Algeria | 12 | Bouira | 382 | KADIRIA | Commune | Commune | None | None | None | None | POLYGON ((405093.292 4365529.805, 405058.232 4... |
30 | 5 | DZA | Algeria | 12 | Bouira | 383 | LAKHDARIA | Commune | Commune | None | None | None | None | POLYGON ((400237.763 4373757.549, 400226.191 4... |
31 | 5 | DZA | Algeria | 12 | Bouira | 384 | M'CHEDALLAH | Commune | Commune | None | None | None | None | POLYGON ((464933.002 4354447.250, 465100.739 4... |
32 | 5 | DZA | Algeria | 12 | Bouira | 385 | MAALA | Commune | Commune | None | None | None | None | POLYGON ((397325.432 4361620.207, 397313.277 4... |
33 | 5 | DZA | Algeria | 12 | Bouira | 386 | MAAMOURA | Commune | Commune | None | None | None | None | POLYGON ((407438.423 4292686.264, 407420.773 4... |
34 | 5 | DZA | Algeria | 12 | Bouira | 387 | MEZDOUR | Commune | Commune | None | None | None | None | POLYGON ((452784.132 4306053.836, 452773.782 4... |
35 | 5 | DZA | Algeria | 12 | Bouira | 388 | OUED-EL-BERDI | Commune | Commune | None | None | None | None | POLYGON ((444351.456 4326332.939, 444341.318 4... |
36 | 5 | DZA | Algeria | 12 | Bouira | 389 | OULED-RACHED | Commune | Commune | None | None | None | None | POLYGON ((444341.318 4326327.678, 444351.456 4... |
37 | 5 | DZA | Algeria | 12 | Bouira | 390 | RAOURAOUA | Commune | Commune | None | None | None | None | POLYGON ((396032.001 4329097.130, 396155.680 4... |
38 | 5 | DZA | Algeria | 12 | Bouira | 391 | RIDANE | Commune | Commune | None | None | None | None | POLYGON ((385453.090 4305955.631, 385272.083 4... |
39 | 5 | DZA | Algeria | 12 | Bouira | 392 | SAHARIDJ | Commune | Commune | None | None | None | None | POLYGON ((476714.708 4354724.728, 476383.056 4... |
40 | 5 | DZA | Algeria | 12 | Bouira | 393 | SOUK-EL-KHEMIS | Commune | Commune | None | None | None | None | POLYGON ((404434.394 4347814.163, 404346.465 4... |
41 | 5 | DZA | Algeria | 12 | Bouira | 394 | SOUR-EL-GHOZLANE | Commune | Commune | None | None | None | None | POLYGON ((408931.705 4328727.688, 408964.217 4... |
42 | 5 | DZA | Algeria | 12 | Bouira | 395 | TAGHZOUT | Commune | Commune | None | None | None | None | POLYGON ((438557.715 4363083.038, 438838.144 4... |
43 | 5 | DZA | Algeria | 12 | Bouira | 396 | TAGUEDITE | Commune | Commune | None | None | None | None | POLYGON ((448194.885 4281452.803, 448058.944 4... |
44 | 5 | DZA | Algeria | 12 | Bouira | 397 | Z'BARBAR | Commune | Commune | None | None | None | None | POLYGON ((396860.440 4360082.101, 396647.372 4... |
Écriture de fichiers¶
Pour réécrire un GeoDataFrame
dans un fichier, utilisez GeoDataFrame.to_file()
. Le format de fichier par défaut est Shapefile, mais vous pouvez spécifier le vôtre avec le mot-clé « driver ».
gdf.to_file("./data/w10.geojson", driver="GeoJSON")
En savoir plus sur lecture et écriture de fichiers dans le guide de l'utilisateur.
Accesseurs et méthodes simples¶
Nous avons maintenant notre GeoDataFrame
et pouvons commencer à travailler avec sa géométrie.
Puisqu'il n'y avait qu'une seule colonne de géométrie dans l'ensemble de données wbouira
, cette colonne devient automatiquement la géométrie active et les méthodes spatiales utilisées sur GeoDataFrame
seront appliquées à la colonne "géométrie"
.
Zone de mesure¶
Pour mesurer la superficie de chaque polygone (ou MultiPolygon dans ce cas précis), accédez à l'attribut GeoDataFrame.area
, qui renvoie un pandas.Series
. Notez que GeoDataFrame.area
est simplement GeoSeries.area
appliqué à la colonne de géométrie active.
Mais d’abord, pour faciliter la lecture des résultats, fixez les noms des communes comme index :
gdf = gdf.set_index("NAME_2")
gdf["area"] = gdf.area
gdf["area"]
NAME_2 AGHBALOU 9.445325e+07 AHL-EL-KSAR 1.608416e+08 AHNIF 2.457391e+08 AIN-BESSEM 1.966776e+08 AIN-EL-HADJAR 1.137805e+08 AIN-LALOUI 9.002173e+07 AIN-TURK 6.420755e+07 AIT-LAAZIZ 5.733735e+07 AOMAR 1.098754e+08 ATH-MANSOUR 1.381353e+08 BECHLOUL 1.372009e+08 BIR-GHBALOU 7.717678e+07 BORDJ-OKHRISS 2.381300e+08 BOUDERBALA 7.239335e+07 BOUIRA 1.491963e+08 BOUKRAM 1.457795e+08 CHORFA 4.744457e+07 DECHMIA 2.311780e+08 DIRRAH 3.605754e+08 DJEBAHIA 1.113512e+08 EL-ADJIBA 1.270682e+08 EL-ASNAM 1.778374e+08 EL-HACHIMIA 3.824290e+08 EL-HAKIMIA 1.052783e+08 EL-KHABOUZIA 7.787931e+07 EL-MOKRANI 8.618230e+07 GUERROUMA 1.489675e+08 HADJERA-ZERGA 2.265320e+08 HAIZER 1.373237e+08 KADIRIA 1.450057e+08 LAKHDARIA 1.436148e+08 M'CHEDALLAH 8.754127e+07 MAALA 8.558745e+07 MAAMOURA 1.792517e+08 MEZDOUR 2.246167e+08 OUED-EL-BERDI 1.737984e+08 OULED-RACHED 2.269781e+08 RAOURAOUA 1.080184e+08 RIDANE 1.190223e+08 SAHARIDJ 1.452801e+08 SOUK-EL-KHEMIS 1.007627e+08 SOUR-EL-GHOZLANE 2.714667e+08 TAGHZOUT 7.125974e+07 TAGUEDITE 4.012711e+08 Z'BARBAR 9.071718e+07 Name: area, dtype: float64
Obtenir la limite du polygone et le centre de gravité¶
Pour obtenir la limite de chaque polygone (LineString), accédez au GeoDataFrame.boundary
:
gdf["boundary"] = gdf.boundary
gdf["boundary"]
NAME_2 AGHBALOU LINESTRING (478679.140 4354598.121, 478546.437... AHL-EL-KSAR LINESTRING (458096.559 4339404.491, 458085.518... AHNIF LINESTRING (473835.421 4332764.866, 473715.086... AIN-BESSEM LINESTRING (410218.793 4335155.776, 410175.479... AIN-EL-HADJAR LINESTRING (426730.571 4349243.480, 426751.618... AIN-LALOUI LINESTRING (414504.920 4348625.545, 414544.439... AIN-TURK LINESTRING (428803.448 4359789.178, 428789.328... AIT-LAAZIZ LINESTRING (438557.715 4363083.038, 438550.470... AOMAR LINESTRING (427249.759 4363316.919, 427215.814... ATH-MANSOUR LINESTRING (476926.874 4347296.472, 476937.331... BECHLOUL LINESTRING (448654.516 4340431.766, 448587.580... BIR-GHBALOU LINESTRING (405529.010 4338312.000, 405500.293... BORDJ-OKHRISS LINESTRING (426167.406 4307012.819, 426155.834... BOUDERBALA LINESTRING (392844.922 4384172.391, 393300.784... BOUIRA LINESTRING (426730.571 4349243.480, 426779.672... BOUKRAM LINESTRING (367367.903 4376059.806, 367446.384... CHORFA LINESTRING (482711.458 4348736.265, 482508.635... DECHMIA LINESTRING (408931.705 4328727.688, 408930.484... DIRRAH LINESTRING (425063.899 4306334.275, 424907.601... DJEBAHIA LINESTRING (420478.102 4359749.067, 420458.276... EL-ADJIBA LINESTRING (460499.867 4340479.707, 460328.679... EL-ASNAM LINESTRING (448654.516 4340431.766, 448578.928... EL-HACHIMIA LINESTRING (422183.497 4320581.606, 422180.949... EL-HAKIMIA LINESTRING (426167.406 4307012.819, 426180.092... EL-KHABOUZIA LINESTRING (406837.782 4338739.186, 406761.875... EL-MOKRANI LINESTRING (396860.440 4360082.101, 396878.913... GUERROUMA LINESTRING (389988.008 4371789.183, 389836.169... HADJERA-ZERGA LINESTRING (426299.313 4306507.583, 426368.239... HAIZER LINESTRING (438349.557 4351516.227, 438372.700... KADIRIA LINESTRING (405093.292 4365529.805, 405058.232... LAKHDARIA LINESTRING (400237.763 4373757.549, 400226.191... M'CHEDALLAH LINESTRING (464933.002 4354447.250, 465100.739... MAALA LINESTRING (397325.432 4361620.207, 397313.277... MAAMOURA LINESTRING (407438.423 4292686.264, 407420.773... MEZDOUR LINESTRING (452784.132 4306053.836, 452773.782... OUED-EL-BERDI LINESTRING (444351.456 4326332.939, 444341.318... OULED-RACHED LINESTRING (444341.318 4326327.678, 444351.456... RAOURAOUA LINESTRING (396032.001 4329097.130, 396155.680... RIDANE LINESTRING (385453.090 4305955.631, 385272.083... SAHARIDJ LINESTRING (476714.708 4354724.728, 476383.056... SOUK-EL-KHEMIS LINESTRING (404434.394 4347814.163, 404346.465... SOUR-EL-GHOZLANE LINESTRING (408931.705 4328727.688, 408964.217... TAGHZOUT LINESTRING (438557.715 4363083.038, 438838.144... TAGUEDITE LINESTRING (448194.885 4281452.803, 448058.944... Z'BARBAR LINESTRING (396860.440 4360082.101, 396647.372... Name: boundary, dtype: geometry
Puisque nous avons enregistré la limite en tant que nouvelle colonne, nous avons maintenant deux colonnes géométriques dans le même « GeoDataFrame ».
Nous pouvons également créer de nouvelles géométries, qui pourraient être, par exemple, une version tamponnée de la géométrie originale (c'est-à-dire GeoDataFrame.buffer(10)
) ou son centroïde :
gdf["centroid"] = gdf.centroid
gdf["centroid"]
NAME_2 AGHBALOU POINT (483967.891 4358917.054) AHL-EL-KSAR POINT (449396.911 4334527.841) AHNIF POINT (467922.818 4337453.152) AIN-BESSEM POINT (411607.563 4347934.347) AIN-EL-HADJAR POINT (422172.786 4350164.057) AIN-LALOUI POINT (417404.635 4343653.537) AIN-TURK POINT (425703.733 4357433.714) AIT-LAAZIZ POINT (432299.564 4361973.096) AOMAR POINT (421128.866 4369453.781) ATH-MANSOUR POINT (480368.215 4341405.563) BECHLOUL POINT (456472.489 4350218.035) BIR-GHBALOU POINT (398739.676 4337159.479) BORDJ-OKHRISS POINT (436378.170 4312858.733) BOUDERBALA POINT (387918.116 4378658.675) BOUIRA POINT (433655.215 4351234.759) BOUKRAM POINT (374706.301 4372896.179) CHORFA POINT (482711.782 4351982.940) DECHMIA POINT (397371.690 4320100.278) DIRRAH POINT (414396.646 4301676.894) DJEBAHIA POINT (414579.760 4364019.400) EL-ADJIBA POINT (462437.543 4351179.516) EL-ASNAM POINT (448800.738 4349351.356) EL-HACHIMIA POINT (427643.620 4329353.763) EL-HAKIMIA POINT (422988.554 4314758.397) EL-KHABOUZIA POINT (400848.054 4343892.654) EL-MOKRANI POINT (401177.437 4359436.398) GUERROUMA POINT (381793.805 4365299.186) HADJERA-ZERGA POINT (426441.296 4291965.565) HAIZER POINT (447855.592 4357150.466) KADIRIA POINT (408800.408 4373056.032) LAKHDARIA POINT (399707.412 4378167.049) M'CHEDALLAH POINT (472900.706 4350741.492) MAALA POINT (397417.830 4369545.224) MAAMOURA POINT (400938.642 4301863.016) MEZDOUR POINT (451226.720 4312731.248) OUED-EL-BERDI POINT (436543.253 4336415.624) OULED-RACHED POINT (455079.976 4326036.159) RAOURAOUA POINT (403215.073 4330613.909) RIDANE POINT (388432.582 4309500.425) SAHARIDJ POINT (472671.102 4359747.341) SOUK-EL-KHEMIS POINT (404849.800 4353976.349) SOUR-EL-GHOZLANE POINT (411744.813 4322164.411) TAGHZOUT POINT (441711.130 4359793.974) TAGUEDITE POINT (439925.108 4295706.069) Z'BARBAR POINT (391901.705 4366136.052) Name: centroid, dtype: geometry
Mesurer la distance¶
Nous pouvons également mesurer la distance entre chaque centroïde et le premier emplacement du centroïde.
first_point = gdf["centroid"].iloc[0]
gdf["distance"] = gdf["centroid"].distance(first_point)
gdf["distance"]
NAME_2 AGHBALOU 0.000000 AHL-EL-KSAR 42308.230862 AHNIF 26798.198987 AIN-BESSEM 73189.049553 AIN-EL-HADJAR 62411.938072 AIN-LALOUI 68290.863916 AIN-TURK 58283.037010 AIT-LAAZIZ 51758.626213 AOMAR 63716.291233 ATH-MANSOUR 17877.638965 BECHLOUL 28838.690628 BIR-GHBALOU 87961.587212 BORDJ-OKHRISS 66228.019182 BOUDERBALA 98057.589366 BOUIRA 50895.805479 BOUKRAM 110152.217999 CHORFA 7046.967222 DECHMIA 94898.072835 DIRRAH 90092.141701 DJEBAHIA 69575.474495 EL-ADJIBA 22878.491527 EL-ASNAM 36444.906744 EL-HACHIMIA 63611.411331 EL-HAKIMIA 75289.219632 EL-KHABOUZIA 84466.797564 EL-MOKRANI 82792.083218 GUERROUMA 102373.216543 HADJERA-ZERGA 88271.235569 HAIZER 36155.483566 KADIRIA 76485.692594 LAKHDARIA 86431.421469 M'CHEDALLAH 13759.447742 MAALA 87200.177943 MAAMOURA 100742.342113 MEZDOUR 56613.717220 OUED-EL-BERDI 52492.005988 OULED-RACHED 43768.308832 RAOURAOUA 85569.186783 RIDANE 107559.279036 SAHARIDJ 11327.260326 SOUK-EL-KHEMIS 79272.207661 SOUR-EL-GHOZLANE 81036.595111 TAGHZOUT 42265.859471 TAGUEDITE 77041.516868 Z'BARBAR 92348.776383 Name: distance, dtype: float64
Notez que geopandas.GeoDataFrame
est une sous-classe de pandas.DataFrame
, nous disposons donc de toutes les fonctionnalités pandas disponibles à utiliser sur l'ensemble de données géospatiales — nous pouvons même effectuer des manipulations de données avec les attributs et les informations géométriques ensemble.
Par exemple, pour calculer la moyenne des distances mesurées ci-dessus, accédez à la colonne 'distance' et appelez la méthode mean() dessus :
gdf["distance"].mean()
63435.04627040219
Créer des cartes¶
Les GeoPandas peuvent également tracer des cartes, afin que nous puissions vérifier comment les géométries apparaissent dans l'espace. Pour tracer la géométrie active, appelez GeoDataFrame.plot()
. Pour coder en couleur une autre colonne, transmettez cette colonne comme premier argument. Dans l'exemple ci-dessous, nous traçons la colonne de géométrie active et le code couleur par la colonne « zone ». Nous voulons également afficher une légende (legend=True
).
gdf.plot("area", legend=True)
<Axes: >
Vous pouvez également explorer vos données de manière interactive en utilisant GeoDataFrame.explore()
, qui se comporte de la même manière que plot()
mais renvoie une carte interactive à la place.
gdf.explore("area", legend=False)
En basculant la géométrie active (GeoDataFrame.set_geometry
) vers les centroïdes, nous pouvons tracer les mêmes données en utilisant la géométrie des points.
gdf = gdf.set_geometry("centroid")
gdf.plot("area", legend=True)
<Axes: >
Et nous pouvons également superposer les deux « GeoSeries ». Nous avons juste besoin d’utiliser une parcelle comme axe pour l’autre.
ax = gdf["geometry"].plot()
gdf["centroid"].plot(ax=ax, color="black")
<Axes: >
Maintenant, nous redéfinissons la géométrie active sur la « GeoSeries » d'origine.
gdf = gdf.set_geometry("geometry")
En savoir plus sur la cartographie dans le guide de l'utilisateur.
Création de géométrie¶
Nous pouvons continuer à travailler avec la géométrie et créer de nouvelles formes basées sur celles que nous avons déjà.
Enveloppe convexe¶
Si nous sommes intéressés par l'enveloppe convexe de nos polygones, nous pouvons accéder à GeoDataFrame.convex_hull
.
gdf["convex_hull"] = gdf.convex_hull
# saving the first plot as an axis and setting alpha (transparency) to 0.5
ax = gdf["convex_hull"].plot(alpha=0.5)
# passing the first plot and setting linewidth to 0.5
gdf["boundary"].plot(ax=ax, color="white", linewidth=0.5)
<Axes: >
Tampon¶
Dans d'autres cas, nous devrons peut-être tamponner la géométrie en utilisant GeoDataFrame.buffer()
. Les méthodes de géométrie sont automatiquement appliquées à la géométrie active, mais nous pouvons également les appliquer directement à n'importe quelle « GeoSeries ». Tamponnons les communes et leurs centroïdes et traçons les deux les uns sur les autres.
# buffering the active geometry by 10 000 feet (geometry is already in feet)
gdf["buffered"] = gdf.buffer(10000)
# buffering the centroid geometry by 10 000 feet (geometry is already in feet)
gdf["buffered_centroid"] = gdf["centroid"].buffer(1000)
# saving the first plot as an axis and setting alpha (transparency) to 0.5
ax = gdf["buffered"].plot(alpha=0.5)
# passing the first plot as an axis to the second
gdf["buffered_centroid"].plot(ax=ax, color="red", alpha=0.5)
# passing the first plot and setting linewidth to 0.5
gdf["boundary"].plot(ax=ax, color="white", linewidth=0.5)
<Axes: >
En savoir plus sur les manipulations géométriques dans le guide de l'utilisateur.
Relations géométriques¶
Nous pouvons également nous interroger sur les relations spatiales de différentes géométries. En utilisant les géométries ci-dessus, nous pouvons vérifier lequel des communes tamponnés croise la géométrie originale de la commune de Bouira, c'est-à-dire se trouve à moins de 10 000 pieds de la commune de Bouira.
Tout d’abord, nous obtenons un polygone de la commune de Bouira.
cbouira = gdf.loc["BOUIRA", "geometry"]
cbouira
Le polygone est un objet géométrique -shapely-, comme toute autre géométrie utilisée dans GeoPandas.
type(cbouira)
shapely.geometry.polygon.Polygon
Ensuite, nous pouvons vérifier laquelle des géométries de gdf["buffered"]
la coupe.
gdf["buffered"].intersects(cbouira)
NAME_2 AGHBALOU False AHL-EL-KSAR True AHNIF False AIN-BESSEM True AIN-EL-HADJAR True AIN-LALOUI True AIN-TURK True AIT-LAAZIZ True AOMAR True ATH-MANSOUR False BECHLOUL True BIR-GHBALOU False BORDJ-OKHRISS False BOUDERBALA False BOUIRA True BOUKRAM False CHORFA False DECHMIA False DIRRAH False DJEBAHIA True EL-ADJIBA False EL-ASNAM True EL-HACHIMIA True EL-HAKIMIA False EL-KHABOUZIA False EL-MOKRANI False GUERROUMA False HADJERA-ZERGA False HAIZER True KADIRIA False LAKHDARIA False M'CHEDALLAH False MAALA False MAAMOURA False MEZDOUR False OUED-EL-BERDI True OULED-RACHED False RAOURAOUA False RIDANE False SAHARIDJ False SOUK-EL-KHEMIS False SOUR-EL-GHOZLANE False TAGHZOUT True TAGUEDITE False Z'BARBAR False dtype: bool
Les communes qui se trouvent à plus de 10 000 pieds de Bouira rendent la valeur Faalse. Tous les autres sont plus proches et coupent notre polygone et par conséquent rendent la valeur True.
Alternativement, nous pouvons vérifier quels centroïdes tamponnés se trouvent entièrement dans les polygones des communes d'origine. Dans ce cas, les deux « GeoSeries » sont alignées et la vérification est effectuée pour chaque ligne.
gdf["within"] = gdf["buffered_centroid"].within(gdf)
gdf["within"]
NAME_2 AGHBALOU True AHL-EL-KSAR True AHNIF True AIN-BESSEM False AIN-EL-HADJAR True AIN-LALOUI True AIN-TURK True AIT-LAAZIZ True AOMAR True ATH-MANSOUR True BECHLOUL True BIR-GHBALOU True BORDJ-OKHRISS True BOUDERBALA True BOUIRA True BOUKRAM True CHORFA False DECHMIA True DIRRAH True DJEBAHIA True EL-ADJIBA True EL-ASNAM True EL-HACHIMIA True EL-HAKIMIA True EL-KHABOUZIA True EL-MOKRANI True GUERROUMA True HADJERA-ZERGA True HAIZER True KADIRIA False LAKHDARIA True M'CHEDALLAH True MAALA False MAAMOURA True MEZDOUR True OUED-EL-BERDI True OULED-RACHED True RAOURAOUA True RIDANE True SAHARIDJ True SOUK-EL-KHEMIS True SOUR-EL-GHOZLANE True TAGHZOUT True TAGUEDITE True Z'BARBAR True Name: within, dtype: bool
Nous pouvons tracer les résultats sur la carte pour confirmer la découverte.
gdf = gdf.set_geometry("buffered_centroid")
# using categorical plot and setting the position of the legend
ax = gdf.plot(
"within", legend=True, categorical=True, legend_kwds={"loc": "upper left"}
)
# passing the first plot and setting linewidth to 0.5
gdf["boundary"].plot(ax=ax, color="black", linewidth=0.5)
<Axes: >
Projections¶
Chaque « GeoSeries » a son système de référence de coordonnées (CRS) accessible sur « GeoSeries.crs ». Le CRS indique à GeoPandas où se trouvent les coordonnées des géométries à la surface de la Terre. Dans certains cas, le CRS est géographique, ce qui signifie que les coordonnées sont en latitude et en longitude. Dans ces cas, son CRS est WGS84, avec le code d'autorité « EPSG:4326 ». Voyons la projection de nos communes de Bouira GeoDataFrame
.
gdf.crs
<Projected CRS: EPSG:3857> Name: WGS 84 / Pseudo-Mercator Axis Info [cartesian]: - X[east]: Easting (metre) - Y[north]: Northing (metre) Area of Use: - name: World between 85.06°S and 85.06°N. - bounds: (-180.0, -85.06, 180.0, 85.06) Coordinate Operation: - name: Popular Visualisation Pseudo-Mercator - method: Popular Visualisation Pseudo Mercator Datum: World Geodetic System 1984 ensemble - Ellipsoid: WGS 84 - Prime Meridian: Greenwich
Les géométries sont au format « EPSG:3857 » avec les coordonnées en metre. Nous pouvons facilement re-projeter une GeoSeries
sur un autre CRS, comme EPSG:4326
en utilisant GeoSeries.to_crs()
.
gdf = gdf.set_geometry("geometry")
communes_4326 = gdf.to_crs("EPSG:4326")
communes_4326.plot()
<Axes: >
communes_4326.crs
<Geographic 2D CRS: EPSG:4326> Name: WGS 84 Axis Info [ellipsoidal]: - Lat[north]: Geodetic latitude (degree) - Lon[east]: Geodetic longitude (degree) Area of Use: - name: World. - bounds: (-180.0, -90.0, 180.0, 90.0) Datum: World Geodetic System 1984 ensemble - Ellipsoid: WGS 84 - Prime Meridian: Greenwich
Notez la différence de coordonnées le long des axes du tracé. Là où nous avions auparavant 120 000 à 280 000 (pieds), nous avons maintenant 40,5 à 40,9 (degrés). Dans ce cas, communes_4326
a une colonne "géométrie"
dans WGS84 mais toutes les autres (avec les centroïdes, etc.) restent dans le CRS d'origine.
Pour les opérations qui dépendent de la distance ou de la zone, vous devez toujours utiliser un CRS projeté (en mètres, pieds, kilomètres, etc.) et non géographique (en degrés). Les opérations GeoPandas sont planaires, tandis que les degrés reflètent la position sur une sphère. Par conséquent, les opérations spatiales utilisant des degrés peuvent ne pas donner des résultats corrects. Par exemple, le résultat de gdf.area.sum()
(CRS projeté) est 8 429 911 572 pieds2 mais le résultat de boroughs_4326.area.sum()
(CRS géographique) est 0,083.
See more on projections in the user guide.
Et ensuite ?¶
Avec GeoPandas, nous pouvons faire bien plus que ce qui a été introduit jusqu'à présent, des agrégations aux [jointures spatiales](https://geopandas.org /docs/user_guide/mergingdata.rst), au géocodage, et [beaucoup plus](https://geopandas.org/gallery/index. premier).
Rendez-vous sur le guide de l'utilisateur pour en savoir plus sur les différentes fonctionnalités de GeoPandas, les [Exemples](https://geopandas.org/gallery/index. rst) pour voir comment ils peuvent être utilisés, ou à la référence API pour plus de détails.