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.

geodataframe schema

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.

Mode d'emploi

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.

In [1]:
import geopandas
import fiona
gpkg = "./data/bouira_com.gpkg" 
layers = fiona.listlayers(gpkg)
layers
Out[1]:
['landuse',
 'Autoroute',
 'place',
 'output',
 'waterway',
 'lac',
 'batiments',
 'Autoroutes',
 'places',
 'cbouira']
In [2]:
path_to_data ="./data/wbouira.shp"
gdf = geopandas.read_file(path_to_data)

gdf
Out[2]:
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 ».

In [3]:
gdf.to_file("./data/w10.geojson", driver="GeoJSON")
Mode d'emploi

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 :

In [4]:
gdf = gdf.set_index("NAME_2")
In [5]:
gdf["area"] = gdf.area
gdf["area"]
Out[5]:
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 :

In [6]:
gdf["boundary"] = gdf.boundary
gdf["boundary"]
Out[6]:
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 :

In [7]:
gdf["centroid"] = gdf.centroid
gdf["centroid"]
Out[7]:
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.

In [8]:
first_point = gdf["centroid"].iloc[0]
gdf["distance"] = gdf["centroid"].distance(first_point)
gdf["distance"]
Out[8]:
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 :

In [9]:
gdf["distance"].mean()
Out[9]:
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).

In [10]:
gdf.plot("area", legend=True)
Out[10]:
<Axes: >
No description has been provided for this image

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.

In [11]:
gdf.explore("area", legend=False)
Out[11]:
Make this Notebook Trusted to load map: File -> Trust Notebook

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.

In [12]:
gdf = gdf.set_geometry("centroid")
gdf.plot("area", legend=True)
Out[12]:
<Axes: >
No description has been provided for this image

Et nous pouvons également superposer les deux « GeoSeries ». Nous avons juste besoin d’utiliser une parcelle comme axe pour l’autre.

In [13]:
ax = gdf["geometry"].plot()
gdf["centroid"].plot(ax=ax, color="black")
Out[13]:
<Axes: >
No description has been provided for this image

Maintenant, nous redéfinissons la géométrie active sur la « GeoSeries » d'origine.

In [14]:
gdf = gdf.set_geometry("geometry")
Mode d'emploi

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.

In [15]:
gdf["convex_hull"] = gdf.convex_hull
In [16]:
# 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)
Out[16]:
<Axes: >
No description has been provided for this image

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.

In [17]:
# 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)
In [18]:
# 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)
Out[18]:
<Axes: >
No description has been provided for this image
Mode d'emploi

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.

In [19]:
cbouira = gdf.loc["BOUIRA", "geometry"]
cbouira
Out[19]:
No description has been provided for this image

Le polygone est un objet géométrique -shapely-, comme toute autre géométrie utilisée dans GeoPandas.

In [20]:
type(cbouira)
Out[20]:
shapely.geometry.polygon.Polygon

Ensuite, nous pouvons vérifier laquelle des géométries de gdf["buffered"] la coupe.

In [21]:
gdf["buffered"].intersects(cbouira)
Out[21]:
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.

In [22]:
gdf["within"] = gdf["buffered_centroid"].within(gdf)
gdf["within"]
Out[22]:
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.

In [23]:
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)
Out[23]:
<Axes: >
No description has been provided for this image

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.

In [24]:
gdf.crs
Out[24]:
<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().

In [25]:
gdf = gdf.set_geometry("geometry")
communes_4326 = gdf.to_crs("EPSG:4326")
communes_4326.plot()
Out[25]:
<Axes: >
No description has been provided for this image
In [26]:
communes_4326.crs
Out[26]:
<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.

Avertissement

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.

User guide

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.