Retour au catalogue
Season 44 15 Épisodes 53 min 2026

GeoDjango and PostGIS

v6.0 — Édition 2026. Un cours audio complet sur la création d'applications web spatiales utilisant GeoDjango et PostGIS. Enregistré en 2026, couvrant la version 6.0 de GeoDjango.

Analyse géospatiale Applications web spatiales Bases de données
GeoDjango and PostGIS
Lecture en cours
Click play to start
0:00
0:00
1
La puissance des frameworks web spatiaux
Cet épisode présente GeoDjango et PostGIS comme une combinaison puissante pour créer des applications web géographiques. Vous apprendrez pourquoi les bases de données traditionnelles ont des difficultés avec les données spatiales et comment les extensions spatiales résolvent ce problème.
3m 18s
2
Geometry vs Geography dans PostGIS
Cet épisode explore les types de données de PostGIS, en se concentrant particulièrement sur la différence entre les types Geometry et Geography. Vous apprendrez quand utiliser les mathématiques cartésiennes sur plan plat par rapport aux calculs sphériques terrestres.
3m 08s
3
Configuration de votre environnement spatial
Cet épisode couvre la configuration initiale d'un projet GeoDjango et PostGIS. Vous apprendrez comment activer l'extension PostGIS et configurer vos paramètres Django pour vous connecter à un backend spatial.
3m 51s
4
Systèmes de référence de coordonnées et SRID
Cet épisode détaille les systèmes de référence de coordonnées et les SRID. Vous apprendrez ce qu'est le WGS84 et pourquoi il est crucial de projeter correctement vos données cartographiques pour obtenir des mesures de distance précises.
3m 30s
5
Conception de modèles géographiques
Cet épisode montre comment concevoir des modèles géographiques dans GeoDjango. Vous apprendrez à définir les attributs PointField et MultiPolygonField pour stocker des données spatiales dans votre application Django.
3m 28s
6
L'API GDAL et OGR
Cet épisode présente le wrapper de l'API GDAL et OGR dans GeoDjango. Vous apprendrez comment inspecter et lire des fichiers vectoriels externes comme les Shapefiles nativement en Python avant de les importer.
3m 28s
7
Ingestion de données spatiales avec LayerMapping
Cet épisode traite de l'automatisation des importations de données spatiales. Vous apprendrez à utiliser l'utilitaire LayerMapping pour mapper sans effort les données de Shapefiles externes directement dans vos modèles GeoDjango.
3m 36s
8
L'API GEOS : la géométrie pythonique
Cet épisode se concentre sur l'API GEOS pour la manipulation de géométrie de manière pythonique. Vous apprendrez à effectuer des opérations topologiques comme des unions et des intersections en mémoire sans solliciter la base de données.
3m 32s
9
Maîtriser les lookups spatiaux
Cet épisode explique les lookups de requêtes géographiques dans l'ORM Django. Vous apprendrez à utiliser des filtres spatiaux pour trouver des relations, comme déterminer quels points sont contenus dans des limites spécifiques.
3m 52s
10
Requêtes de distance à haute performance
Cet épisode aborde les requêtes de proximité et de distance à haute performance. Vous apprendrez à utiliser les lookups de distance et l'objet de distance géographique pour trouver efficacement des emplacements à proximité.
3m 27s
11
Fonctions de base de données géographiques
Cet épisode explore les fonctions de base de données spatiales accessibles via GeoDjango. Vous apprendrez à calculer des surfaces, extraire des centroïdes et générer du GeoJSON directement dans la couche de la base de données.
3m 22s
12
Données Raster dans PostGIS
Cet épisode présente les rasters PostGIS et les RasterFields de GeoDjango. Vous apprendrez à stocker et interroger des données spatiales continues comme des modèles d'élévation ou des cartes de température.
3m 45s
13
Géolocalisation avec GeoIP2
Cet épisode couvre la géolocalisation basée sur l'IP en utilisant le module GeoIP2 de GeoDjango. Vous apprendrez à faire correspondre les adresses IP des utilisateurs à des villes et des pays en utilisant les jeux de données MaxMind.
3m 35s
14
Tester des applications spatiales
Cet épisode se concentre sur les tests d'applications spatiales dans GeoDjango. Vous apprendrez à configurer votre suite de tests, à gérer les bases de données modèles PostGIS et à définir les privilèges des utilisateurs.
3m 18s
15
Déployer des applications GeoDjango
Cet épisode clôture la série en discutant des considérations de déploiement pour les applications GeoDjango. Vous en apprendrez davantage sur la sécurité des threads GDAL et sur la façon de configurer vos processus WSGI pour éviter les plantages.
3m 53s

Épisodes

1

La puissance des frameworks web spatiaux

3m 18s

Cet épisode présente GeoDjango et PostGIS comme une combinaison puissante pour créer des applications web géographiques. Vous apprendrez pourquoi les bases de données traditionnelles ont des difficultés avec les données spatiales et comment les extensions spatiales résolvent ce problème.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. GeoDjango et PostGIS, épisode 1 sur 15. Tu as déjà essayé de calculer la distance entre deux points de latitude et de longitude avec une simple query SQL ? Tu finis généralement par écrire un bloc de trigonométrie massif et fragile, juste pour trouver le café le plus proche. Les bases de données classiques ne comprennent tout simplement pas l'espace physique. Combler ce manque, c'est exactement ce qu'on aborde aujourd'hui dans La puissance des frameworks web spatiaux. On pense souvent que stocker des données géographiques se résume à ajouter deux colonnes décimales à une table de base de données, une pour la latitude et une pour la longitude. C'est une erreur très courante. Si tu développes un système de routage pour la livraison de repas et que tu dois trouver le restaurant le plus proche d'un client, une base de données classique traite ces coordonnées comme des floats arbitraires. Elle ne sait pas que la Terre est une sphère. Elle ne peut pas calculer efficacement les limites, les intersections ou les distances réelles. Tu es donc obligé de charger des milliers de records dans la memory de ton application et de faire les calculs toi-même. C'est là qu'intervient une base de données spatiale. PostGIS est une extension spatiale pour la base de données PostgreSQL. Elle change fondamentalement la façon dont les données sont stockées. Au lieu de deux colonnes de nombres séparées, tu stockes un seul objet geometry ou geography. Une base de données spatiale comprend nativement les mathématiques du monde physique. Elle sait ce qu'est un point, une ligne et un polygone. Si tu veux trouver tous les restaurants dans un rayon de deux kilomètres autour d'un utilisateur, PostGIS utilise des index spatiaux spécialisés pour trouver la réponse instantanément, au niveau de la base de données. Mais une base de données intelligente, ce n'est que la moitié de la solution. Tu dois encore connecter cette logique spatiale à ton application web. C'est ce qui nous amène à GeoDjango. GeoDjango est un framework géographique de classe mondiale, intégré directement dans Django. Il sert de pont entre ta base de données spatiale et la logique de ton application. GeoDjango étend l'Object-Relational Mapper standard de Django pour qu'il puisse comprendre les géométries PostGIS. Tu interagis avec les données géographiques exactement comme tu le fais avec des models de base de données classiques. Au lieu d'écrire des queries SQL spatiales brutes, tu utilises Python. Tu peux filtrer les résultats de la base de données en fonction des relations spatiales, comme vérifier si le polygone de la zone de livraison d'un restaurant contient le point d'adresse d'un utilisateur spécifique. GeoDjango traduit ton code Python dans les bonnes queries PostGIS. Il inclut même des widgets de carte pour le panneau d'administration Django, pour que tu puisses créer et modifier visuellement des données géographiques out of the box. Ensemble, PostGIS et GeoDjango forment une stack incroyablement performante. PostGIS gère le gros du travail mathématique au niveau de la couche de stockage, et GeoDjango fournit une interface Python propre pour servir ces données à tes utilisateurs. Tu arrêtes de te battre avec la trigonométrie complexe et tu commences à développer de vraies features géolocalisées. Voici l'idée clé. La véritable puissance d'un framework spatial, ce n'est pas juste de dessiner des lignes sur une carte web. C'est de sortir complètement les mathématiques spatiales complexes du code de ton application, pour les confier à un moteur de base de données conçu spécifiquement pour comprendre la géométrie. Si tu trouves ces deep dives utiles, tu peux soutenir l'émission en cherchant DevStoriesEU sur Patreon. C'est tout pour aujourd'hui. Merci pour ton écoute, et va builder un truc cool.
2

