Je vous propose une série d’articles pour aborder quelques idées reçues sur l’utilisation du langage SQL et ses possibilités dans l’analyse spatiale. Pour résumer l’idée la plus répandue, le langage SQL est un très bon outil de requête sur les tables SIG mais il faut un logiciel SIG tel que QGis ou ArcGis pour réaliser les tâches d’analyse spatiale. Pour ce qui est de la première partie de cette assertion, nous l’analyserons dans le second article de cette série. Voyons pour commencer un exemple pour tordre le cou à la deuxième partie de cette phrase.Nous allons voir un exemple à partir d’une base PostgreSQL/Postgis contenant deux tables: une table parcelles et une table zones inondables.
Requêtes SQL simples
Voyons maintenant quelques requêtes SQL, en partant d’un exemple extrêmement simple et en le complexifiant progressivement. Supposons que l’objectif final est de savoir le prix des parcelles, par type de classe de propriété, qui se trouvent en zone inondable.
Voici, tout d’abord, une requête des plus simples sur la table parcelles
Avec la requête SELECT * FROM parcelles nous obtenons comme résultat la totalité des enregistrements avec tous les champs de la table.
Un peu plus complexe, sélectionnons seulement deux champs de la table: le type de propriété et le prix du terrain:
On a donc, pour chaque parcelle, la valeur du terrain et le type de classe de propriété.
Complexifions un peu plus: on peut obtenir le total des prix de terrains avec la requête SELECT sum(prix_terrain)FROM parcelles;
Pour un affichage plus lisible on peut convertir le résultat en nombre monétaire avec la modification suivante de la requête: SELECT sum(prix_terrain)::numeric::money FROM parcelles;
On a maintenant le prix total des parcelles en euros.
En modifiant la requête et en ajoutant une clause GROUP BY on peut avoir le prix total de chaque classe de propriété:
Le résultat est le prix total par classe de propriété, pour tous les enregistrements de la table parcelles.
Mais si nous voulions ce résultat que pour les parcelles situées dans les zones inondables?
Requête SQL « spatiale »
La requête:
SELECT sum(prix_terrain)::numeric::money, classepropriete
FROM parcelles
GROUP BY classepropriete;
peut être modifiée en ajoutant la table zones_inondables à la clause FROM
SELECT sum(prix_terrain)::numeric::money, classepropriete
FROM parcelles, zones_inondables
GROUP BY classepropriete;
et une clause de sélection des parcelles pour ne retenir que celles dont la géométrie intersecte les zones inondables:
SELECT sum(prix_terrain)::numeric::money, classepropriete
FROM parcelles, zones_inondables
WHERE st_intersects(parcelles.geometry,zones_inondables.geometry)
GROUP BY classepropriete;
Nous avons le résultat que nous recherchions. Maintenant je vous laisse le soin de voir l’ensemble des opérations à faire avec votre logiciel SIG préféré pour obtenir le même résultat.
Vous conviendrez que ça va beaucoup plus vite en écrivant cette requête.
Une notion indispensable
Avant d’aller plus loin, il faut s’arrêter sur une notion indispensable pour faire de l’analyse spatiale avec SQL. Ce qui a de plus compliqué avec cette notion c’est que nous pensons tous l’avoir mais, si nous réfléchissons bien, on est tous loin de l’appliquer dans notre travail quotidien.
Si nous établissons la liste des types de données possibles dans une base de données, nous avons tout de suite en tête les nombres, les chaînes de caractères, le type date,etc.
Si je vous dit maintenant « géométrie », vous direz, oui, bien sûr, il y a aussi ce type de donnée. Mais quelque part nous la plaçons un peu à part. Pourtant c’est bien quand on assimile que c’est exactement un type de donnée comme un autre qu’on aborde l’analyse spatiale gagnant.
Vous pourrez faire de l’analyse spatiale avec SQL à plein quand vous trouverez que:
- si vous pouvez additionner deux nombres vous pouvez tout autant intersecter deux géométries;
- Si vous pouvez découper (trim) une chaîne de caractères, vous pouvez découper une géométrie avec une autre géométrie;
- Si vous pouvez trouver une date entre deux autres dates, vous pouvez trouver une géométrie couverte par une autre.
Quand vous voulez faire une opération entre nombres en SQL, les différents opérateurs vous viennent tout de suite à l’esprit. De même, quand vous voulez traiter une chaîne de texte, un ensemble d’opérations vous apparaissent. Le but de cette série d’articles est de vous fournir l’équivalent pour traiter les géométries : une série d’opérations similaires aux fonctions de texte ou aux opérateurs arithmétiques.
Si l’ensemble des opérations réalisables sur le type géométrie vous apparaît clairement, vous êtes prêt à faire de l’analyse spatiale avec SQL et gagner un temps précieux.
Great tutorials, but would you share the link for the data that you are using for the series of Spatial Analysis with SQL 1,2,3,4,5?
Thank you