Introduction aux Systèmes d'Information Géographiques – TP OpenStreetMap

Table of Contents

1 Introduction et références

1.1 Objectifs et contexte

L'objectif de ce travail est de découvrir certains aspects des Systèmes d'Information Géographique par la manipulation concrète de données cartographiques. Dans ce TP, nous allons utiliser l'environnement technique suivant :

  • le système de gestion de bases de données PosgreSQL (la version du serveur est la 9.2.24) ;
  • la cartouche spatiale PostGIS de PostgreSQL ;
  • l'extension HStore de PostgreSQL, fournissant des fonctions permettant de manipuler des données attributaires au format clef=>valeur ;
  • l'environnement de développement Java (OpenJDK 16 installé sur les machines) ;
  • la bibliothèque JDBC pour le dialogue avec des SGBD depuis Java, avec le pilote PostgreSQL et l'extension JDBC PostGIS.

En ce qui concerne les données, nous allons nous appuyer sur une réplication des données cartographiques d'OpenStreetMap concernant la région Rhône-Alpes uniquement. Ces données ont été produites de manière contributive (n'importe quel utilisateur peut contribuer à l'enrichissement de la base de données OpenStreetMap), elles sont libres et disponibles sous la licence Open Data Commons Open Database License. Si vous êtes curieux de savoir comment on peut récupérer les données et instancier sa propre base chez soi, voici un petit document décrivant rapidement comment la base de données disponible sur le serveur de l'Ensimag pour le TP a été instanciée.

Les données sur les quartiers de Grenoble utilisées dans ce TP m'ont été grâcieusement fournies par Benoît Le Rubrus, ingénieur dans l'équipe STeamer du Laboratoire d'Informatique de Grenoble. Ce TP est partiellement inspiré d'un TP qu'il a écrit pour les étudiants de la filière LP ESSIG Département STID, IUT2 Grenoble, Université Pierre Mendès-France. Qu'il en soit remercié.

1.2 Références

Voici les références dont vous pourrez avoir besoin au cours du TP :

1.3 Livrables attendus

Pour ce projet, vous devrez rendre les éléments suivants :

  • avant la fin de la séance :
    • un document PDF, contenant la réponse aux questions PostGIS (requêtes SQL + résultat obtenu, avec une petite explication pour chaque question, uniquement si vous jugez qu'elle est nécessaire) ;
  • à la fin du projet :
    • le code de votre application, accompagné éventuellement d'instructions de lancement (voire d'un Makefile si nécessaire)
    • une documentation concernant votre application, contenant entre autres un descriptif rapide des fonctionnalités, de l'architecture, des requêtes effectuées, des choix de conception, et des tests effectués (et leur résultat). Cette documentation doit être concise et précise (inutile de faire 42 pages de documentation ; vous n'aurez pas le temps de toute façon).

1.4 Barème approximatif

  • À fixer.

2 Connexion à la base et premières requêtes

2.1 Connexion à la base avec le client psql

Commençons doucement… Vous allez tout d'abord essayer de vous connecter à la base de données. Voici les informations de connexion :

  • le serveur s'appelle postgresql.ensimag.fr (vous pouvez vous y connecter à partir de n'importe quelle machine de l'Ensimag ou sur le VPN) ;
  • la base s'appelle osm ;
  • vos identifiants de connexion correspondent à votre nom d'utilisateur Unix (pour le nom d'utilisateur et pour le mot de passe).

Connectez-vous comme suit :

[sylvain@msnordlys]~ $ psql -U <login> -d osm -h postgresql.ensimag.fr
Password for user <login>: 
psql (11.5 (Ubuntu 11.5-1), server 9.2.24)
Type "help" for help.

osm=# 

Pour vérifier que vous avez bien accès à la base, listez l'ensemble des tables :

osm=> \dt
             List of relations
 Schema |       Name       | Type  | Owner 