Geometry vs Geography dans PostGIS

3m 08s

Cet épisode explore les types de données de PostGIS, en se concentrant particulièrement sur la différence entre les types Geometry et Geography. Vous apprendrez quand utiliser les mathématiques cartésiennes sur plan plat par rapport aux calculs sphériques terrestres.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. GeoDjango et PostGIS, épisode 2 sur 15. Le chemin le plus court entre deux points sur Terre n'est pas une ligne droite, c'est une courbe. Si ta base de données traite la longitude et la latitude comme une grille X et Y classique, tes requêtes de distance vont être complètement fausses. Pour corriger ça, tu dois comprendre la différence entre les types de données Geometry et Geography de PostGIS. Par défaut, les bases de données spatiales fonctionnent sur un plan plat en deux dimensions. C'est le type Geometry. Il utilise les mathématiques cartésiennes standard. Si tu veux trouver la distance entre deux points, la base de données trace en gros une ligne droite et applique le théorème de Pythagore. Cette approche est incroyablement rapide et très précise pour les données locales. Si tu cartographies un pâté de maisons, que tu traces les murs d'un bâtiment ou que tu suis la limite exacte d'un petit parc, la courbure de la Terre est négligeable. Une carte plate fonctionne parfaitement. Les développeurs pensent souvent qu'ils peuvent utiliser le type Geometry pour tout. Ils stockent des coordonnées GPS globales, qui sont des degrés de longitude et de latitude, dans une colonne Geometry plate. Quand ils demandent à la base de données de calculer une distance, elle renvoie un nombre dénué de sens en degrés, plutôt qu'en mètres ou en miles. Pour obtenir des distances réelles avec le type Geometry sur de grandes zones, tu dois continuellement traduire tes données dans des projections cartographiques spécifiques et localisées. C'est exactement pour ça que PostGIS propose le type Geography. Le type Geography modélise la Terre comme une sphère. Plus précisément, il utilise nativement le système de référence spatiale WGS84. Quand tu stockes des coordonnées dans une colonne Geography, la base de données comprend que la surface est courbée. Quand tu lui demandes une distance, elle ne trace pas une ligne plate. Elle calcule un arc de grand cercle. Imagine que tu mesures un plan de vol de New York à Londres. Si tu utilises le type Geometry sur une carte plate standard non projetée, la base de données calcule une ligne droite qui coupe directement à travers la grille. Si tu utilises le type Geography, la base de données calcule la vraie distance la plus courte en suivant la courbure de la Terre, en traçant le grand cercle au-dessus de l'Atlantique. Encore mieux, le type Geography renvoie automatiquement cette distance en mètres. Tu contournes complètement le besoin de gérer toi-même des projections cartographiques complexes. Voici le point clé. Tu pourrais en conclure que Geography est le type supérieur et qu'il devrait remplacer Geometry entièrement. C'est faux. Calculer des distances sur une sphère demande de la trigonométrie lourde. Ça demande beaucoup plus de puissance de calcul que les mathématiques sur un plan plat, ce qui rend les opérations sur les types Geography plus lentes. En plus, PostGIS supporte beaucoup moins de fonctions spatiales pour Geography que pour Geometry. Beaucoup d'opérations géométriques avancées ne se traduisent tout simplement pas en mathématiques sphériques. Ton choix dépend entièrement de l'étendue physique de tes données. Utilise le type Geography quand ton application stocke des points à l'échelle mondiale et a besoin de distances précises sans l'overhead de la gestion des projections. Utilise le type Geometry quand tes données sont confinées à une région locale spécifique, ou quand tu as besoin des performances maximales absolues et de la suite complète de fonctions spatiales. Le type que tu choisis définit la forme du monde dans lequel vit ta base de données. Merci d'avoir passé quelques minutes avec moi. À la prochaine, porte-toi bien.
3

Configuration de votre environnement spatial

3m 51s

Cet épisode couvre la configuration initiale d'un projet GeoDjango et PostGIS. Vous apprendrez comment activer l'extension PostGIS et configurer vos paramètres Django pour vous connecter à un backend spatial.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. GeoDjango et PostGIS, épisode 3 sur 15. Transformer ta base de données standard en moteur spatial prend exactement trois mots de SQL, mais si tu les exécutes dans le mauvais contexte, ton application Django échouera dès sa toute première migration. Aujourd'hui, on se concentre entièrement sur la configuration de ton environnement spatial. On commence par la couche base de données. Tu as déjà PostgreSQL qui tourne et tu as créé une base de données vide pour ton nouveau projet. À ce stade, cette base de données est complètement standard. Elle ne comprend que le texte, les entiers, les dates et les types relationnels standards. Elle n'a aucune notion de ce qu'est une coordonnée ou une limite géographique. Pour changer ça, tu dois activer PostGIS. Les gens se trompent souvent ici en supposant qu'installer les packages PostGIS sur leur serveur rend automatiquement chaque base de données compatible avec le spatial. Ce n'est pas le cas. L'extension spatiale doit être créée à l'intérieur de la base de données spécifique que ton projet va utiliser. Tu dois te connecter directement à cette nouvelle base de données en utilisant un client de base de données ou la ligne de commande. Une fois connecté, tu exécutes la commande pour créer l'extension nommée postgis. Ces trois mots SQL transforment instantanément l'environnement. PostgreSQL exécute la commande, chargeant des centaines de fonctions spatiales et de types de données spécialisés dans ton schéma. Il génère aussi une table système cruciale qui stocke les systèmes de référence spatiale, qui fournissent les formules mathématiques nécessaires pour projeter des coordonnées globales sur un écran plat. Avec la base de données préparée, tu passes sur ton projet Django. Tu bootstrappes un projet standard et tu crées une nouvelle application. Appelons cette app world. Maintenant, ouvre ton fichier settings. Il y a deux modifications distinctes requises pour faire le pont entre Django et PostGIS. D'abord, localise ton array installed apps. Tu dois ajouter le module nommé django point contrib point gis. Ce module est le cœur de GeoDjango. Il charge les wrappers Python pour les librairies géographiques sous-jacentes, fournissant les champs spatiaux et les lookups de base de données géographique que tu utiliseras pour écrire des queries plus tard. Tu ajoutes aussi ta nouvelle app world à cette liste pour que Django sache qu'il doit tracker ses models. Voici le point clé. La deuxième modification se passe dans ton dictionnaire de configuration de base de données. Django route tout le trafic de la base de données via un backend engine. Si tu laisses l'engine sur le backend PostgreSQL par défaut, Django traitera ta base de données spatiale comme une base de données relationnelle standard. Il ne saura pas comment sérialiser une forme géographique ou parser en toute sécurité une query de bounding box. Tu dois pointer explicitement l'engine vers le backend PostGIS de GeoDjango. Tu changes la valeur de l'engine pour django point contrib point gis point db point backends point postgis. Le reste du dictionnaire de connexion reste identique. Tu fournis toujours le database name, le user, le password, le host et le port exactement comme tu le ferais pour un setup standard. Quand tu lances tes migrations initiales, ce nouveau backend prend le relais. Il se connecte à PostgreSQL et vérifie immédiatement la présence de l'extension PostGIS. Si tu as oublié de créer l'extension dans la base de données, le backend captera les types spatiaux manquants et lèvera une erreur. Si l'extension est présente, la connexion réussit. Tu as maintenant un pipeline spatial complet. La vraie puissance de cette configuration spécifique, c'est qu'une fois le backend postgis câblé, la complexité massive des queries de base de données spatiale est entièrement cachée derrière le familier object relational mapper de Django. C'est tout pour cet épisode. Merci d'avoir écouté, et continue de développer !
4

