Introduction aux Systèmes d'Information Géographiques – TP OpenStreetMap, partie Java
Table of Contents
1 On enrobe tout ça dans un programme Java / JDBC
Vous êtes désormais des experts en interrogation spatiale avec PostGIS. Il est maintenant temps d'enrober tout cela dans une couche un peu plus conviviale que le client ligne de commande PostgreSQL. Nous allons à partir de maintenant embarquer toutes les requêtes dans un programme Java, et accéder à la base par l'intermédiaire de JDBC.
Vous aurez pour cela besoin des deux bibliothèques Java postgresql.jar (le driver JDBC PostgreSQL) et postgis.jar (l'extension JDBC PostGIS), que je vous fournis gracieusement. Téléchargez ces fichiers et mettez-les à un endroit où votre compilateur Java et votre machine virtuelle peut les trouver (dans le classpath en fait).
1.1 Connexion à la base via JDBC
Afin de vous épargner le code fastidieux et peu intéressant de la connexion à la base, je vous fournis la classe database.Utils
, qui contient deux méthodes statiques
getConnection()
et closeConnection()
vous permettant respectivement de récupérer un objet java.sql.Connection
correspondant à la connexion JDBC à la base, et de
fermer cette connexion (n'oubliez surtout pas de fermer votre connexion lorsque votre requête est terminée !). Spécifiez juste vos identifiants de connexion dans le code
de la classe, et utilisez-là à bon escient.
La classe est disponible dans l'archive fournie ici : geoexplorer.tar.gz
Question 10 : Créez un petit programme de test permettant simplement de vous connecter à la base de données OSM via Java / JDBC, et vérifiez que tout fonctionne bien.
1.2 Une première requête
Pour rappel, voici un exemple typique d'instructions pour exécuter une requête via JDBC :
PreparedStatement stmt = connection.prepareStatement("Ici ma belle requête SQL"); ResultSet res = stmt.executeQuery(); while (res.next()) { System.out.println("colonne 1 = " + res.getInt(1) + "; colonne 2 = " + ((PGgeometry) res.getObject(2)).getGeometry()); }
Comme vous le voyez dans l'exemple, vous pouvez récupérer des valeurs géométriques grâce à la méthode getObject()
. Cette méthode renvoie
un objet de type org.postgis.PGgeometry
(ou plus précisément une de ses sous-classes, comme par exemple org.postgis.LineString
). Consultez
La documentation Javadoc du paquetage org.postgis pour avoir un aperçu des différentes classes et interfaces permettant de gérer les géométries.
Question 11 : Écrivez un petit programme de test prenant un argument en ligne de commande, et affichant tous les noms et coordonnées géographiques des points dont le nom
ressemble à (au sens du LIKE
SQL) l'argument. À titre d'exemple, un tel programme appelé sur la chaîne
Dom__ne _niversit%
devrait renvoyer :
nom | longitude | latitude -----------------------+-----------+------------ Domaine Universitaire | 5.758102 | 45.1874865 Domaine Universitaire | 5.7569486 | 45.187046 Domaine Universitaire | 5.7680106 | 45.192893 (3 rows)
2 Un joli affichage graphique…
Toutes ces interfaces en ligne de commande sont très pratiques, mais bien ternes. Nous allons mettre un peu d'affichage graphique là-dessous. Afin de vous simplifier la tâche (et aussi parce que la maîtrise d'AWT, Swing et Java2D n'est pas un prérequis à ce TP), je vous fournis une interface graphique toute faite. Vous pouvez la trouver dans l'archive geoexplorer.tar.gz sus-mentionnée.
2.1 Principes de l'interface graphique
Le principe de cette interface graphique est très simple. Elle vous permet de dessiner trois types de primitives géométriques : point, ligne brisée, et polygone.
Les primitives graphiques sont ajoutées sur l'espace de dessin appelé MapPanel
, grâce à la méthode addPrimitive(...)
. On efface tout avec clear()
. Vous pouvez
gérer des primitives dans n'importe quel système de coordonnées (pour peu que toutes les primitives que vous ajoutez sont exprimées dans le même référentiel). un objet
de type CoordinateConverter
est chargé de faire la conversion entre les coordonnées de la carte (les vôtres) et les coordonnées écran (en pixels).
Vous pouvez préciser divers attributs graphiques comme la couleur par exemple. L'afficheur gère des interactions basiques à la souris : molette pour zoomer / dézoomer,
et déplacement de la carte par glisser / déposer. Si vous voulez ajuster la fenêtre aux éléments graphiques affichés (ajuster automatiquement le zoom et la position, en fait),
utilisez la méthode autoAdjust()
.
La documentation complète du paquetage est disponible ici : API Javadoc GeoExplorer.
2.2 Bon, maintenant, qu'affiche-t-on ?
Maintenant que vous avez l'interface graphique, c'est à vous de jouer.
Question 12 : Affichez l'ensemble des routes et des bâtiments autour de Grenoble (longitudes comprises entre 5.7 et 5.8, et latitudes comprises entre 45.1 et 45.2).
Question 13 (bonus) : Affichez une carte contenant les éléments de votre choix. Soyez inventifs, mais n'en demandez pas trop non plus, sinon vous allez tuer le serveur.
Pour toutes ces alternatives, vous aurez très certainement besoin d'aller faire un tour sur la page Map Features d'OpenStreetMap, pour voir comment elles sont encodées sous forme d'attributs.
Utilisez une projection adéquate pour la représentation graphique (ce n'est pas forcément une bonne idée de rester en coordonnées WGS84). Pour la France, la projection Lambert 93 (SRID 2154) est adaptée.
3 Analyse spatiale (bonus)
Si vous arrivez là, vous êtes déjà experts sur le sujet. On peut aller plus loin en s'appuyant sur les données d'OpenStreetMap pour faire de l'analyse spatiale. Voici quelques suggestions :
Question 14 (suggestion a) : Même question que la question 7 (nombre de boulangeries par quartier de Grenoble), mais en représentant graphiquement sur la carte les valeurs (utilisez des attributs graphiques tels que la couleur, ou autre).
Question 14 (suggestion b) : Tracer une carte des nuisances sonores (zones à proximité des voies ferrées, autoroutes et aéroports). Vous pouvez vous appuyer sur la fonction ST_Buffer de PostGIS.
Question 14 (suggestion c) : Affichez une carte matricielle de densité sur le territoire Rhône-Alpes. Vous pouvez parcourir l'ensemble du territoire par carreau de x km de côté, et compter pour chaque carreau le nombre de bâtiments à l'intérieur du carreau.
Question 14 (suggestion d) : Toute carte d'analyse spatiale (représentation cartographique d'un phénomène analysé à partir des données géographiques) non triviale de votre choix.