--------+------------------+-------+-------
 public | actions          | table | osm
 public | nodes            | table | osm
 public | quartier         | table | osm
 public | relation_members | table | osm
 public | relations        | table | osm
 public | schema_info      | table | osm
 public | spatial_ref_sys  | table | osm
 public | users            | table | osm
 public | way_nodes        | table | osm
 public | ways             | table | osm
(10 rows)

Si vous voulez avoir des informations particulières sur le schéma d'une table, utilisez la commande \d+. Par exemple :

osm=> \d+ nodes
                                                Table "public.nodes"
    Column    |            Type             | Collation | Nullable | Default | Storage  | Stats target | Description 
--------------+-----------------------------+-----------+----------+---------+----------+--------------+-------------
 id           | bigint                      |           | not null |         | plain    |              | 
 version      | integer                     |           | not null |         | plain    |              | 
 user_id      | integer                     |           | not null |         | plain    |              | 
 tstamp       | timestamp without time zone |           | not null |         | plain    |              | 
 changeset_id | bigint                      |           | not null |         | plain    |              | 
 tags         | hstore                      |           |          |         | extended |              | 
 geom         | geometry(Point,4326)        |           |          |         | main     |              | 
Indexes:
    "pk_nodes" PRIMARY KEY, btree (id)
    "idx_nodes_geom" gist (geom)
    "idx_nodes_tags" gist (tags)
    "idx_nodes_tags2" btree (tags)

Question 1 : Pour vérifier que vous avez bien accès aux tables en interrogation, effectuez une requête pour compter le nombre de nœuds pour les données de la région Rhône-Alpes (= nombre de tuples de la relation nodes).

2.2 Interrogation de base

Dans la base de données OSM, le centre de la ville de Grenoble est un nœud portant l'identifiant 26686589.

Question 2.a : Quelles sont ses coordonnées géographiques ?

Indication : vous pouvez jeter un coup d'œil sur les fonctions d'accès aux informations géométriques de PostGIS, ici : http://postgis.net/docs/manual-2.0/reference.html#Geometry_Accessors

Question 2.b : Dans quel système de référence ces coordonnées sont-elles exprimées ?

Indication : la table spatial_ref_sys contient toutes les informations concernant les systèmes de référence supportés par PostGIS, référencés par SRID (identifiant), et avec une description textuelle de ces systèmes de référence.

2.3 Interrogation attributaire (hstore)

Nous allons nous pencher maintenant sur l'interrogation de la base selon les données attributaires (non géométriques) des objets géographiques qu'elle contient. Dans la base de données OpenStreetMap, les données attributaires sont représentées par un ensemble de couples (clefs, valeurs). Par exemple, pour le chemin Ensimag, le site OpenStreetMap nous donne l'ensemble d'attributs suivants :

amenity university
name Ensimag
wikidata Q273591
wikimediacommons ENSIMAG - Saint-Martin-d'Hères.JPG
wikipedia fr:École nationale supérieure d'informatique et de mathématiques appliquées

Dans notre instanciation de la base OpenStreetMap, les données attributaires correspondant aux objets géométriques (dans la table ways par exemple) sont toutes stockées dans une seule colonne, de type hstore. Voici par exemple sous quelle forme apparaît l'ensemble des attributs de l'Ensimag :

osm=> SELECT tags FROM ways WHERE tags->'name' = 'Ensimag';
                                                                                                             tags                                                                                                              
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 "name"=>"Ensimag", "amenity"=>"university", "wikidata"=>"Q273591", "wikipedia"=>"fr:École nationale supérieure d'informatique et de mathématiques appliquées", "wikimedia_commons"=>"File:ENSIMAG - Saint-Martin-d'Hères.JPG"
(1 row)

Différents opérateurs sont associés au type hstore. Ainsi, par exemple, si vous voulez sélectionner uniquement les éléments contenant la clef name, vous pouvez utiliser la syntaxe maColonne ? 'name'. Si vous voulez récupérer uniquement les éléments dont l'attribut name vaut 'Ensimag', vous pouvez utiliser la syntaxe maColonne->'name' = 'Ensimag'.