Systèmes de référence de coordonnées et SRID

3m 30s

Cet épisode détaille les systèmes de référence de coordonnées et les SRID. Vous apprendrez ce qu'est le WGS84 et pourquoi il est crucial de projeter correctement vos données cartographiques pour obtenir des mesures de distance précises.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. GeoDjango et PostGIS, épisode 4 sur 15. Essaie de mesurer l'emprise au sol d'un bâtiment avec la latitude et la longitude, et tes chiffres seront complètement inutilisables. C'est parce que la latitude et la longitude sont juste des angles depuis le centre de la Terre, pas des distances physiques. Pour transformer ces angles en mesures utilisables comme des mètres ou des pieds, tu as besoin d'un Coordinate Reference System et d'un SRID. Une coordonnée comme 48 degrés nord et 2 degrés est, c'est juste une paire de nombres bruts. Sans contexte, ta base de données ne sait pas comment mapper ces nombres sur le monde physique. Ce contexte vient du Spatial Reference System Identifier, qu'on appelle couramment le SRID. Un SRID, c'est tout simplement un integer qui relie tes données de coordonnées brutes à un modèle mathématique spécifique de la Terre. Par défaut, les champs geometry de GeoDjango utilisent un SRID de 4326. Cet integer représente le système de coordonnées WGS84. C'est le modèle standard utilisé par les satellites GPS et la plupart des librairies de web mapping. Il stocke les données en utilisant des degrés de latitude et de longitude. WGS84 est excellent pour localiser précisément des points n'importe où sur le globe. Cependant, c'est un système géographique, ce qui veut dire qu'il modélise la Terre comme une forme en trois dimensions. Voici le point clé. Tu ne peux pas calculer avec précision des distances ou des surfaces planes en utilisant des degrés. La distance physique entre deux lignes de longitude rétrécit à mesure que tu t'éloignes de l'équateur vers les pôles. Si tu essaies de trouver tous les cafés à moins de 500 mètres d'un point en utilisant le SRID 4326, la base de données doit faire des calculs de géométrie sphérique lourds à la volée, ce qui est lent et souvent imprécis. Pour résoudre ça, tu utilises des systèmes de coordonnées projetées. Un système projeté aplatit mathématiquement une portion spécifique de la Terre courbée sur une grille en deux dimensions. Une fois la zone aplatie, les coordonnées passent des angles à des unités de longueur standards, comme les mètres ou les pieds. Ça rend les calculs de distance rapides et précis en utilisant de la géométrie de base. Ton choix de SRID dépend entièrement du scope de ton application. Si tu développes un système global de suivi de vols, tu stockes tes données avec WGS84 et le SRID 4326. Tes points couvrent le monde entier, donc tu as besoin d'un système global, même si les calculs de distance sont un peu plus complexes. Si tu développes une application locale d'urbanisme pour mesurer les limites exactes des propriétés, utiliser WGS84 est une erreur. À la place, tu assignes un système de coordonnées projetées local à ton champ spatial. Par exemple, tu pourrais utiliser un système de coordonnées State Plane spécifique avec son propre SRID unique. Ces systèmes locaux sont vraiment faits sur mesure. Ils minimisent la distorsion qui se produit quand tu aplatis une sphère, mais uniquement pour cette zone géographique spécifique. Quand tu configures tes models dans GeoDjango, tu définis le SRID directement sur le champ spatial. Si tu ne fais rien, il est à 4326 par défaut. Si tu veux une projection localisée en mètres, tu passes cet integer spécifique à la définition du field. GeoDjango traite ensuite toute la geometry de cette colonne selon ce modèle mathématique spécifique. Le bon SRID garantit que tes calculs de distance ne se déforment pas quand tes données s'éloignent de l'équateur. Merci d'avoir écouté. À la prochaine !
5

Conception de modèles géographiques

3m 28s

Cet épisode montre comment concevoir des modèles géographiques dans GeoDjango. Vous apprendrez à définir les attributs PointField et MultiPolygonField pour stocker des données spatiales dans votre application Django.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. GeoDjango et PostGIS, épisode 5 sur 15. Tu veux ajouter des données de localisation à ton application, donc tu pourrais penser à ajouter deux simples float fields pour la latitude et la longitude à ta base de données. Mais faire ça te bloque complètement l'accès aux requêtes spatiales avancées, aux calculs de distance et aux intersections géométriques. Pour débloquer ces capacités, tu as besoin de vrais types spatiaux, ce qui nous amène à la conception de models géographiques. Passer des models Django standards aux models GeoDjango ne demande qu'un léger changement dans tes imports. Au lieu de tirer ça des models de base de données Django standards, tu importes les models depuis le module contrib géographique. Ce module custom fournit un drop-in replacement. Il te donne accès à tous les types de fields Django standards, comme les characters et les integers, tout en introduisant de manière transparente les types spatiaux dans la même définition de class. Prends un scénario où tu construis un model WorldBorder pour stocker des données de pays. Tu définis la class du model exactement comme n'importe quelle autre. Tu assignes un character field pour le nom du pays, un integer field pour la population, et un float field pour la superficie totale. Pour gérer la géométrie réelle de la carte, tu ajoutes un geographic field directement à côté des autres. Pour un pays, tu utiliserais un MultiPolygonField. Alors qu'un PointField est parfait pour stocker une seule paire de coordonnées comme une capitale, un MultiPolygonField peut représenter des frontières nationales complexes, y compris des nations avec plusieurs masses terrestres déconnectées ou des îles au large. Quand tu attaches ce spatial field à ton model, tu définis un système de coordonnées en arrière-plan. Chaque geographic field repose sur un Spatial Reference System Identifier, connu sous le nom de SRID. Le SRID indique à la base de données comment projeter les coordonnées brutes sur la forme réelle de la Terre. Si tu ne définis pas explicitement cette valeur, GeoDjango met automatiquement le SRID par défaut à 4326. Cet integer spécifique fait référence au standard WGS84, qui est exactement le même système de coordonnées utilisé par le matériel GPS standard. Si tes données sources reposent sur une projection locale différente, tu passes simplement l'integer cible au paramètre SRID directement dans la définition du field. C'est là que ça devient intéressant. Les développeurs familiers avec l'ORM Django savent que pour rendre une colonne rapide à requêter, tu dois explicitement passer un flag d'index de base de données à la définition du field. Parce que les requêtes spatiales sont intrinsèquement lourdes, tu pourrais supposer que tu as besoin de configurer manuellement des index spécialisés pour tes colonnes de géométrie. Eh bien non. Les geographic fields dans GeoDjango fonctionnent différemment. Ils incluent un paramètre spécifique pour l'indexation spatiale, et il est à true par défaut. Quand tu lances tes migrations, GeoDjango dit automatiquement à la base de données sous-jacente de construire un index spatial spécialisé. Tu obtiens des requêtes de bounding box haute performance et des recherches d'intersections géographiques directement out of the box, avec zéro configuration supplémentaire. La vraie force de concevoir des models de cette façon, c'est que ça démystifie complètement les données spatiales. Un polygone massif et complexe représentant un continent devient juste une autre property sur ton objet Python, prête à être sauvegardée et requêtée aux côtés d'un simple décompte de population. C'est tout pour aujourd'hui. Merci d'avoir écouté — va créer un truc cool.
6

L'API GDAL et OGR

3m 28s

