Dans l’article précédent nous avons vu les fonctions SQL de relation spatiale. Voyons maintenant les fonctions de traitement spatial de SQL.Commençons par voir quelle est la différence entre la notion de relation spatiale et de traitement spatial.
Le plus simple est de prendre un exemple. Nous avons des géométries qui partagent l’occupation de l’espace
Une fonction de relation spatiale, telle que st_intersects, va répondre à la question « est-ce que ces géométries s’intersectent? » par VRAI ou FAUX.
Une fonction de traitement spatial, telle que st_intersection, va extraire la partie commune des géométries en renvoyant comme résultat une géométrie :
Supposons que nous avons deux tables: rectangles et cercles, et que nous voulons extraire le résultat de cette image. Comment construit-on la requête SQL appropriée?
En faisant la même démarche que décrite dans le deuxième article de cette série:
- quelles sont les données que je veux obtenir?: je veux les géométries résultantes de l’intersection des cercles et des rectangles->clause SELECT:
SELECT st_intersection(cercles.geometry,rectangles.geometry) as geometry
- où est-ce qu’elles sont stockées? : dans les tables cercles et rectangles->clause FROM:
FROM cercles,rectangles
- quelles sont les conditions que je veux appliquer, spatiales ou pas? sélectionner seulement les entités qui occupent un espace commun->clause WHERE:
WHERE st_intersects(cercles.geometry,rectangles.geometry)
Ce qui nous fait la requête:
SELECT st_intersection(cercles.geometry,rectangles.geometry) as geometry
FROM cercles,rectangles
WHERE st_intersects(cercles.geometry,rectangles.geometry)
Vous pouvez omettre la clause WHERE et vous obtiendrez le même résultat, sauf que ça prendra beaucoup plus de temps. C’est logique de limiter l’opération d’intersection de st_intersection aux endroits où les géométries s’intersectent.
Les outils batch et les outils interactifs
Avant de voir les fonctions de traitement spatial dans le détail, faisons une petite digression. Dans les SIG bureautique, tel que ArcGis, vous avez l’habitude de travailler avec deux groupes d’outils différents selon qu’il s’agisse de traiter la couche dans son ensemble ou bien des entités en particulier.
Quand il s’agît de traiter la couche dans son ensemble, vous utiliserez les outils de la Toolbox. Quand il s’agît de traiter des entités en particulier vous utiliserez les outils interactifs d’ArcMap.
Un avantage du SQL est que vous ne travaillez qu’avec un seul outil. Reprenons la requête précédente pour l’appliquer à l’intersections entre une couche carto_risques(en beige) et zones_inondables (en bleu)
Nous pouvons utiliser la requête:
SELECT st_intersection(carto_risque.geometry,zones_inondables.geometry) as geometry
FROM carto_risques,zones_inondables
WHERE st_intersects(carto_risque.geometry,zones_inondables.geometry)
Pour intersecter toutes les entités présentes dans la cartographie des risques avec les zones inondables:
Ou seulement la zone avec un risque maximal avec les zones inondables
SELECT st_intersection(carto_risque.geometry,zones_inondables.geometry) as geometry
FROM carto_risques,zones_inondables
WHERE st_intersects(carto_risque.geometry,zones_inondables.geometry) AND
carto_risque.zone=’max’
La seule différence se situe dans la clause WHERE où nous ajoutons « AND
carto_risque.zone=’max’«
Les fonctions de traitement spatial
Si vous regardez la page d’aide d’ArcGis du jeu d’outils Superposition (https://pro.arcgis.com/fr/pro-app/tool-reference/analysis/an-overview-of-the-overlay-toolset.htm) vous trouverez la description d’une série de fonctions de traitement spatial:
Ils sont au nombre de sept : Effacer, Identité, Intersection, Jointure spatiale, Différence symétrique, Agrégation et Mise à jour.
En SQL nous utiliserons seulement trois fonctions: st_difference, st_intersection et st_union pour construire les requêtes équivalentes.
Voyons tout d’abord ces trois fonctions et leur équivalent dans le Toolset d’ArcGis, puis nous verrons comment obtenir l’équivalence des autres outilst du Toolset en combinant les trois fonctions de base.
st_Difference = Effacer (Erase)
Elle est de la forme st_difference(géométrie A, géométrieB). Cette fonction retourne la partie de la géométrie A qui n’intersecte pas la géométrie B.
Dans l’exemple de la cartographie des risques et les zones inondables, on peut souhaiter, par exemple, voir la partie des zones classées comme risque maximal qui ne sont pas inondables :
SELECT st_Difference(carto_risque.geometry,zones_inondables.geometry) as geometry
FROM zones_inondables,carto_risque
WHERE carto_risque.zone=’max’
Le résultat de la commande apparaît en jaune.
st_intersection = Intersection (Intersection)
Elle est de la forme st_intersection(géométrie A, géométrie B). Cette fonction retourne la partie de la géométrie A qui intersecte la géométrie B.
Nous avons déjà détaillé la requête
SELECT st_intersection(carto_risque.geometry,zones_inondables.geometry) as geometry
FROM carto_risques,zones_inondables
WHERE st_intersects(carto_risque.geometry,zones_inondables.geometry)
dans le paragraphe précédent sur les fonctions batch et interactives. Mais nous allons compléter l’usage des fonctions avec un autre élément. Dans les exemples utilisés jusqu’ici nous obtenons comme résultat de la requête que des géométries. Mais la plupart du temps nous avons besoin de récupérer aussi des attributs des entités concernées.
Par exemple, dans les entités résultantes de la requête nous voulons savoir de quelle version de « zones_inondables » il s’agît et de quelle niveau de risque. Nous ajoutons ces champs dans la partie SELECT de la requête
SELECT zones_inondables.version, carto_risque.zone, st_intersection(carto_risque.geometry, zones_inondables.geometry) as geometry
FROM carto_risque,zones_inondables
WHERE st_intersects(carto_risque.geometry, zones_inondables.geometry)
et le résultat sera:
Les champs attributs sont ajoutés dans la table résultante. Chaque géométrie aura la valeur de l’attribut des géométries qui s’intersectent à cet endroit.
st_union
Elle est de la forme st_union(géométrie A, géométrie B). Cette fonction prend chaque géométrie de A et l’unifie avec la ou les géométries de B, en fusionnant les points qui les composent.
Si vous avez x géométries en A, vous aurez le même nombre de géométries en résultat. Ce n’est pas le nombre qui change mais bien la géométrie de chaque entité de A qui se voit adjoindre l’espace occupé par la ou les géométries de B.
Cette fonction SQL prête à confusion, surtout en anglais, avec l’opération Union (en français Agrégation) du Toolset d’ArcGis. Voyons tout de suite celle-ci pour éviter toute méprise.
Agrégation (Union en anglais)
Cette fonction permet de récupérer tout l’espace qui est occupé par les géométries A et par les géométries B:
- les zones dans lesquelles les géométrie s’intersectent
- les zones où l’on ne trouve que des géométries A
- les zones où l’on ne trouve que des géométries B
Le schéma suivant montre, en entrée une couche A avec deux rectangles, et une couche B avec un cercle.
Le résultat de l’union de ces deux couches comprend 5 géométries:
- les deux parties des rectangles qui ne s’intersectent pas avec B
- les deux parties des rectangles qui s’intersectent avec le cercle
- la partie du cercle qui ne s’intersecte pas avec les rectangles
Nous avons vu que la fonction st_union garde le même nombre de géométries de A dans le résultat. Dans l’outil Union du Toolset, il y a toujours plus de géométries dans le résultat que dans la couche A, le ,nombre dépendant des zones d’intersections des deux couches.
La suite…
Nous avons vu les trois fonctions de base de SQL pour le traitement spatial . Dans le prochain article nous verrons comment combiner ces fonctions de base pour obtenir les fonctions telles que Identité, Agrégation et Mettre à jour.
Bonjour,
Merci pour tous vos tutoriels et articles qui sont très biens faits et très clairs.
J’avais une chaîne de traitement utilisant des fonctions arcgis que je transpose sous Postgis. Je bute sur la transposition de la fonction « agrégation » d’Arcgis (union) en postgis. Je suis donc très intéressé par la suite de votre article « L’analyse spatiale avec SQL: 4-fonctions de traitement spatial ». Cet article est-il toujours en projet? Serait-il possible sinon de savoir comment vous faites cette transposition? Avec mes remerciements.
J’ai mis la réponse en ligne : https://wp.me/p6XU0A-1BG
Et merci de m’avoir rappelé ma promesse d’une suite…
Encore merci pour cette réponse hypersonique!