Vous trouverez un résumé de la syntaxe complète sur la documentation de l'extension HStore.

Question 3 : Quelles sont les coordonnées géographiques du centroïde de la mairie de Meylan (la mairie est un chemin qui contient l'attribut "amenity"=>"townhall" et dont le nom contient "Meylan".

Question 4 : Compter le nombre de routes (chemins contenant la clef "highway") par type (par valeur de l'attribut "highway"), ordonné par ordre décroissant.

2.4 Fonctions de mesure

PostGIS propose un certain nombre de fonctions de mesure (voir par exemple STLength, STPerimeter, STArea…).

Question 5.a : Même question que précédemment (question 4), mais au lieu de compter les routes, affichez leur longueur.

Question 5.b : En quelle unité cette longueur est-elle exprimée ?

Question 5.c : Même question, mais avec toutes les longueurs converties dans le système métrique (km si possible).

Question 6 : Quelle est l'aire totale des bâtiments l'Ensimag en m2 ?

2.5 Intersections, etc.

La base osm contient en plus une table quartier contenant la liste des quartiers de Grenoble, avec leurs contours géographiques sous forme de polygone1 (attention au système de référence utilisé, qui n'est probablement pas le même que celui des données OpenStreetMap). Nous allons utiliser ces données, car la récupération de zones administratives sous forme de polygones bien formés sur les données OpenStreetMap n'est pas une chose évidente.

Question 7 : Affichez l'ensemble des quartiers de Grenoble, avec, pour chaque quartier, le nombre d'écoles ("amenity"=>"school") qu'il contient, le tout ordonné par nombre d'écoles décroissant.

Indication : Vous vous appuierez sur les données de la table quartier pour récupérer les contours des quartiers, et sur la table ways (données OpenStreetMap) pour les écoles. Vous avez bien sûr une fonction pour faire l'intersection de deux polygones dans PostGIS.

2.6 Des requêtes spatiales hardcore (bonus)

Voici quelques requêtes qui nécessiteront un peu plus de réflexion. Je rappelle que la réponse à chaque question doit être réalisée en une seule requête SQL. Attention, il se peut que ces requêtes soient trop complexes et ne se terminent pas sur le serveur par manque d'espace ou de mémoire. N'insistez pas (ou alors simplifiez, quitte à perdre des informations).

Question 8 : Centre géographique de la région Rhône-Alpes. Quelle municipalité (ville, village) constitue le centre géographique de la région ?

Indications :

  • Vous pouvez interpréter cette notion de centre géographique comme bon vous semble. Une manière possible est de considérer qu'il s'agit de la ville dont la distance maximale aux autres villes est minimale (en d'autres termes, dont la ville la plus éloignée de la région est la moins loin possible).
  • Une municipalité est une relation possédant les tags 'boundary=>administrative, adminlevel=>8'

Question 9 : Déserts de population. Vous voulez partir en vacances tranquillement. Existe-t-il un endroit en région Rhône-Alpes éloigné de plus de 10 kilomètres d'un bâtiment ?

3 On enrobe tout ça dans un programme…

Pour la seconde partie du TP, nous allons sortir un peu du monde Postgres / PostGIS pour aller dans le monde sauvage de Python (ou Java). Pour cette seconde partie, vous avez le choix entre :

  • le sujet par défaut : un mini-serveur WMS écrit en Python, avec affichage des tuiles dans une page Web -> C'est ici
  • le sujet historique du TP : une interface graphique standalone écrite en Java. Optez pour ce sujet si vous êtes réfractaire au Python ou aux applis Web -> C'est ici

Footnotes:

1

Ces données ne sont pas libres a priori (à ne pas diffuser, donc). Elles font parties du « pot commun » de l'équipe STeamer du LIG depuis des temps immémoriaux, et la légende raconte qu'elles ont été produites par un moine fou qui vivait dans un tonneau de Chartreuse.

Date: 2019-11-15 ven. 00:00

Author: Sylvain B.

Created: 2022-01-12 mer. 14:49

Validate