Cet épisode présente le wrapper de l'API GDAL et OGR dans GeoDjango. Vous apprendrez comment inspecter et lire des fichiers vectoriels externes comme les Shapefiles nativement en Python avant de les importer.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. GeoDjango et PostGIS, épisode 6 sur 15. On te file un énorme fichier spatial — un ESRI Shapefile ou un GeoJSON — et tu dois savoir quels attributs il contient. Ton premier réflexe serait peut-être d'installer un gros logiciel SIG de bureau juste pour jeter un œil dedans. Pas besoin. GeoDjango peut lire ces fichiers nativement, directement dans le shell Python, en utilisant l'API GDAL et OGR. Si les systèmes d'information géographique sont une boîte à outils, la Geospatial Data Abstraction Library est le traducteur universel. Techniquement, GDAL gère les données raster comme les images satellites, tandis que son partenaire OGR gère les données vectorielles comme les points, les lignes et les polygones. GeoDjango embarque un wrapper Pythonic autour de la library OGR, ce qui te donne un moyen direct d'inspecter presque n'importe quel format de fichier vectoriel sur la planète. Disons que tu as téléchargé un shapefile contenant les frontières de tous les pays du monde. Avant d'écrire un script pour ingérer ces données, tu dois savoir exactement comment c'est structuré. Tu commences par importer l'objet DataSource depuis le module GDAL de GeoDjango. Tu crées une nouvelle data source en lui passant le chemin d'accès de ton shapefile. Cet objet représente maintenant tout ton dataset spatial téléchargé. Une data source organise ses informations spatiales en layers. Tu peux demander à la data source le nombre de ses layers. Un ESRI Shapefile ne contient traditionnellement qu'un seul layer, mais des formats comme les GeoPackages peuvent en contenir des dizaines. Tu récupères ce premier layer en utilisant son index, exactement comme pour extraire un item d'une liste Python standard. Voici le point clé. C'est dans l'objet layer que la véritable introspection se passe. Il agit comme un container pour les enregistrements spatiaux individuels, que l'API appelle des features. Tu peux demander au layer de retourner son nombre total de features. Pour notre fichier des frontières mondiales, ce compte devrait correspondre à peu près au nombre de pays sur Terre. Tu peux aussi demander au layer son geometry type. Ça confirme si les données sont constituées de points, de lignes ou de polygones. Pour les frontières de pays, le type retourné sera généralement MultiPolygon. Ensuite, tu dois savoir quelles métadonnées sont attachées à ces formes. Tu peux demander au layer ses fields. Ça retourne une liste de strings représentant les noms des colonnes d'attributs. Tu pourrais voir des noms correspondant à un code pays interne, un nom courant et un nombre d'habitants. Tu peux même creuser un niveau plus bas. En accédant à une feature individuelle depuis le layer via son index, tu peux inspecter un seul pays. Tu peux demander à cette feature spécifique la valeur de son field de nom courant. Tu peux aussi accéder à l'objet geometry spécifique de cette feature et lui demander de sortir ses coordonnées en well-known text ou en GeoJSON. Tu as maintenant cartographié exactement quelles formes le fichier contient, les noms de ses attributs et la structure de ses enregistrements. Tu as fait tout ça purement en Python, sans écrire de script d'import pour la base de données ni dépendre d'un logiciel de visualisation externe. Le wrapper GDAL transforme ton shell Python standard en une loupe d'exploration pour les données spatiales, te permettant de valider des fichiers externes avant même qu'un seul enregistrement ne touche ta base de données. C'est tout pour cet épisode. Merci d'avoir écouté, et continue de développer !
7

Ingestion de données spatiales avec LayerMapping

3m 36s

Cet épisode traite de l'automatisation des importations de données spatiales. Vous apprendrez à utiliser l'utilitaire LayerMapping pour mapper sans effort les données de Shapefiles externes directement dans vos modèles GeoDjango.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. GeoDjango et PostGIS, épisode 7 sur 15. Importer manuellement des milliers de polygones géographiques et leurs métadonnées pourrait prendre des jours. Tes fichiers sources ont des noms de colonnes obscurs et des types incompatibles, mais ta base de données exige une structure stricte. La solution, c'est l'utilitaire LayerMapping de GeoDjango, qui gère tout ce processus d'ingestion avec exactement un seul dictionnaire. Quand tu travailles avec des données spatiales, tu reçois souvent des fichiers vectoriels comme les Shapefiles d'ESRI. Ces fichiers contiennent à la fois les formes géométriques des lieux et les données d'attributs attachées à ces formes. Cependant, les fichiers externes correspondent rarement au schéma de ta base de données. Un Shapefile peut avoir une colonne de population abrégée en POP2005 et un code pays listé comme ISO2. Ton modèle Django impeccable, disons WorldBorder, a des champs clairement nommés et strictement typés pour ces attributs exacts. Tu pourrais être tenté d'utiliser des imports SQL manuels ou des outils de base de données comme pgAdmin pour pousser ces données dans PostGIS. LayerMapping est une approche complètement différente. C'est un utilitaire de script Python programmatique. Il vit directement dans ton projet Django, et relie les fichiers spatiaux externes directement à ton Object Relational Mapper. Voici le point clé. Le cœur de LayerMapping est un simple dictionnaire Python. Les clés de ce dictionnaire sont les noms des champs de ton modèle Django propre. Les valeurs sont les noms bruts au format string des attributs dans ton fichier source. Par exemple, ton dictionnaire mappe le nom du champ du modèle Django à l'attribut NAME du Shapefile. Il mappe le champ population de ton modèle à POP2005, et le champ du code iso à ISO2. Tu mappes aussi le champ geometry de ton modèle au type de geometry du Shapefile, qui est généralement représenté par une string comme MULTIPOLYGON. Pour automatiser ça, tu écris un court fichier Python, généralement appelé un load script. Dans ce script, tu importes ton modèle WorldBorder et l'outil LayerMapping. Tu définis ton dictionnaire de mapping. Ensuite, tu crées une nouvelle instance de LayerMapping. Tu passes à cette instance trois informations obligatoires. Premièrement, ton modèle Django. Deuxièmement, le chemin de fichier vers ton Shapefile source. Troisièmement, le dictionnaire de mapping que tu viens de créer. Tu peux aussi fournir des arguments optionnels pour contrôler le comportement d'ingestion. Si tes données sources sont déjà dans le système de référence spatiale exact que ta base de données attend, tu peux dire à l'utilitaire de ne pas faire de transformations de coordonnées. Ça évite des calculs inutiles et accélère l'import. Enfin, tu appelles la méthode save sur ton instance de LayerMapping. Quand tu exécutes ce script, l'utilitaire prend entièrement le relais. Il ouvre le Shapefile, itère sur chaque entité géographique, et utilise ton dictionnaire pour aligner les attributs en désordre du fichier avec les champs stricts de ton modèle. Il traduit automatiquement la géométrie brute dans un format que PostGIS comprend, et sauvegarde les enregistrements dans ta base de données. Tu peux dire à la méthode save de lever une exception à la première erreur qu'elle rencontre, ou tu peux la laisser tourner et simplement logger les entités problématiques dans ton terminal. Le point à retenir le plus important, c'est que LayerMapping découple complètement la structure rigide des fichiers spatiaux externes du design propre de ta base de données, te permettant d'ingérer des datasets massifs avec juste quelques lignes de Python. Avant de terminer, si tu aimes l'émission et que tu veux nous aider à continuer, tu peux nous soutenir en cherchant DevStoriesEU sur Patreon. C'est tout pour cet épisode. Merci d'avoir écouté, et continue de développer !
8

L'API GEOS : la géométrie pythonique

3m 32s

