Comment visualiser le contour d'un pays dans Jupyter avec GeoPandas, Cartopy et Natural Earth

Cet exemple simple montre comment visualiser le contour d’un pays dans Jupyter. Pour cet exemple, nous afficherons le contour de l’Allemagne. Pour rendre le rendu plus attrayant visuellement, nous ajoutons également les contours d’autres pays et l’océan en arrière-plan.

Nous utilisons le jeu de données Natural Earth 10m, qui est automatiquement téléchargé ici. Les variantes à plus petite échelle comme 1:110M ne fournissent tout simplement pas assez de résolution à cette échelle pour être visuellement attrayantes.

Germany with rivers.avif

VisualizeCountry.py
# Importer les bibliothèques requises
import cartopy.crs as ccrs
import cartopy.feature as cf
from cartopy.feature import ShapelyFeature
import cartopy.io.shapereader as shpreader
import matplotlib.pyplot as plt
import geopandas as gpd
from shapely.ops import unary_union

# Créer la carte avec la projection Plate Carree
proj = ccrs.PlateCarree()
ax = plt.axes(projection=proj)
# Nous allons récupérer Natural Earth en plus haute résolution (10m) lorsque disponible
# Utiliser les 'admin_0_countries' 10m et coastline/lakes/rivers pour plus de détails
try:
    # Lire les pays Natural Earth 10m et extraire la géométrie de l'Allemagne via geopandas pour une meilleure précision
    countries = gpd.read_file(shpreader.natural_earth(resolution='10m', category='cultural', name='admin_0_countries'))
    germany = countries[countries['ISO_A3'] == 'DEU'].iloc[0].geometry
    # Zone tampon de 0 pour corriger les géométries invalides
    germany = germany.buffer(0)
    # Déterminer une étendue serrée à partir de la géométrie avec un petit remplissage en degrés
    minx, miny, maxx, maxy = germany.bounds
    pad_deg = 0.4
    extent = [minx - pad_deg, maxx + pad_deg, miny - pad_deg, maxy + pad_deg]
    ax.set_extent(extent, crs=ccrs.PlateCarree())

    # Ajouter coastline, borders et lakes/rivers en haute résolution
    # NOTE : Tous ceux-ci sont optionnels - commentez simplement ceux dont vous n'avez pas besoin
    ax.add_feature(cf.LAND.with_scale('10m'), facecolor='lightgray')
    ax.add_feature(cf.OCEAN.with_scale('10m'), facecolor='lightblue')
    ax.add_feature(cf.COASTLINE.with_scale('10m'), lw=0.6)
    ax.add_feature(cf.BORDERS.with_scale('10m'), linestyle=':', lw=0.6)
    ax.add_feature(cf.LAKES.with_scale('10m'), facecolor='none', edgecolor='blue', lw=0.4)
    ax.add_feature(cf.RIVERS.with_scale('10m'), edgecolor='blue', lw=0.4)

    # Ajouter le polygone de l'Allemagne avec un style plus esthétique
    germany_feature = ShapelyFeature([germany], ccrs.PlateCarree(), facecolor='none', edgecolor='red', linewidth=1.2)
    ax.add_feature(germany_feature)

    # Ajouter des lignes de grille et un titre
    gl = ax.gridlines(draw_labels=True, linestyle='--', linewidth=0.3)
    gl.top_labels = False
    gl.right_labels = False
    plt.gcf().set_size_inches(12, 10)
    ax.set_title('Contour de l\'Allemagne — Natural Earth 10m (détaillé)')

    plt.show()
except Exception as e:
    print(f"Erreur : {e}")
    print("Impossible de charger les données Natural Earth 10m. Repli vers les enregistrements shapereader intégrés avec une résolution 110m.")
    try:
        reader = shpreader.Reader(shpreader.natural_earth(resolution='110m', category='cultural', name='admin_0_countries'))
        germany = [c for c in reader.records() if c.attributes['NAME_LONG'] == 'Germany'][0]
        shape_feature = ShapelyFeature([germany.geometry], ccrs.PlateCarree(), facecolor='none', edgecolor='red', lw=2)
        ax.add_feature(cf.COASTLINE, lw=0.5)
        ax.add_feature(cf.BORDERS, linestyle=':', lw=0.5)
        ax.add_feature(shape_feature)
        plt.show()
    except Exception as e2:
        print('Le repli a également échoué :', e2)

Consultez les articles similaires par catégorie : Geoinformatics