Cet épisode se concentre sur l'API GEOS pour la manipulation de géométrie de manière pythonique. Vous apprendrez à effectuer des opérations topologiques comme des unions et des intersections en mémoire sans solliciter la base de données.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. GeoDjango et PostGIS, épisode 8 sur 15. Tu penses peut-être qu'à chaque fois que tu dois fusionner deux polygones ou trouver une intersection spatiale, tu dois écrire une query et attendre que la base de données te réponde. En réalité, tu peux faire des calculs spatiaux complexes directement dans ton shell Python, sans jamais toucher à une connexion base de données. C'est exactement ce qu'on va voir aujourd'hui : l'API GEOS et la géométrie Pythonic. Une idée reçue très courante avec GeoDjango, c'est que PostGIS fait tout le gros du travail spatial. Même si PostGIS est incroyablement puissant, l'API GEOS te permet de faire des opérations géométriques entièrement en mémoire locale. GEOS veut dire Geometry Engine Open Source. C'est une library C++ ultra optimisée, mais GeoDjango te donne un wrapper puissant qui s'appelle l'objet GEOSGeometry. Cet objet te permet de créer, manipuler et analyser des géométries purement en Python. C'est là que ça devient intéressant. Un objet GEOSGeometry ne ressemble pas du tout à un wrapper lourd autour d'une library C. Il se comporte exactement comme un container Python natif. Si tu as une LineString avec dix points, tu peux utiliser la fonction length standard de Python dessus pour voir qu'elle a dix coordonnées. Tu peux itérer sur un Polygon avec une for-loop standard pour extraire ses anneaux individuels, ou utiliser un index pour récupérer un point spécifique dans une géométrie MultiPoint. Ils se comportent exactement comme des listes ou des tuples de coordonnées classiques. La vraie puissance se débloque quand tu appliques des opérations topologiques. Disons que tu codes une application de logistique et que tu as deux zones de livraison qui se chevauchent, définies comme des GEOS Polygons. Tu dois trouver la zone exacte où ces deux zones se chevauchent. Tu n'as pas besoin de sauvegarder ces zones dans un model et de lancer une query en base de données. À la place, tu peux générer le chevauchement instantanément en mémoire. D'abord, tu instancies deux objets GEOSGeometry qui représentent tes zones de livraison. Ensuite, tu peux simplement appeler la méthode intersection sur le premier polygone, en passant le deuxième polygone en argument. Comme l'API est profondément Pythonic, tu peux aussi juste utiliser l'opérateur bitwise AND. Tu tapes littéralement polygone un, une esperluette, et polygone deux. Ça te retourne un tout nouvel objet GEOSGeometry qui représente la forme exacte du chevauchement. Tu as accès à toute une suite de ces opérations spatiales. Si tu as besoin de trouver la zone couverte par la première zone de livraison mais strictement en dehors de la deuxième, tu utilises la méthode difference, ou l'opérateur moins classique de Python. Si tu veux les fusionner en une seule zone massive, tu utilises la méthode union, ou l'opérateur bitwise OR avec un pipe. Tu peux même générer de nouvelles formes à partir de rien. Appeler la méthode buffer sur une géométrie de type point avec un argument width calcule et retourne instantanément un polygone qui représente un cercle parfait dessiné autour de ce point. Comme tout repose sur le moteur C++ en dessous, ces calculs se font extrêmement vite. Ce qu'il faut retenir ici, c'est que l'API GEOS te donne un moteur spatial indépendant in-memory, qui te permet de valider des géométries, de calculer des buffers et de trouver des intersections avant même qu'un seul octet de donnée n'atteigne ta base de données. C'est tout pour cet épisode. À la prochaine !
9

Maîtriser les lookups spatiaux

3m 52s

Cet épisode explique les lookups de requêtes géographiques dans l'ORM Django. Vous apprendrez à utiliser des filtres spatiaux pour trouver des relations, comme déterminer quels points sont contenus dans des limites spécifiques.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. GeoDjango et PostGIS, épisode 9 sur 15. Oublie les comparaisons de coordonnées interminables. Tu as la localisation d'un utilisateur et une zone de livraison, et tu dois savoir si elles se chevauchent. Mathématiquement, ça implique de vérifier des centaines d'arêtes de polygones dans la logique de ton application. Au lieu de ça, GeoDjango réduit tout ça à une simple opération de base de données. Aujourd'hui, on va maîtriser les lookups spatiaux. Si tu as déjà utilisé Django, tu connais la syntaxe du double underscore pour filtrer les querysets. Tu ajoutes par exemple double underscore exact ou double underscore in à un nom de champ. GeoDjango étend exactement cette même syntaxe pour exécuter des relations topologiques PostGIS complexes. Les relations topologiques, ce sont juste des règles sur la façon dont les géométries partagent l'espace. Est-ce qu'elles se touchent ? Est-ce qu'elles se chevauchent ? Est-ce que l'une est entièrement à l'intérieur de l'autre ? GeoDjango te donne des types de lookups dédiés pour poser ces questions directement dans tes requêtes ORM. Le lookup spatial le plus courant et le plus permissif, c'est intersects. Si tu filtres un champ geometry avec double underscore intersects, la base de données renvoie les enregistrements où les deux géométries partagent n'importe quelle portion d'espace. Elles peuvent se croiser, se toucher sur une limite, ou l'une peut complètement envelopper l'autre. Tant qu'il y a le moindre espace partagé, intersects renvoie true. Souvent, tu as besoin de plus de précision qu'une simple intersection. Tu as besoin de limites strictes. C'est là que contains et within entrent en jeu. Les devs les confondent tout le temps. Voici le truc à retenir. La différence est purement directionnelle. Si la géométrie A contient la géométrie B, alors la géométrie B est within la géométrie A. Imagine une boîte et une bille. La boîte contient la bille. La bille est within la boîte. Tu choisis le lookup en fonction de la géométrie qui est dans la colonne de ta base de données et de la géométrie que tu passes comme argument de ton filter. Prends un scénario concret. Tu as une table de base de données de maisons, et chaque maison a une geometry de type point qui représente sa localisation. La ville vient de publier un nouveau polygon qui définit une zone inondable. Tu dois trouver toutes les maisons qui se trouvent parfaitement à l'intérieur de cette zone à risque. Tu ne fais pas une requête sur la zone inondable pour voir ce qu'elle contient. Tu fais une requête sur les maisons. Tu appelles filter sur le model de la maison, tu références le champ geometry du point, tu ajoutes double underscore within, et tu passes le polygon de la zone inondable comme valeur. Quand tu exécutes cette requête, Django traduit ton lookup avec double underscore en un appel de fonction PostGIS natif, plus précisément ST_Within. Le moteur de base de données évalue les géométries en utilisant ses index spatiaux optimisés. Il vérifie si chaque coordonnée du point de la maison se trouve à l'intérieur du polygon de la zone inondable. Si la maison se trouve exactement sur la limite du polygon, elle n'est pas considérée comme within. L'inclusion stricte signifie que l'intérieur de la première géométrie doit être complètement dans l'intérieur de la deuxième géométrie. Si tu inverses le scénario, disons que tu fais une requête sur une table de base de données de quartiers pour trouver celui qui entoure la localisation spécifique d'un utilisateur, tu utilises double underscore contains. Tu filtres le champ polygon du quartier, tu ajoutes double underscore contains, et tu passes le point de l'utilisateur. La logique est identique sous le capot, mais l'ordre des arguments spatiaux passés à PostGIS est inversé. Comprendre cette logique directionnelle évite les échecs silencieux et les querysets vides. En mappant les opérations PostGIS directement sur les keyword arguments de Django, tu filtres efficacement des datasets spatiaux massifs sans écrire de SQL brut. La géométrie sur laquelle tu filtres dicte toujours la direction de ton lookup spatial. Merci d'avoir écouté. À la prochaine !
10

Requêtes de distance à haute performance

3m 27s

Cet épisode aborde les requêtes de proximité et de distance à haute performance. Vous apprendrez à utiliser les lookups de distance et l'objet de distance géographique pour trouver efficacement des emplacements à proximité.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. GeoDjango et PostGIS, épisode 10 sur 15. Les radius queries sont le pain quotidien des applications géolocalisées. Si tu les écris mal, ta base de données calcule la distance exacte pour chaque ligne de ta table, ce qui force un full scan massif. Si tu les écris bien, ça prend quelques millisecondes. Des distance queries haute performance font toute la différence entre une app super réactive et une app qui plante sous la charge. Une erreur fréquente des développeurs, c'est de penser aux spatial queries de la même façon qu'aux maths de base. L'approche naïve, c'est de calculer la distance précise entre ton point cible et tous les autres points de la base de données, puis de filtrer tout ce qui dépasse ton radius maximum. Tu ne devrais jamais faire ça. Calculer des distances réelles sur une sphère, c'est très lourd en calcul. Si ta query filtre en calculant d'abord la distance, la base de données ne peut pas utiliser ses spatial indexes. Elle est obligée de vérifier chaque ligne une par une. Pour garder des queries rapides, tu dois t'appuyer sur des lookups basés sur des index. Avant de regarder les lookups de la base de données, tu as besoin d'un moyen d'exprimer clairement la distance dans ton code Python. GeoDjango fournit l'objet Distance, souvent importé simplement avec la lettre D majuscule. Tu l'initialises avec une unité et une valeur. Par exemple, passer l'argument m i equals five à cet objet crée une mesure d'exactement cinq miles. Tu peux utiliser des kilomètres, des mètres, ou même des degrés. Ça normalise la mesure en Python avant même que la query ne tape la base de données. Imagine un scénario où tu implémentes une feature qui trouve tous les cafés dans un radius de cinq miles autour du ping GPS actuel d'un utilisateur. Tu as le point de localisation de l'utilisateur, et tu veux faire une query sur ton model de café. Tu pourrais utiliser le lookup distance less-than-or-equal. Tu écris un query filter où ton champ de localisation de café est suivi d'un double underscore, du mot distance, d'un underscore, et des lettres l t e. Tu lui passes un tuple contenant le point de l'utilisateur et ton objet Distance réglé sur cinq miles. Ça marche. Ça se traduit par une fonction de base de données qui vérifie si la distance est inférieure ou égale à cinq miles. Mais selon ton spatial backend et la façon dont tes colonnes sont configurées, ce lookup pourrait quand même faire plus de travail mathématique que strictement nécessaire, en calculant les distances exactes avant de faire la comparaison finale. Voici le point clé. Tu as rarement besoin de connaître la distance exacte pour filtrer un radius. Tu as juste besoin de savoir si l'objet est à l'intérieur du cercle. C'est là que le lookup dwithin devient essentiel. Au lieu de distance less-than-or-equal, tu ajoutes un double underscore et le mot dwithin à ton champ de localisation. Tu lui passes exactement le même point utilisateur et l'objet Distance de cinq miles. Sous le capot, ça route directement vers la fonction PostGIS ST DWithin. Cette fonction est super optimisée. Elle fait d'abord un check rapide de bounding-box, ce qui utilise parfaitement tes spatial indexes. Elle dessine un carré approximatif autour de ton radius de cinq miles et écarte immédiatement tous les points en dehors de ce carré, sans faire de maths sphériques complexes. Elle ne fait des calculs précis et coûteux que pour les quelques points qui tombent près de la limite du cercle à l'intérieur de ce carré. Si ta table de base de données utilise des colonnes geography au lieu de colonnes geometry de base, PostGIS gère automatiquement la courbure de la Terre tout en gardant l'utilisation de cet index ultra rapide. L'habitude la plus précieuse en spatial programming, c'est de réaliser que vérifier si un point se trouve à l'intérieur d'une forme est toujours moins coûteux que de sortir un mètre ruban pour calculer la distance exacte entre eux. Merci d'avoir passé quelques minutes avec moi. À la prochaine, prends soin de toi.
11

Fonctions de base de données géographiques

3m 22s

Cet épisode explore les fonctions de base de données spatiales accessibles via GeoDjango. Vous apprendrez à calculer des surfaces, extraire des centroïdes et générer du GeoJSON directement dans la couche de la base de données.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. GeoDjango et PostGIS, épisode 11 sur 15. Tu as une base de données remplie de polygones massifs et complexes, et ton frontend a juste besoin d'afficher un pin au centre de chacun. Si tu récupères ces polygones bruts dans Python pour calculer le centre, tu fais transiter des mégaoctets de données de coordonnées inutiles sur le réseau. La solution, c'est de repousser ces calculs vers la base de données en utilisant les Geographic Database Functions. Il y a deux façons de récupérer des infos spatiales, comme une aire ou un point central, dans GeoDjango. La première, c'est de requêter l'enregistrement en base de données, de tirer toute la géométrie dans un objet GEOS Python, et d'accéder à une propriété comme dot area dessus. Ne fais pas ça à moins d'avoir vraiment besoin de la géométrie complète dans Python. Récupérer la frontière d'un parc national peut signifier charger des dizaines de milliers de sommets en mémoire juste pour calculer un seul nombre. La deuxième méthode, beaucoup plus efficace, c'est de dire à PostGIS de calculer la réponse et de ne renvoyer que le résultat final. C'est là que les Geographic Database Functions, combinées à la méthode annotate de l'ORM Django, deviennent essentielles. Regardons un scénario pratique. Tu construis une API qui liste des parcs nationaux. Pour la list view, l'application cliente a juste besoin du nom du parc, de son aire totale, et d'une seule coordonnée centrale pour placer un pin sur la carte. Elle n'a pas besoin du polygone de frontière complexe. Dans ton queryset Django, tu utilises la méthode annotate. Tu lui dis de créer un nouvel attribut, disons park area, et tu le définis comme étant égal à la fonction Area qui agit sur ta colonne de géométrie. Juste à côté, tu crées un autre attribut appelé center point, défini comme étant égal à la fonction Centroid sur cette même colonne de géométrie. Enfin, tu restreins l'output de la requête à juste le nom et tes deux nouvelles annotations. Quand cette requête s'exécute, PostGIS lit les données de géométrie brutes sur le disque. Il lance des routines internes hautement optimisées pour calculer l'aire spatiale et trouver le point central mathématique. Il retourne ensuite exactement trois choses sur le réseau à ton application Django : une string de texte pour le nom, un nombre pour l'aire, et une géométrie à un seul point pour le centre. Tu contournes complètement les coûts en bande passante et en mémoire liés au transfert du gros polygone. Cette stratégie s'applique à plein d'opérations spatiales. Tu peux utiliser la fonction Transform dans une annotation pour convertir les coordonnées de la projection de stockage de ta base de données directement dans la projection dont ta web map a besoin, comme Web Mercator. La base de données gère les calculs avant même que Python ne voie les données. Tu peux aussi utiliser la fonction AsGeoJSON. Ça indique à PostGIS de formater les données spatiales en une string de texte JSON standard directement dans la base de données. Quand Django la reçoit, c'est juste du texte prêt à être passé directement à ton frontend, ce qui évite complètement l'overhead de sérialisation Python. Tu peux aussi appliquer des fonctions d'agrégation sur des querysets entiers. La fonction Extent regarde un groupe de géométries et retourne une seule bounding box qui les couvre toutes. Si un utilisateur cherche tous les parcs dans une région spécifique, retourner l'Extent te donne les coordonnées exactes nécessaires pour zoomer automatiquement la carte du frontend afin d'y faire rentrer tous les résultats parfaitement. Voici l'idée clé. Ta base de données spatiale est un moteur de calcul hautement spécialisé, pas juste un conteneur de stockage. Garde tes calculs spatiaux lourds à l'intérieur de PostGIS, et ne fais transiter que les réponses calculées sur le réseau vers Python. C'est tout pour cet épisode. À la prochaine !
12

Données Raster dans PostGIS

3m 45s

Cet épisode présente les rasters PostGIS et les RasterFields de GeoDjango. Vous apprendrez à stocker et interroger des données spatiales continues comme des modèles d'élévation ou des cartes de température.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. GeoDjango et PostGIS, épisode 12 sur 15. Les formes vectorielles sont super quand tu veux tracer une ligne nette autour des limites d'une ville ou localiser précisément un utilisateur. Mais que se passe-t-il quand tu dois cartographier quelque chose qui n'a pas de limites précises, comme les variations de température sur un continent ou l'altitude de toute une chaîne de montagnes ? Tu ne peux pas dessiner un polygone pour chaque degré de température. C'est là que les Raster Data dans PostGIS entrent en jeu. Si tu as l'habitude de travailler avec des points, des lignes et des polygones, les données raster demandent un petit changement de perspective. Les données raster ne sont pas faites de formes discrètes. C'est une grille continue de pixels, exactement comme une photo numérique. Mais au lieu de valeurs de couleur rouge, verte et bleue, chaque pixel contient un point de donnée numérique spécifique. Cette donnée peut être les précipitations, le type de sol ou l'altitude. La grille entière est liée mathématiquement au monde réel grâce au géoréférencement. Ça veut dire que la base de données sait exactement où se trouve chaque pixel sur la carte. Dans GeoDjango, gérer ces données implique principalement deux composants : le RasterField et l'objet GDALRaster. RasterField est le type de colonne dans la base de données. Tu l'ajoutes à ton modèle Django exactement comme tu le ferais pour un champ geometry. Ça indique à PostGIS d'allouer de l'espace en interne pour les données de la grille. Mais tu n'interagis pas directement avec les octets bruts de la base de données. Quand tu extrais un raster de la base de données, ou avant d'en insérer un, tu utilises GDALRaster. C'est un wrapper Python autour des librairies géospatiales sous-jacentes. Il te permet d'inspecter les propriétés du raster, comme son échelle, son système de coordonnées de référence, et les valeurs réelles à l'intérieur de ses bandes. Une bande est juste une seule couche de données dans la grille. Une image standard a trois bandes pour la couleur, mais une carte d'élévation n'a généralement qu'une seule bande qui représente la hauteur. Prenons un scénario concret. Tu construis une application pour les randonneurs, et tu as un Digital Elevation Model d'une chaîne de montagnes. Ce modèle d'élévation est généralement fourni sous forme de fichier GeoTIFF. D'abord, tu définis un modèle Django pour ta chaîne de montagnes et tu lui donnes un RasterField. Ensuite, dans ton code Python, tu instancies un GDALRaster en lui passant le chemin du fichier vers ton GeoTIFF. Django charge le fichier en mémoire en tant qu'objet GDALRaster. Tu assignes cet objet au RasterField sur ton modèle de montagne et tu appelles save. PostGIS prend cette grille et la stocke. Maintenant, quand un randonneur uploade son itinéraire GPS, tu peux requêter la base de données pour trouver exactement dans quel pixel tombent ses coordonnées. Tu extrais la valeur d'élévation stockée dans ce pixel spécifique. Quand tu relis ce champ depuis la base de données, Django te redonne un objet GDALRaster. Tu peux demander à cet objet sa largeur, sa hauteur ou son étendue spatiale. Tu peux accéder directement aux arrays de données brutes des pixels en Python pour faire des calculs avant d'envoyer les données au front end de ton application. Voici l'idée clé. Tu utilises des vecteurs pour les choses qui existent à un endroit spécifique, et tu utilises des rasters pour les choses qui existent partout sur une zone. En combinant les deux dans PostGIS, ton application peut relier des objets discrets, comme un sentier de randonnée, à des environnements continus, comme l'altitude réelle du sol sous tes pieds. Si tu veux aider à faire vivre l'émission, tu peux chercher DevStoriesEU sur Patreon — ton soutien compte beaucoup. C'est tout pour cet épisode. Merci d'avoir écouté, et continue de développer !
13

Géolocalisation avec GeoIP2

3m 35s

Cet épisode couvre la géolocalisation basée sur l'IP en utilisant le module GeoIP2 de GeoDjango. Vous apprendrez à faire correspondre les adresses IP des utilisateurs à des villes et des pays en utilisant les jeux de données MaxMind.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. GeoDjango et PostGIS, épisode 13 sur 15. Et si tu as besoin de savoir où se trouve un utilisateur pour lui servir du contenu local, mais qu'il ne t'a pas donné les permissions GPS ? Son adresse IP entrante contient la réponse. C'est la géolocalisation avec GeoIP2. Pour être clair d'entrée de jeu, la géolocalisation par IP n'est pas un lookup de coordonnées précis comme une API de géolocalisation de navigateur. C'est une approximation. Quand tu fais un lookup sur une adresse IP, tu requêtes un dataset statique qui mappe des blocs d'IP assignés à des zones géographiques. Ça te donne presque toujours le bon pays, et souvent la bonne ville, mais ça ne trouvera pas l'adresse exacte de l'utilisateur. Imagine un scénario où un visiteur arrive sur ton site e-commerce. Tu veux le rediriger automatiquement vers la boutique localisée de son pays ou centrer une carte par défaut sur sa région, uniquement en te basant sur son adresse IPv4 ou IPv6 entrante. GeoDjango fournit l'objet GeoIP2 spécifiquement pour gérer ce lookup offline. Avant de pouvoir écrire la moindre logique, tu dois mettre en place les bons éléments. D'abord, tu installes la library Python geoip2 dans ton environnement. Ensuite, tu as besoin des données elles-mêmes. GeoIP2 s'appuie sur les datasets MaxMind, généralement les bases de données gratuites GeoLite2 City ou Country. Tu télécharges ces fichiers, qui ont une extension mmdb, et tu les places sur ton serveur. Enfin, dans tes settings Django, tu définis une variable appelée GEOIP_PATH et tu la fais pointer vers le répertoire qui contient ces fichiers. Django s'attend à trouver des fichiers avec des noms spécifiques comme GeoLite2-City point mmdb dans ce dossier. Une fois le setup terminé, utiliser l'outil ne demande que quelques étapes. Tu importes l'objet GeoIP2 depuis le module django contrib gis geoip2 et tu l'instancies. Tu extrais la string de l'adresse IP entrante depuis les headers de ta requête, et tu la passes à l'une des méthodes de lookup. Si tu as juste besoin d'une logique de routing globale, tu appelles la méthode country. Tu lui passes l'adresse IP, et elle te retourne un dictionnaire contenant le code et le nom du pays. Si tu as besoin de plus de granularité pour centrer une carte, tu appelles plutôt la méthode city. Ça retourne un dictionnaire plus riche contenant le nom de la ville, la région, et les valeurs approximatives de longitude et de latitude. La méthode city inclut aussi les données du pays, donc tu n'as besoin de faire qu'un seul call. Si tu veux simplement les coordonnées pour les passer à une autre fonction, il y a des méthodes dédiées comme coords qui retournent un tuple basique de longitude et latitude. Tu dois aussi gérer les erreurs proprement. Si tu passes une adresse IP invalide, ou une adresse qui n'est tout simplement pas présente dans la base de données MaxMind, GeoIP2 ne retourne pas un dictionnaire vide. Il lève une GeoIP2Exception. Tu dois wrapper tes calls de lookup dans un bloc try et fournir une localisation de fallback par défaut pour ta boutique quand le lookup échoue. Voici le point clé. Le code en lui-même est essentiellement juste un lecteur de fichiers optimisé. La précision de ta géolocalisation dépend entièrement de la fraîcheur de la base de données qui se trouve dans ton répertoire GEOIP_PATH. Les allocations d'IP changent constamment. Si tu construis un système de routing autour de GeoIP2, tu dois automatiser le téléchargement régulier des nouveaux fichiers de base de données, sinon tes redirections localisées deviendront lentement et silencieusement incorrectes. C'est tout pour cette fois. À la prochaine !
14

Tester des applications spatiales

3m 18s

Cet épisode se concentre sur les tests d'applications spatiales dans GeoDjango. Vous apprendrez à configurer votre suite de tests, à gérer les bases de données modèles PostGIS et à définir les privilèges des utilisateurs.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. GeoDjango et PostGIS, épisode 14 sur 15. Tester des applications spatiales a une particularité : ta base de données de test automatisée doit installer des extensions spatiales complexes de niveau C avant même que le tout premier test ne tourne. Si ton pipeline automatisé plante instantanément avec des erreurs de permissions, c'est probablement pour ça. Aujourd'hui, on va s'intéresser aux tests d'applications spatiales. Le premier prérequis, c'est purement de la configuration. Quand tu lances tes tests, Django crée une base de données de test parallèle pour protéger tes données de production. Pour GeoDjango, cette base de données de test doit être spatiale. Ça veut dire que tes settings de base de données doivent explicitement utiliser un moteur spatial, comme le backend PostGIS fourni par GeoDjango. Tu ne peux pas utiliser le backend Postgres standard et juste ajouter des champs spatiaux plus tard. C'est le backend spatial qui dit au test runner de Django de chercher et d'initialiser les features spatiales requises. Voici le truc important à comprendre. Le test runner standard de Django crée une base de données toute neuve, lance tes migrations et démarre les tests. Mais pour une application GeoDjango, créer une nouvelle base de données ne suffit pas. La base de données doit aussi charger l'extension PostGIS. Ce n'est pas une table SQL standard. C'est une extension au niveau système. Par défaut, PostgreSQL restreint qui peut créer des extensions pour des raisons de sécurité. Ça demande généralement un utilisateur de base de données avec des privilèges superuser. C'est exactement là que les pipelines d'intégration continue plantent souvent. Tu lances un container Postgres, tu lui passes un utilisateur de base de données standard, et tu dis à Django de lancer les tests. Django se connecte, essaie de builder la base de données de test, tente de lancer la commande pour créer l'extension PostGIS, et tombe sur une erreur permission denied. Pour corriger ça dans un pipeline automatisé, l'utilisateur de la base de données qui exécute les tests doit avoir les privilèges nécessaires. L'approche la plus simple dans un environnement isolé et jetable, c'est d'accorder temporairement les rôles superuser à l'utilisateur de test. Si tes politiques de sécurité interdisent l'accès superuser même dans un container temporaire, tu dois configurer PostgreSQL pour que l'utilisateur de test spécifique soit un owner de confiance de la base de données de test, et soit explicitement autorisé à créer l'extension PostGIS. Une fois la base de données construite, GeoDjango a besoin de savoir avec quoi il travaille. Différentes versions de PostGIS supportent différentes fonctions spatiales. En fonctionnement normal, GeoDjango fait une query à la base de données pour déterminer la version de PostGIS installée. Par contre, dans un environnement de test, tu peux bypasser cette query en définissant un setting spécifique appelé PostGIS Version. Tu le fournis sous la forme d'un tuple de trois nombres, qui représentent les versions major, minor et patch. Définir ça explicitement peut accélérer l'initialisation des tests et sert de fail-safe si la connexion à la base de données galère pendant la vérification initiale de la version. Lancer des tests spatiaux, ce n'est pas une question d'écrire des assertions différentes. C'est avant tout un challenge d'infrastructure. Le truc le plus important à retenir, c'est que si ton utilisateur de base de données de test ne peut pas créer d'extensions à la volée, tes tests ne démarreront même pas. Corrige les privilèges de ton utilisateur de test pour bootstraper PostGIS, et le reste de ton pipeline se comportera exactement comme une test suite Django standard. Merci d'avoir passé quelques minutes avec moi. À la prochaine, et prends soin de toi.
15

Déployer des applications GeoDjango

3m 53s

Cet épisode clôture la série en discutant des considérations de déploiement pour les applications GeoDjango. Vous en apprendrez davantage sur la sécurité des threads GDAL et sur la façon de configurer vos processus WSGI pour éviter les plantages.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. GeoDjango et PostGIS, épisode 15 sur 15. Ton app spatiale tourne parfaitement sur ton laptop. Tu la push sur un serveur de production, le trafic explose, et soudain l'application crashe silencieusement. Pas de traceback Python standard, juste des process morts. Le problème, c'est un conflit de threading au fin fond d'une librairie C. Le deploy d'applications GeoDjango demande d'éviter exactement ce piège. Le deploy d'une application web spatiale est presque identique au deploy d'un projet Django standard. Le routing, les connexions à la base de données et l'architecture serveur suivent exactement les mêmes règles. Mais GeoDjango comporte une variable cachée. Cette variable, c'est la Geospatial Data Abstraction Library, plus connue sous le nom de GDAL. GDAL est une énorme librairie C, ultra optimisée, qui fait le gros du travail pour les formats de données géographiques et les transformations de coordonnées. Voici le point crucial. GDAL n'est pas thread-safe. Ça explique pourquoi ton code marche en local mais crashe sur le serveur. Le serveur de développement Django en local traite les requêtes de manière séquentielle. Il déclenche rarement un accès concurrent à la librairie C. Les serveurs WSGI en production sont construits différemment. Pour gérer efficacement un fort trafic, les serveurs comme Apache avec mod_wsgi lancent généralement plusieurs threads au sein d'un même process. Python s'appuie généralement sur le Global Interpreter Lock pour empêcher les threads d'entrer en collision. Cependant, les librairies C gèrent leur propre mémoire de manière totalement indépendante du contrôle de Python. Si deux threads WSGI tentent d'exécuter une fonction GDAL en même temps, ils accèdent au même espace mémoire sans aucun contrôle de sécurité. Un thread corrompt les données que l'autre thread utilise. Comme ça se passe au niveau du C, Python ne peut pas lever une exception standard. Le résultat, c'est une segmentation fault. Le process du serveur s'arrête net, entraînant avec lui toutes les requêtes utilisateurs actives. Pour résoudre ça, tu dois changer la façon dont ton serveur WSGI gère la concurrence. Tu dois t'appuyer sur des process plutôt que sur des threads. Les systèmes d'exploitation isolent les process les uns des autres, en donnant à chaque process son propre espace mémoire dédié. Si tu push une app géographique à fort trafic en production avec Apache et mod_wsgi, tu gères ça dans la configuration du daemon. Au lieu de configurer un petit nombre de process avec un grand pool de threads, tu restreins les threads. Tu ouvres ton fichier de configuration Apache et tu cherches la directive WSGI daemon process. À côté du nom de l'application, tu ajoutes un paramètre qui définit explicitement les threads à exactement un. Ensuite, tu scale l'application en augmentant le nombre de process pour gérer la charge prévue. La même logique s'applique si tu utilises un serveur comme Gunicorn. Tu dois le bind à des process worker standards. Tu évites toute worker class qui introduit du threading ou des boucles d'événements asynchrones, parce qu'elles déclencheront inévitablement les mêmes collisions GDAL. Forcer ton serveur WSGI dans un modèle multi-process et single-threaded garantit que GDAL n'entre jamais en collision avec lui-même. L'étape la plus cruciale pour rendre une app GeoDjango production-ready, c'est d'isoler tes librairies C de la concurrence des threads. Ça conclut toute notre série sur GeoDjango et PostGIS. La meilleure façon de consolider ces concepts, c'est de lire la documentation officielle de Django et de coder quelque chose par toi-même. Si tu as des idées sur la prochaine technologie qu'on devrait aborder, visite devstories dot eu et suggère un sujet. Merci d'avoir écouté. Prenez soin de vous, tout le monde.