Projet ISIMA 3ème année F2

Transcription

Projet ISIMA 3ème année F2
INSTITUT SUPÉRIEUR D'INFORMATIQUE DE MODÉLISATION DE LEURS APPLICATIONS
Complexe des Cézeaux
BP 125
63173 Aubière Cedex
Rapport de projet de 3ème année
Filière 2 – Génie Logiciel et Systèmes Informatiques
SYSTÈME D'INFORMATION GÉOGRAPHIQUE
TOME 1 ­ RAPPORT
Présenté par : Vianney Bajart et Christophe Charles
Durée :
Responsables ISIMA : Christophe Duhamel et Philippe Lacomme
BAJART / CHARLES
REMERCIEMENTS
REMERCIEMENTS
Nos remerciements s'adressent principalement à nos tuteurs de projets, Monsieur Christophe Duhamel et Monsieur Philippe Lacomme pour nous avoir guidés et conseillés dans la conduite de ce projet.
Nos remerciements vont également à Murielle Mouzat, notre professeur de communication, pour nous avoir appris la bonne démarche à suivre lors de la réalisation d'un rapport et d'une présentation orale.
Enfin, nous remercions les professeurs de l'ISIMA qui nous ont apporté un enseignement précieux sur les méthodes et outils de développement logiciel qui nous ont permis de mener à bien ce projet
Projet ISIMA 3ème année F2 – Système d'Information Géographique
2/50
BAJART / CHARLES
RÉSUMÉ / ABSTRACT
RÉSUMÉ
La recherche opérationnelle appliquée au problème du voyageur de commerce nécessite de travailler sur des données géographiques réelles. C'est pourquoi ce projet a été proposé par les chercheurs pour réaliser un système d’information géographique (SIG) regroupant plusieurs fonctionnalités dont le géocodage, la recherche d’itinéraire, la construction de distancier ou encore l'affichage de plusieurs villes sur une carte. Le logiciel devait être écrit en Java pour permettre de l'exécuter sur un maximum de plate­formes et devait utiliser les services géographiques en ligne. Nous avons retenu le fournisseur de services Google Maps pour sa gratuité et la qualité de ses outils.
L'utilisation de Google Maps nous a posé un problème technique important : celui d'utiliser API JavaScript dans un programme Java. Pour cela, nous nous sommes dirigés vers une solution utilisant une applet Java plutôt qu’une application dans le but de communiquer avec l'environnement JavaScript du navigateur Web grâce à la technologie LiveConnect.
Les fonctionnalités demandées ont été implémentées et nous avons conçu une interface graphique ergonomique permettant de présenter clairement des résultats à des personnes non­initiées au problème du voyageur de commerce.
Mots­clés : problème du voyageur de commerce, système d'information géographique (SIG), services géographiques en ligne, géocodage, recherche d'itinéraire, distancier, carte, Google Maps, Java, JavaScript, applet, LiveConnect, ergonomie
ABSTRACT
The operational research applied to the travelling salesman problem needs to work on real geographical data. Here's why this project was suggested by researchers to achieve a geographical information system (GIS) including several uses as geocoding, route planning, distancer construction, or still the display of several cities on the same map.
The software application must be written in Java, to allow to execute it on the most of platforms, and had to use on­line geographical services. We arrested on the service provider Google Maps for his free access and the quality of his tools.
The use of google Maps raised us a major technical issue : apply an API JavasScript in a Java program. For it, we went to a solution using a Java applet rather an application in the purpose of communicate with the JavaScript environnement of the Web browser thanks to LiveConnect technology.
The wanted features were implemented and we designed an ergonomic interface allowing to present clearly the results to persons non­introduced to the problem of the commercial traveller.
Keywords : problem of the commercial traveller, geographical information system (GIS), on­line geographical services, geocoding, route planning, distancer construction, map, Google Maps, Java, JavaScript, applet, LiveConnect, ergonomy.
Projet ISIMA 3ème année F2 – Système d'Information Géographique
3/50
BAJART / CHARLES
TABLE DES MATIÈRES
TABLE DES MATIÈRES
REMERCIEMENTS
2
RÉSUMÉ
3
ABSTRACT
3
INTRODUCTION
10
1 Présentation du projet.........................................................................11
1.1 Contexte.........................................................................................................11
1.1.1 Problème du voyageur de commerce..............................................................11
1.1.2 Description du problème................................................................................11
1.2 Système d'information géographique.............................................................11
1.2.1 Définition........................................................................................................11
1.2.2 Fonctionnalités demandées.............................................................................12
2 Services géographiques.......................................................................13
2.1 Données géographiques.................................................................................13
2.1.1 L'adresse.........................................................................................................13
2.1.2 La position......................................................................................................13
2.1.3 La route..........................................................................................................13
2.2 Les différents services....................................................................................13
2.2.1 Géocodage......................................................................................................13
2.2.2 Recherche d'itinéraire.....................................................................................14
2.2.3 Affichage de cartes..........................................................................................14
2.3 Recherche de fournisseurs.............................................................................14
2.3.1 ViaMichelin.....................................................................................................14
2.3.2 Google Maps...................................................................................................15
2.3.3 Mappy.............................................................................................................15
2.4 Choix du fournisseur......................................................................................15
Projet ISIMA 3ème année F2 – Système d'Information Géographique
4/50
BAJART / CHARLES
TABLE DES MATIÈRES
2.5 Utilisation des services...................................................................................15
2.5.1 Choix d'une solution.......................................................................................15
2.5.2 Comprendre le fonctionnement d'un navigateur............................................16
2.5.3 Intégration d'une applet Java dans une page Web..........................................16
2.5.4 Communication Java – Javascript...................................................................17
2.5.4.1 L'interface NPAPI et la technologie LiveConnect.....................................17
2.5.4.2 De JavaScript vers Java...........................................................................17
2.5.4.3 De Java vers JavaScript...........................................................................18
2.5.5 Architecture de la solution..............................................................................20
2.5.6 Problèmes rencontrés.....................................................................................20
2.5.7 Lien Java – JavaScript....................................................................................21
2.5.7.1 Synchronisation Java – JavaScript..........................................................21
2.5.7.2 Importations de fichiers JavaScript.........................................................22
2.5.7.3 Injection de code JavaScript depuis Java................................................24
2.5.8 Services JavaScript........................................................................................24
2.5.9 Implémentation du géocodeur........................................................................25
2.5.9.1 Géocodeur de l'API Google Maps............................................................25
2.5.9.2 Wrapper JavaScript.................................................................................25
2.5.9.3 Côté Java.................................................................................................26
2.5.10 Implémentation du calculateur d'itinéraire..................................................27
2.5.10.1 Calculateur d'itinéraire de l'API Google Maps.......................................27
2.5.10.2 Wrapper JavaScript...............................................................................27
2.5.10.3 Côté Java...............................................................................................28
2.5.11 Implémentation de l'afficheur de carte.........................................................29
2.5.11.1 Afficheur de carte de l'API Google Maps...............................................29
2.5.11.2 Wrapper JavaScript...............................................................................30
2.5.11.3 Côté Java...............................................................................................30
2.5.12 Résultat.........................................................................................................30
3 Développement de l'application..........................................................32
3.1 Organisation de l'application.........................................................................32
3.1.1 Répertoire de l'application..............................................................................32
3.1.2 Répertoire utilisateur......................................................................................32
3.2 Fonctionnalités...............................................................................................32
3.3 Architecture Modèle­Vue­Contrôleur..............................................................33
3.3.1 Présentation....................................................................................................33
3.3.2 Le Modèle.......................................................................................................33
3.3.3 La Vue.............................................................................................................33
3.3.4 Le Contrôleur..................................................................................................33
3.3.5 Utilisation du patron de conception MVC dans le SIG....................................33
3.4 Outils de développement pour l'interface graphique.....................................34
3.5 Géocodeur......................................................................................................34
3.5.1 Vue..................................................................................................................34
3.5.2 Modèle............................................................................................................35
Projet ISIMA 3ème année F2 – Système d'Information Géographique
5/50
BAJART / CHARLES
TABLE DES MATIÈRES
3.6 Recherche d'itinéraire....................................................................................35
3.6.1 Vue..................................................................................................................35
3.6.2 Modèle............................................................................................................35
3.7 Organisation des projets................................................................................37
3.8 Liste des projets.............................................................................................37
3.8.1 Vue..................................................................................................................37
3.9 Sélection des villes........................................................................................39
3.9.1 Objectif...........................................................................................................39
3.9.2 Données..........................................................................................................39
3.9.3 Vue..................................................................................................................39
3.9.4 Modèle............................................................................................................40
3.10 Coordonnées des villes.................................................................................40
3.10.1 Objectif.........................................................................................................40
3.10.2 Vue................................................................................................................40
3.10.3 Modèle..........................................................................................................42
3.10.4 Cache............................................................................................................42
3.11 Création du distancier..................................................................................43
3.11.1 Objectif.........................................................................................................43
3.11.2 Vue................................................................................................................43
3.11.3 Modèle..........................................................................................................44
3.11.4 Cache............................................................................................................44
3.12 Déploiement du SIG.....................................................................................44
3.12.1 Conditions préalables...................................................................................44
3.12.1.1 Java.......................................................................................................44
3.12.1.2 Serveur Web..........................................................................................44
3.12.2 Clé Google....................................................................................................45
3.12.3 Installation du SIG........................................................................................45
3.12.4 Lancement de l'application...........................................................................45
3.12.5 Bugs connus..................................................................................................46
3.13 Améliorations pouvant être apportées au logiciel........................................46
CONCLUSION
47
GLOSSAIRE
48
RÉFÉRENCES EN LIGNE
50
Projet ISIMA 3ème année F2 – Système d'Information Géographique
6/50
BAJART / CHARLES
INDEX DES TABLES ET ILLUSTRATIONS
INDEX DES TABLES
Tab. 1 ­ Contenu des champs de la classe Address...............................................................13
Tab. 2 ­ Méthodes de l'interface « Map »...............................................................................14
Tab. 3 ­ Conversion des types de JavaScript vers Java..........................................................18
Tab. 4 ­ Méthodes de la classe JSObject...............................................................................18
Tab. 5 ­ Conversion des types de Java vers JavaScript..........................................................19
Tab. 6 ­ Méthodes de la classe GoogleMap...........................................................................30
Tab. 7 ­ Traitements effectués par le modèle de l'extracteur de villes..................................40
Tab. 8 ­ Liste des villes et distanciers....................................................................................44
INDEX DES ILLUSTRATIONS
Fig. 1 ­ Problème du voyageur de commerce........................................................................11
Fig. 2 ­ Classe Address..........................................................................................................13
Fig. 3 ­ Classe Position..........................................................................................................13
Fig. 4 ­ Classe Route.............................................................................................................13
Fig. 5 ­ Interface Geocoder...................................................................................................13
Fig. 6 ­ Interface RouteFinder...............................................................................................14
Fig. 7 ­ Interface Map...........................................................................................................14
Fig. 8 ­ Architecture de la solution pour l'utilisation des services en ligne...........................20
Fig. 9 ­ Diagramme de séquence d'un appel synchrone à une fonction JavaScript...............21
Fig. 10 ­ Diagramme de séquence d'un appel asynchrone à une fonction JavaScript...........21
Fig. 11 ­ Diagramme de séquence de principe pour la synchronisation Java ­ JavaScript....22
Fig. 12 ­ Diagramme de séquence pour la synchronisation Java ­ JavaScript.......................22
Fig. 13 ­ Diagramme de séquence d'une injection de code JavaScript depuis Java..............24
Fig. 14 ­ Classe JSService.....................................................................................................24
Fig. 15 ­ Diagramme de dépendances des services JavaScript..............................................25
Fig. 16 ­ Structure de l'implémentation du géocodeur.........................................................27
Fig. 17 ­ Exemple de carte générée par Google Maps...........................................................30
Fig. 18 ­ Architecture du patron de conception MVC...........................................................33
Projet ISIMA 3ème année F2 – Système d'Information Géographique
7/50
BAJART / CHARLES
INDEX DES TABLES ET ILLUSTRATIONS
Fig. 19 ­ Onglet « Géocodage ».............................................................................................34
Fig. 20 ­ Diagramme de séquence du modèle de l'outil de géocodage.................................35
Fig. 21 ­ Onglet « Recherche d'itinéraire » avec carte et directions......................................36
Fig. 22 ­ Onglet « Liste des projets ».....................................................................................38
Fig. 23 ­ Onglet « Liste des villes »........................................................................................38
Fig. 24 ­ Onglet « Coordonnées des villes » et position des villes sur la carte......................41
Fig. 25 ­ Algorigramme de principe de l'utilisation cache du géocodeur..............................42
Fig. 26 ­ Onglet « Construction du distancier ».....................................................................43
Fig. 27 ­ Certificat autorisant l'applet à accéder au disque dur............................................46
Projet ISIMA 3ème année F2 – Système d'Information Géographique
8/50
BAJART / CHARLES
INDEX DES LISTINGS DE CODE SOURCE
INDEX DES LISTINGS DE CODE SOURCE
List. 1 ­ Applet Java..............................................................................................................16
List. 2 ­ Intégration d'une applet Java dans une page Web...................................................17
List. 3 ­ Autoriser la communication applet Java ­ JavaScript..............................................17
List. 4 ­ Méthode Java appelée dans JavaScript....................................................................18
List. 5 ­ Appel d'une méthode Java depuis JavaScript..........................................................18
List. 6 ­ Importation statique d'un fichier JavaScript externe...............................................22
List. 7 ­ Fonction pour l'importation dynamique d'un fichier JavaScript externe.................23
List. 8 ­ Fonction synchrone pour l'importation dynamique d'un fichier JavaScript externe 23
List. 9 ­ Déclaration de la classe GoogleGeocoder................................................................25
List. 10 ­ Utilisation du géocodeur de l'API Google Maps.....................................................25
List. 11 ­ Wrapper JavaScript du géocodeur Google.............................................................26
List. 12 ­ Implémentation du Géocodeur..............................................................................26
List. 13 ­ Utilisation du calculateur d'itinéraire de l'API Google Maps..................................27
List. 14 ­ Wrapper JavaScript du calculateur d'itinéraire Google..........................................28
List. 15 ­ Implémentation du calculateur d'itinéraire............................................................28
List. 16 ­ Utilisation de l'afficheur de carte de l'API GoogleMaps.........................................29
List. 17 ­ Exemple de fichier contenant la liste des villes d'un projet...................................40
Projet ISIMA 3ème année F2 – Système d'Information Géographique
9/50
BAJART / CHARLES
INTRODUCTION
INTRODUCTION
Le problème du voyageur de commerce monopolise la pensée de nombreux chercheurs à l’heure actuelle et depuis de nombreuses années. En effet, ce problème très complexe trouve des applications concrètes dans de nombreux domaines. Malheureusement, peu de gens connaissent réellement ce problème et il est souvent bien compliqué d’expliquer ses résultats à une personne lambda. Il faut donc s’appuyer sur des outils graphiques pour plus de clarté.
Il existe déjà de nombreux systèmes d’informations géographiques dont plusieurs sont gratuits. Le but de ce projet est donc de regrouper les fonctionnalités demandées dans un logiciel facile à utiliser pour aider et complémenter le travail des chercheurs sur le problème du voyageur de commerce.
Dans une première partie nous allons donc expliquer les objectifs du projet en détaillant le contexte et les fonctionnalités demandées. Ensuite, nous expliquerons comment utiliser des services géographiques tels que Google Maps ou ViaMichelin. Et enfin, nous détaillerons la réalisation de l’application en expliquant les choix techniques et graphiques.
Projet ISIMA 3ème année F2 – Système d'Information Géographique
10/50
BAJART / CHARLES
PRÉSENTATION
1 Présentation du projet
1.1 Contexte
1.1.1 Problème du voyageur de commerce
Le problème du voyageur de commerce mobilise énormément de chercheurs encore à l’heure actuelle. Avec ce projet, nous ne travaillons pas sur les algorithmes de résolution de ce problème mais sur un outil permettant d’afficher les résultats de manière compréhensible pour tous.
En effet, pour présenter leur résultat à un autre audimat que les scientifiques, les chercheurs ont besoin d’un outil simple et graphique. Notre logiciel doit donc pouvoir afficher à l’aide de carte des résultats stockés dans des fichiers textes. Il doit aussi être facile à utiliser pour éviter de perdre du temps à générer des cartes alors que l’essentiel du travail n’est pas là.
L'autre objectif de cet outil est de générer des données réelles. En effet, les chercheurs travaillent souvent avec des banques de données réalistes mais pas forcément réelles. Une des fonctionnalités demandées pour ce logiciel était donc de pouvoir générer des données géographiques réelles (coordonnées géographiques des villes, itinéraires...), à partir de services géographiques en ligne tels que ViaMichelin ou Google Maps.
1.1.2 Description du problème
Le problème du voyageur de commerce consiste, étant donné un ensemble de villes séparées par des distances données, à trouver le plus court chemin qui relie toutes les villes. C’est un problème NP­Complet. A titre d’exemple, le nombre de chemin possible passant par 69 villes est un nombre d’une longueur de 100 chiffres. Par comparaison, un nombre de 80 chiffres permettrait déjà de représenter le nombre d’atomes dans tout l’univers connu.
Fig. 1 ­ Problème du voyageur de commerce
C’est un problème plus compliqué qu’il n’y paraît car on ne connaît pas de méthode de résolution permettant d’obtenir des solutions exactes en un temps raisonnable pour un grand nombre de villes. C'est pourquoi on résout ce problème avec des heuristiques.
Ce type de problème ce retrouve dans de nombreux domaines. Il peut bien sûr servir pour optimiser les tournées d’un facteur ou autre livreur, mais il sert aussi dans énormément de problèmes de recherche opérationnelle
1.2 Système d'information géographique
1.2.1 Définition
Le travail demandé est donc de créer un système d’information géographique (SIG) proposant les fonctionnalités souhaitées. Nous allons donc tout d’abord définir ce qu’est un système d’information géographique.
Un système d’information géographique est un outil informatique permettant de produire des cartes et des plans à partir de données alphanumériques spatialement référencées. Son rôle est donc de proposer une représentation plus ou moins réaliste de l’environnement spatial en se basant Projet ISIMA 3ème année F2 – Système d'Information Géographique
11/50
BAJART / CHARLES
PRÉSENTATION
sur des primitives graphiques telles que des points, des vecteurs, des polygones ou des maillages.
1.2.2 Fonctionnalités demandées
Nous avons donc en début de projet établit une liste de fonctionnalités nécessaires à ce SIG. Voici les fonctionnalités de base demandée :
•
A partir d’une adresse :
◦ connaître sa localisation GPS ;
•
A partir de deux adresses :
◦ connaître la distance kilométrique et horaire les séparant ;
◦ connaître le chemin.
•
A partir d’un ensemble d’adresses :
◦ connaître la carte englobant ces villes au plus près et afficher les villes souhaitées dessus.
Par la suite, nous avons établit plusieurs autre fonctionnalités qui apportent un plus à ce SIG. En voici une liste :
•
Pouvoir sélectionner une liste de villes suivant certains critères (population et département) ;
•
Pouvoir créer un distancier à partir d’un liste de villes ;
•
Avoir une base de données regroupant toutes les distances déjà connues pour minimiser le nombre de requêtes auprès du fournisseur de services géographiques. Projet ISIMA 3ème année F2 – Système d'Information Géographique
12/50
BAJART / CHARLES
SERVICES GÉOGRAPHIQUES
2 Services géographiques
2.1 Données géographiques
Nous avons défini plusieurs classes d'objets permettant de manipuler des données géographiques :
Fig. 3 ­ Classe Position Fig. 4 ­ Classe Route
Fig. 2 ­ Classe Address
2.1.1 L'adresse
Pour définir une adresse, nous avons créé une classe Address (Fig. 2) comportant quatre champs dont le contenu est décrit sur le tableau 1. À noter qu'on accepte l'utilisation d'adresses incomplètes (par exemple : une adresse dont on aurait seulement précisé le nom de la ville et le nom du pays).
street
Numéro + nom de la voie
code
Code postal de la ville
city
Nom de la ville
country
Nom du pays
Tab. 1 ­ Contenu des champs de la classe Address
2.1.2 La position
On définit une position (classe Position Fig. 3) par ses coordonnées géographiques formées par le couple latitude et longitude.
2.1.3 La route
L'itinéraire entre deux adresses est défini dans une classe appelée « Route » (Fig. 4). Cette classe contient uniquement le temps de trajet et la distance parcourue car ce sont les deux seules données dont nous avons eu besoin pour ce projet. Bien sûr, si l'on souhaite étendre les fonctionnalités du programme, on pourra y rajouter des champs comme : les points de passages, les instructions pour la conduite, le coût du trajet, etc.
2.2 Les différents services
2.2.1 Géocodage
Le géocodage est un procédé qui consiste à retrouver les coordonnées géographiques associées à une adresse. L'objet qui fournit ce service est appelé « géocodeur ». On Fig. 5 ­ Interface Geocoder
définit alors une interface « Geocoder » contenant une méthode « geocode() » qui prend en paramètre une adresse et retourne une position (Fig. 5).
Projet ISIMA 3ème année F2 – Système d'Information Géographique
13/50
BAJART / CHARLES
SERVICES GÉOGRAPHIQUES
2.2.2 Recherche d'itinéraire
La recherche d'itinéraire grâce à un objet qui implémente l'interface Fig. 6 ­ Interface RouteFinder
« RouteFinder ». Cette interface comprend une méthode « routeFind() » qui prend en paramètres une adresse de départ et une adresse d'arrivée et qui retourne la route correspondant à cet itinéraire.
2.2.3 Affichage de cartes
On souhaite pouvoir afficher des cartes géographiques en y insérant des marqueurs indiquant la position d'éléments comme des adresses ou des villes. Ce travail doit être réalisé par une classe qui implémente l'interface « Map » (Fig. 7). Le rôle des méthodes est décrit dans le tableau 2.
Fig. 7 ­ Interface Map
setCenter(center:Position, zoom)
Recentre la carte sur la position « center » avec le niveau de zoom « zoom »
addMarker(pos:Position, title:String)
Ajoute un marqueur sur la position « pos » avec comme nom « title »
reframe()
Recadre la carte sur le plus petit rectangle contenant tous les marqueurs avec un niveau de zoom optimal
clear()
Enlève tous les marqueurs de la carte
Tab. 2 ­ Méthodes de l'interface « Map »
Si l'on souhaite ajouter des fonctionnalités au programme, on pourra étendre cette interface de manière à pouvoir effectuer le tracé d'itinéraires sur la carte.
2.3 Recherche de fournisseurs
Les outils qui peuvent nous permettre d'implémenter ces interfaces sont proposées par des fournisseurs de services en ligne. Nos recherches se sont orientées vers des services Web fournissant des outils de géocodage et de recherche d'itinéraire tels que Google Maps, ViaMichelin et Mappy. 2.3.1 ViaMichelin
Le service ViaMichelin propose une API appelée Maps & Drive qui fournit notamment un géocodeur et un outil de recherche d'itinéraire. Ce dernier est très complet puisque de nombreux paramètres peuvent être choisis pour l'itinéraire : type d'itinéraire (le plus court, le plus rapide, le plus économique...), type de véhicule, la consommation du véhicule... Le résultat d'une requête d'itinéraire comporte bien sûr la distance et le temps de trajet mais aussi le coût (carburant et péages) et la consommation d'essence.
L'utilisation de cette API requiert la création d'un compte sur le site de ViaMichelin, ce qui donne la possibilité de profiter de ce service pendant 45 jours – délai au­delà duquel le service devient payant. ViaMichelin limite l'utilisation du géocodage et de la recherche d'itinéraire à 1000 requêtes par jour.
Projet ISIMA 3ème année F2 – Système d'Information Géographique
14/50
BAJART / CHARLES
SERVICES GÉOGRAPHIQUES
2.3.2 Google Maps
Google Maps fournit une API conséquente pour la manipulation de données géographiques telles que des cartes ou des routes. Le site fournit entre autres, un géocodeur et un service de recherche d'itinéraire, bien que ce dernier ne permet pas de choisir des options pour l'itinéraire telles que : le type de trajet (plus court, plus rapide), le type de véhicule, la consommation, la vitesse... et ne donne aucune information sur le coût d'un trajet.
Il est nécessaire de s'inscrire pour utiliser le service Google Maps. L'utilisation est illimitée dans le temps mais il y a une limite de 15 000 requêtes de géocodage ou de recherche d'itinéraire par jour. 2.3.3 Mappy
Le site Mappy (iTi) propose une API appelée Maia similaire à celle de ViaMichelin cependant elle impose l'intégration d'une application Flash de Mappy pour l'affichage de la carte. Nous n'avons pas trouvé d'informations concernant les limites de l'utilisation de ce service. Cependant, à chaque géocodage ou recherche d'itinéraire, l'application Flash doit être rafraîchie, ce qui ralenti l'exécution et limite considérablement la quantité de requête pouvant être effectuées dans un temps donné.
2.4 Choix du fournisseur
Étant données les limites imposées par ViaMichelin sur le nombre de requêtes et les contraintes posées par l'utilisation de l'application Flash de Mappy, nous avons choisi d'utiliser dans un premier temps le service Google Maps. 2.5 Utilisation des services
2.5.1 Choix d'une solution
Les services proposés par ces sites sont conçu pour être intégrés dans des pages Web, c'est pourquoi leur API est écrite en JavaScript. Le défi technique majeur a été de trouver une solution pour utiliser ces services dans un programme Java.
Nous avons envisagé trois possibilités :
• Réécrire l'API JavaScript en Java et dialoguer directement avec les serveurs des fournisseur
Le problème de cette solution est que le code source de ces API est constitué d'une quantité importante de fichiers (parfois plus d'une cinquantaine !) et que leur contenu est volontairement brouillé (commentaires, espaces et retours à la ligne supprimés, nom des variables, classes et fonctions brouillés...) ce qui rend leur compréhension et leur ré­écriture quasi impossible.
• Utiliser un environnement JavaScript dans un programme Java
La deuxième idée que nous avons eu est de créer un environnement d'exécution JavaScript dans un programme Java en utilisant des interpréteurs JavaScript tels que SpiderMonkey, l'interpréteur utilisé dans le moteur de rendu Web Gecko (Firefox) ou directement utiliser ce dernier. Cependant, cette tâche s'avéra être longue et Projet ISIMA 3ème année F2 – Système d'Information Géographique
15/50
BAJART / CHARLES
SERVICES GÉOGRAPHIQUES
fastidieuse pour pouvoir être réaliser dans les temps impartis.
• Utiliser une applet Java
Lors de nos recherches, notre attention s'est portée sur le package Java netscape.javascript qui fournit une API permettant la manipulation d'objets JavaScript dans une applet Java. Ainsi, l'applet communique avec l'interpréteur JavaScript du navigateur qui se charge d'utiliser l'API des fournisseurs. Bien que cette solution impose d'embarquer notre application dans un navigateur Web, elle nous a paru la plus simple à mettre en œuvre pour ce projet.
2.5.2 Comprendre le fonctionnement d'un navigateur
Contenu d'une page Web
Une page Web est composée de code HTML qui permet de structurer sémantiquement son contenu et d'y inclure des ressources externes telles que des images, des fichiers audio ou vidéo, des fichiers JavaScript ou CSS, des applets Java, des applications Flash... (Remarque : certaines ressources comme le code JavaScript ou CSS peuvent être intégrées dans la page entre des balises) en précisant leur URL.
Chargement d'une page par le navigateur
Lorsqu'on entre une URL dans la barre d'adresse du navigateur celui­ci télécharge le fichier HTML puis l'interprète en créant ce qu'on appelle le DOM (Document Object Model). Le DOM est une arborescence qui représente la structure du document. Il possède une API, permettant de modifier la structure et le contenu de cette arborescence, qui est utilisée par les composants susceptibles de modifier le contenu et la mise en forme de la page, principalement : les interpréteurs HTML, CSS et JavaScript. Au chargement de la page, ces composants construisent le DOM qui est ensuite traité par le moteur de rendu pour afficher la page sur le navigateur. 2.5.3 Intégration d'une applet Java dans une page Web
Dans un premier temps, il faut implémenter l'applet et la placer dans une archive Java (JAR). Nommons la « MyApplet.jar » (List. 1).
package mypackage;
import java.applet.*;
public class MyApplet extends Applet
{
public void init()
{
...
}
...
}
List. 1 ­ Applet Java
On intègre ensuite l'applet dans une page HTML grâce à la balise « <applet> » (List. 2).
Projet ISIMA 3ème année F2 – Système d'Information Géographique
16/50
BAJART / CHARLES
SERVICES GÉOGRAPHIQUES
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Integration d'une applet Java</title>
</head>
<body>
<div>
<applet name="myApplet" codebase="." archive="MyApplet.jar"
code="mypackage.MyApplet" width="600" height="400">
</applet>
</div>
</body>
</html>
List. 2 ­ Intégration d'une applet Java dans une page Web
On nomme l'applet dans la page avec le champ « name » et on spécifie le répertoire contenant l'archive avec le champ « codebase ». Dans l'exemple, l'archive se trouve dans le même répertoire que le fichier HTML.
2.5.4 Communication Java – Javascript
2.5.4.1 L'interface NPAPI et la technologie LiveConnect
De nos jours, un navigateur ne sert plus uniquement à afficher des pages Web HTML mais il est le support de nombreuses applications externes telles que les lecteurs audio/vidéo, le lecteur Flash, le lecteur de document PDF et la machine virtuelle Java (JVM). Toutes ces applications sont embarquées dans le navigateur sous forme de plugins qui utilisent l'interface NPAPI (Netscape Plugin Application Programming Interface). À l'origine développée pour Netscape, cette interface a été implémentée dans tous les navigateurs actuels : Firefox, Internet Explorer, Safari, Opera, Konqueror, Google Chrome...
Depuis Netscape 4, NPAPI a été étendue pour permettre aux plugins de communiquer avec JavaScript, cette extension est appelée LiveConnect. Elle fournit notamment un support pour la communication entre le plugin Java et JavaScript.
Pour autoriser la communication entre une applet Java et JavaScript il faut ajouter l'attribut « mayscript » (remarque : cet attribut n'est pas conforme aux standards du W3C) dans la balise « <applet> » (List. 3).
<applet ... mayscript></applet>
List. 3 ­ Autoriser la communication applet Java ­ JavaScript
2.5.4.2 De JavaScript vers Java
Au chargement de la page, LiveConnect crée un objet JavaScript – un « wrapper » ou adaptateur – portant le nom spécifié dans le champ « name » de la balise « <applet> ». Ainsi la communication avec l'applet Java depuis du code JavaScript est très simple puisqu'on fait appel directement aux méthodes de la classe MyApplet dans le code JavaScript (List. 4 et List. 5).
Projet ISIMA 3ème année F2 – Système d'Information Géographique
17/50
BAJART / CHARLES
SERVICES GÉOGRAPHIQUES
public class MyApplet extends Applet
{
...
public void myMethod() { ... }
...
}
List. 4 ­ Méthode Java appelée dans JavaScript
<script type="text/javascript">
myApplet.myMethod();
</applet>
List. 5 ­ Appel d'une méthode Java depuis JavaScript
JavaScript et Java n'ont pas la même représentation des données, c'est pourquoi il faut respecter les règles certaines règles de conversion (Tab. 3).
JavaScript → Java
number
→
byte
short
int
long
float
double
char
java.lang.Double
boolean
→
boolean
java.lang.Boolean
string
→
java.lang.String
function
ou tout autre objet JavaScript
→
netscape.javascript.JSObject
Tab. 3 ­ Conversion des types de JavaScript vers Java
2.5.4.3 De Java vers JavaScript
Pour communiquer avec JavaScript depuis l'applet Java, on utilise l'API JSObject contenue dans le package « netscape.javascript ». Cette API fournit une classe JSObject permettant de manipuler des objets JavaScript (Tab. 4) mais son utilisation nécessite également des règles de conversion de type entre les deux langages (Tab. 5).
Object getMember(String name)
Permet d'obtenir l'objet JavaScript nommé « name »
void setMember(String name, Object value)
Affecte une valeur à l'objet « name »
void removeMember(String name)
Supprime l'objet « name »
Object call(String name, Object args[])
Appelle une méthode avec une liste d'arguments
Object eval(String expr)
Évalue une expression JavaScript
Tab. 4 ­ Méthodes de la classe JSObject
Projet ISIMA 3ème année F2 – Système d'Information Géographique
18/50
BAJART / CHARLES
SERVICES GÉOGRAPHIQUES
JavaScript ← Java
number
Number
←
byte
short
int
long
float
double
char
boolean
Boolean
←
boolean
JavaObject
←
java.lang.String
java.lang.Character
java.lang.Boolean
java.lang.Integer
java.lang.Long
java.lang.Float
java.lang.Double
java.lang.Class
ou tout autre objet Java
Tab. 5 ­ Conversion des types de Java vers JavaScript
Projet ISIMA 3ème année F2 – Système d'Information Géographique
19/50
BAJART / CHARLES
SERVICES GÉOGRAPHIQUES
2.5.5 Architecture de la solution
Navigateur Web
Page Web
Code HTML
Interpréteur
HTML
DOM
API DOM
Interpréteur
JavaScript
Code JavaScript
LiveConnect
Applet
Java
API JSObject
Plug-in Java
API JavaScript
Fournisseur
de Services
Machine Virtuelle
Java
Fig. 8 ­ Architecture de la solution pour l'utilisation des services en ligne
2.5.6 Problèmes rencontrés
Lors des premiers essais d'utilisation de l'API JSObject, nous avons remarqué plusieurs problèmes :
•
Certains appels à des fonctions JavaScript depuis Java ne sont pas bloquants. C'est­à­
dire qu'au moment de l'appel à la méthode call("js_function", params),
l'exécution de la suite du code Java se poursuit alors que l'exécution de la fonction js_function() n'est pas terminée. Il a donc fallu imaginer un mécanisme de synchronisation des fils d'exécution Java et JavaScript.
•
Il n'est pas possible d'importer directement des fichiers JavaScript depuis le code Java. Or, ceci est possible depuis JavaScript. Pour résoudre ce problème, nous avons cherché un moyen d'importer des fichiers .js depuis Java en passant JavaScript. Projet ISIMA 3ème année F2 – Système d'Information Géographique
20/50
BAJART / CHARLES
SERVICES GÉOGRAPHIQUES
2.5.7 Lien Java – JavaScript
Pour réaliser cette solution, nous avons créé un objet de classe JSBind qui sert de lien entre l'applet et la page Web. Ce lien facilite l'écriture du code pour la communication Java – JavaScript, permet la synchronisation des appels de fonction entre les deux langages et fournit un support pour l'importation de fichiers JavaScript externes.
2.5.7.1 Synchronisation Java – JavaScript
En temps normal, les appels à des fonctions JavaScript depuis Java sont bloquants. Lorsqu'on fait appel à une fonction JavaScript, l'exécution du thread Java est suspendue jusqu'à ce que l'exécution de la fonction se termine ; sa valeur de retour est alors récupérée dans l'environnement Java et l'exécution du thread se poursuit (Fig. 9).
Fig. 9 ­ Diagramme de séquence d'un appel synchrone à une fonction JavaScript
Cependant, pour une raison inconnue, certains de ces appels ne sont pas synchrones. C'est­à­
dire que la fonction call() obtient tout de suite la valeur de retour « null » alors que l'exécution du code JavaScript se poursuit en parallèle (Fig. 10).
Fig. 10 ­ Diagramme de séquence d'un appel asynchrone à une fonction JavaScript
Ce comportement erratique pose problème car, la valeur de retour obtenue étant « null », on ne peut pas connaître le vrai résultat de la fonction JavaScript. De plus, on ne peut pas prédire le comportement de JavaScript lorsqu'on appelle en boucle une fonction de façon asynchrone.
Projet ISIMA 3ème année F2 – Système d'Information Géographique
21/50
BAJART / CHARLES
SERVICES GÉOGRAPHIQUES
Afin d'éviter tout problème, on décide de rendre synchrones tous les appels à JavaScript. Pour cela, on suspend explicitement le thread Java après chaque appel à JavaScript et on le réveil à la fin de la fonction JavaScript (Fig. 11).
Concrètement, on suspend le thread Java en appelant la méthode « wait() » sur l'objet JSBind. Cette méthode, disponible pour tout objet Java, suspend le thread courant jusqu'à ce qu'un autre thread appelle la méthode « notify() » sur le même objet (Fig. 12 partie gauche).
Fig. 11 ­ Diagramme de séquence de principe pour la synchronisation Java ­ JavaScript
Pour réveiller le thread à la fin de l'exécution de la fonction JavaScript, on appelle la méthode « notifyBind() » de l'applet Java. Cette méthode est appelée depuis l'environnement JavaScript par l'intermédiaire d'une fonction « _notifyBind() » (Fig. 12 partie droite) ayant une portée globale1 de manière à pouvoir être appelée n'importe où (script embarqué dans la page Web, fichier JavaScript externe...).
Fig. 12 ­ Diagramme de séquence pour la synchronisation Java ­ JavaScript
2.5.7.2 Importations de fichiers JavaScript
Pour utiliser les services en ligne, il est nécessaire d'importer des fichiers JavaScript externes. Il existe deux manières d'importer ces fichiers : • statiquement, au chargement de la page, avec la balise « <script> » (List. 6);
<script type="text/javascript" src="js_file.js"></script>
List. 6 ­ Importation statique d'un fichier JavaScript externe
1 En JavaScript, une fonction ayant une portée globale est en fait une méthode de l'objet « window »
Projet ISIMA 3ème année F2 – Système d'Information Géographique
22/50
BAJART / CHARLES
SERVICES GÉOGRAPHIQUES
• dynamiquement, en appelant une fonction JavaScript (List. 7) durant l'exécution en passant en paramètre l'URL du fichier ;
function importJSFile(url)
{
var script = document.createElement('script');
script.setAttribute('src', url);
script.setAttribute('type', 'text/javascript');
var loaded = false;
var loadFunction = function() {
if (loaded) return;
loaded = true;
};
script.onload = loadFunction;
script.onreadystatechange = loadFunction;
document.getElementsByTagName('head')[0].appendChild(script);
}
List. 7 ­ Fonction pour l'importation dynamique d'un fichier JavaScript externe
Il n'est pas préférable d'importer au chargement de la page tous les scripts nécessaires au fonctionnement du programme. D'une part parce que cela alourdirait le chargement de la page. D'autre part, on souhaite épurer la page HTML de tout contenu « intelligent » en y mettant uniquement ce qui concerne l'affichage.
Un autre problème concerne la compatibilité entre les fichiers JavaScript. En effet, si un jour on souhaite utiliser l'API JavaScript de plusieurs fournisseurs différents, on risque d'importer des fichiers contenant des éléments (variables, fonctions, classes...) portant des noms identiques, ce qui pourrait engendrer des confusions à l'exécution.
C'est pourquoi nous avons décidé d'importer dynamiquement les fichiers JavaScript seulement au moment où on en a besoin. Ainsi, c'est le code Java qui appellera la fonction JavaScript pour importer les fichiers. Celle­ci nécessite alors une petite modification afin de rendre cet appel synchrone : lorsque le fichier a été complètement chargé, on réveille le thread Java en appelant la fonction « _notifyBind() » (List. 8).
function _importJSFile(url)
{
var script = document.createElement('script');
script.setAttribute('src', url);
script.setAttribute('type', 'text/javascript');
var loaded = false;
var loadFunction = function() {
if (loaded) return;
loaded = true;
_notifyBind(); // Réveil l'applet quand le fichier a été chargé
};
script.onload = loadFunction;
script.onreadystatechange = loadFunction;
document.getElementsByTagName('head')[0].appendChild(script);
}
List. 8 ­ Fonction synchrone pour l'importation dynamique d'un fichier JavaScript externe
Projet ISIMA 3ème année F2 – Système d'Information Géographique
23/50
BAJART / CHARLES
SERVICES GÉOGRAPHIQUES
2.5.7.3 Injection de code JavaScript depuis Java
Afin de pouvoir être utilisées, les fonctions _notifyBind() et _importJSFile(» doivent être déclarées dans l'environnement JavaScript.
Pour cela, on utilise la méthode eval() (Fig. 13) sur l'objet JSObject « window » (afin que les fonctions aient une portée globale) avec comme paramètre une chaîne de caractère contenant la déclaration de la fonction (Exemple : "function _notifyBind() { … }").
Fig. 13 ­ Diagramme de séquence d'une injection de code JavaScript depuis Java
2.5.8 Services JavaScript
Fig. 14 ­ Classe JSService
Lorsqu'on utilise un service en ligne tel que le géocodeur, on souhaite masquer l'utilisation de JavaScript au programmeur. C'est pourquoi nous avons créé une classe JSService (Fig. 14) qui permet de « se connecter » à l'objet JavaScript qui fournit le service et de faire ainsi abstraction des problèmes de conversion de type, de synchronisation, etc.
La méthode init() permet de lier l'objet à l'environnement JavaScript par l'intermédiaire de la classe JSBind. On attache l'objet de classe JSService à un objet JavaScript (le contexte) par la méthode setContext() en passant en paramètre le nom de l'objet. Par exemple, setContext("googleGeocoder") permet de s'attacher à l'objet JavaScript nommé googleGeocoder). Les méthodes call() et request() permettent d'appeler des fonctions JavaScript, la seconde méthode étant rendue bloquante avec le mécanisme décrit précédemment. En plus des méthodes listées ci­dessus, la classe JSService possède des méthodes getInt(), getFloat(), getString()... qui permettent de récupérer la valeur des attributs – en passant leur nom en paramètre – de l'objet servant de contexte JavaScript.
Lorsqu'on implémente un service, on crée une classe dérivée de la classe JSService. Par Projet ISIMA 3ème année F2 – Système d'Information Géographique
24/50
BAJART / CHARLES
SERVICES GÉOGRAPHIQUES
exemple, la classe GoogleGeocoder hérite de JSService et implémente l'interface Geocoder
(List. 9).
public class GoogleGeocoder extends JSService implements Geocoder { ... }
List. 9 ­ Déclaration de la classe GoogleGeocoder
On répète ce schéma pour les services de recherche d'itinéraire et d'affichage de carte pour obtenir la structure d'héritage décrite sur le diagramme de dépendances (Fig. 15).
Fig. 15 ­ Diagramme de dépendances des services JavaScript
2.5.9 Implémentation du géocodeur
2.5.9.1 Géocodeur de l'API Google Maps
Le service de géocodage est fournit dans l'API Google Maps par l'objet GClientGeocoder. Pour géocoder une adresse, on la passe en paramètre (sous forme de chaîne de caractère) de la méthode getLatLng(), le deuxième paramètre étant une fonction de rappel qui sera appelée quand la requête de géocodage a été effectuée. Sur l'exemple (List. 10), la fonction de rappel affiche une boîte de dialogue contenant le résultat du géocodage.
var geocoder = new GClientGeocoder();
function onResult(pos) {
if (pos) alert("Latitude: " + pos.lat() + " Longitude: " + pos.lng());
else
alert(address + " not found");
);
geocoder.getLatLng("Rue Roche Genès, Aubière", onResult);
List. 10 ­ Utilisation du géocodeur de l'API Google Maps
2.5.9.2 Wrapper JavaScript
L'utilisation de cet objet nécessite un « wrapper » qui prend en compte la synchronisation avec Java. Ce wrapper est écrit dans le fichier GoogleGeocoder.js (List. 11) du package fr.isima.sig.google. Il contient : une instance de la classe GClientGeocoder, la méthode geocode() et la fonction de rappel onResult() qui réveillera le thread Java une fois la requête effectuée. De plus, il possède deux attributs lat (latitude) et lng (longitude) dans lesquels on stock le résultat de la dernière requête de géocodage.
Ce wrapper est instancié à la fin du chargement du fichier GoogleGeocoder.js puis référencée par la variable googleGeocoder dont la portée est définie comme globale.
Projet ISIMA 3ème année F2 – Système d'Information Géographique
25/50
BAJART / CHARLES
SERVICES GÉOGRAPHIQUES
var GoogleGeocoder = function() { // GoogleGeocoder
this.client = new GclientGeocoder(); // Attributs
this.result = null;
this.lat = 0;
this.lng = 0;
}
GoogleGeocoder.prototype.geocode = function(address) { // Methode 'geocode'
this.client.getLatLng(address, function(point);
googleGeocoder.onSearchResult(point);
});
}
GoogleGeocoder.prototype.onResult = function(point) { // Attributs 'onResult'
if (!point) {
this.result = _JSCode.NOT_FOUND;
} else {
this.lat = point.lat();
this.lng = point.lng();
this.result = _JSCode.SUCCESS;
}
_notifyBind();
}
_global("googleGeocoder", new GoogleGeocoder());
List. 11 ­ Wrapper JavaScript du géocodeur Google
2.5.9.3 Côté Java
A son initialisation, l'objet Java GoogleGeocoder charge le fichier JavaScript GoogleGeocoder.js et s'attache sur le wrapper googleGeocoder (List. 12). Lors d'une requête de géocodage, on appelle la méthode geocode() du wrapper, puis on récupère le résultat stocké dans les attributs lat et lng.
public class GoogleGeocoder extends JSService implements Geocoder
{
...
public boolean init(JSBind bind) {
super.init(bind);
try {
System.out.println("Chargement du géocodeur Google");
bind.importJSFile("js/google/GoogleGeocoder.js");
setContext("googleGeocoder");
return true;
} catch (JSServiceException e) { ... }
}
public Position geocode(Address addr) throws GeographyException {
Object[] params = { addr.toString() };
try {
request("geocode", params); // Lance le géocodage
return new Position(getFloat("lat"), getFloat("lng"));
} catch (JSServiceException e) { ... }
}
}
List. 12 ­ Implémentation du Géocodeur
Projet ISIMA 3ème année F2 – Système d'Information Géographique
26/50
BAJART / CHARLES
SERVICES GÉOGRAPHIQUES
On obtient alors la structure décrite sur la figure 16.
Fig. 16 ­ Structure de l'implémentation du géocodeur
2.5.10 Implémentation du calculateur d'itinéraire
2.5.10.1 Calculateur d'itinéraire de l'API Google Maps
L'objet de l'API Google Maps qui fournit le service de recherche d'itinéraire s'appelle GDirections. Après son instanciation, on lui ajoute deux listeners (List. 13) : le premier appelle une fonction de rappel lorsque la requête a été traitée et le deuxième appelle une fonction de rappel en cas d'erreur de traitement (adresse invalide, itinéraire non trouvé, erreur du serveur...).
On lance la recherche d'itinéraire avec la méthode load() en lui passant en paramètre le contenu de la requête sous la forme : "from: <adresse de départ> to: <adresse de
destination>". var dir = new GDirections();
GEvent.addListener(dir, "load", function() {
alert("Distance: " + gdir.getDistance().meters + "m\n" +
"Durée: " + gdir.getDuration().seconds + "s");
});
GEvent.addListener(dir, "error", function() {
alert("Itinéraire non trouvé");
});
dir.load("from: rue Roche Genès Aubière to: rue Mouffetard Paris", {"locale":"fr_FR"});
List. 13 ­ Utilisation du calculateur d'itinéraire de l'API Google Maps
2.5.10.2 Wrapper JavaScript
Le wrapper est écrit dans le fichier GoogleRouteFinder.js (List. 14) du package fr.isima.sig.google. Son constructeur crée une instance de la classe GDirections et lui ajoute les deux listeners appelant les fonctions de rappel onLoad() et onError(). Le wrapper possède deux attributs distance et duration (durée) dans lesquels on stock le résultat de la dernière recherche d'itinéraire.
Ce wrapper est instancié à la fin du chargement du fichier GoogleRouteFinder.js puis référencée par la variable globale googleRouteFinder.
Projet ISIMA 3ème année F2 – Système d'Information Géographique
27/50
BAJART / CHARLES
SERVICES GÉOGRAPHIQUES
var GoogleRouteFinder = function() { // Classe GoogleRouteFinder
this.gdir
= new GDirections(); // Attributs
this.distance = 0;
this.duration = 0;
this.result
= null;
GEvent.addListener(this.gdir, "load", function() {
googleRouteFinder.onLoad();
});
GEvent.addListener(this.gdir, "error", function() {
googleRouteFinder.onError();
});
}
GoogleRouteFinder.prototype.find = function(start, end) { // Méthode 'find'
this.gdir.load("from: " + start + " to: " + end, { "locale" : "fr_FR" });
}
GoogleRouteFinder.prototype.onLoad = function() { // Méthode 'onLoad'
this.distance = this.gdir.getDistance().meters;
this.duration = this.gdir.getDuration().seconds;
this.result = _JSCode.SUCCESS;
_notifyBind();
}
GoogleRouteFinder.prototype.onError = function() { ... } // Méthode 'onError'
List. 14 ­ Wrapper JavaScript du calculateur d'itinéraire Google
2.5.10.3 Côté Java
A son initialisation, l'objet Java GoogleRouteFinder charge le fichier JavaScript GoogleRouteFinder.js et s'attache sur le wrapper googleRouteFinder (List. 12). Lors d'une recherche d'itinéraire, on appelle la méthode find() du wrapper, puis on récupère le résultat stocké dans les attributs distance et duration.
public class GoogleRouteFinder extends JSService implements RouteFinder {
...
public final boolean init(JSBind bind, String mapDiv, String routeDiv) {
super.init(bind);
try {
bind.importJSFile("js/google/GoogleRouteFinder.js");
setContext("googleRouteFinder");
return true;
} catch (JSServiceException e) { ... }
}
public Route findRoute(Address start, Address end) throws GeographyException
Object[] params = { start.toString(), end.toString() };
{
try {
request("find", params);
Route route = new Route();
route.setDistance(getInt("distance"));
route.setDuration(getInt("duration"));
return route;
} catch (JSServiceException e) { ... }
}
}
List. 15 ­ Implémentation du calculateur d'itinéraire
Projet ISIMA 3ème année F2 – Système d'Information Géographique
28/50
BAJART / CHARLES
SERVICES GÉOGRAPHIQUES
2.5.11 Implémentation de l'afficheur de carte
2.5.11.1 Afficheur de carte de l'API Google Maps
Google Maps propose toute une panoplie d'outils permettant de manipuler des cartes géographiques. En faire une liste exhaustive serait fastidieux, c'est pourquoi nous ne décrirons ici que les outils dont nous avons besoin, à savoir : affichage d'une carte sur une page Web, positionnement de marqueurs, recadrage de la carte.
L'objet GMap2 permet d'afficher une carte, on l'attache à un élément HTML (Exemple : en utilisant une balise <div id="map_canvas"></div>, en le passant en paramètre du constructeur (List. 16).
On peut recentrer la carte avec la méthode setCenter() qui prend en paramètre une position et un niveau de zoom.
On crée un marqueur avec la classe GMarker en précisant la position et le titre du marqueur. Celui­ci peut­être ajouté à la carte en utilisant la méthode addOverlay() de la classe GMap2.
// Crée la carte dans l'élément de la page dont l'ID est "map_canvas"
var map
= new GMap2(document.getElementById("map_canvas"));
// Crée deux positions
var pos1 = new GLatLng(45.0, 3.0);
var pos2 = new GLatLng(47.2, -1.5);
// Centre la carte sur la premiére position avec le niveau de zoom 13
map.setCenter(pos1, 13);
// Ajoute des marqueurs
map.addOverlay(new GMarker(pos1, { title: "Position 1: ISIMA" }));
map.addOverlay(new GMarker(pos2, { title: "Position 2: rue Mouffetard" }));
// Définit un rectangle contenant la position 1
var bounds = new GLatLngBounds(pos1, pos1);
bounds.extend(pos2); // Etend le rectangle pour englober la position 2
// Recadre la carte sur le rectangle
map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
// Efface les marqueurs
map.clearOverlays();
List. 16 ­ Utilisation de l'afficheur de carte de l'API GoogleMaps
Pour recarder la carte, on crée un rectangle avec la classe GLatLngBounds en passant en paramètre du constructeur la position du coin Nord­Ouest et celle du coin Sud­Est. On peut ensuite étendre ce rectangle pour qu'il contienne une nouvelle position avec la méthode extend(). Une fois qu'on a définit les limites du rectangle, on récupère les coordonnées de son centre avec getCenter(). Pour connaître le niveau de zoom optimal pour que ce rectangle puisse être contenu entièrement dans la carte, on le passe en paramètre de la méthode getBoundsZoomLevel() de l'objet de classe GMap2 (List. 16).
La figure montre un exemple carte générée par Google Maps.
Projet ISIMA 3ème année F2 – Système d'Information Géographique
29/50
BAJART / CHARLES
SERVICES GÉOGRAPHIQUES
Fig. 17 ­ Exemple de carte générée par Google Maps
2.5.11.2 Wrapper JavaScript
Le wrapper est écrit dans le fichier GoogleMap.js du package fr.isima.sig.google. Son implémentation reprend les mêmes principes que ceux décrits avec le géocodeur et le calculateur d'itinéraire. Il est instancié à la fin du chargement du fichier et référencé par la variable globale googleMap.
2.5.11.3 Côté Java
La classe Java GoogleMap est implémentée de la même manière que les classes GoogleGeocoder et GoogleRouteFinder. Les méthodes de cette classe sont décrites dans le tableau 6.
init(JSBind bind, String div)
Initialise la carte avec le lien JSBind en précisant le nom de l'objet HTML qui servira de conteneur pour la carte
setCenter(Position center, int zoom)
Recentre la carte sur la position « center » en précisant le niveau de zoom
addMarker(Position pos, String title)
Ajoute un marqueur sur la position « pos » avec comme nom « title »
reframe()
Recadre la carte sur le plus petit rectangle contenant tous les marqueurs avec un niveau de zoom optimal
clear()
Enlève tous les marqueurs de la carte
Tab. 6 ­ Méthodes de la classe GoogleMap
2.5.12 Résultat
Il s'agissait là de la partie technique qui nous a posé le plus de problèmes mais ce travail nous a permis de mettre en place une API Java de services géographiques dont les fonctionnalités Projet ISIMA 3ème année F2 – Système d'Information Géographique
30/50
BAJART / CHARLES
SERVICES GÉOGRAPHIQUES
peuvent être facilement étendues. Une fois cette tâche achevée, nous avons pu utiliser les services de Google Maps par l'intermédiaire des classes GoogleGeocoder, GoogleRouteFinder et GoogleMap en ayant totalement masqué la partie JavaScript. Projet ISIMA 3ème année F2 – Système d'Information Géographique
31/50
BAJART / CHARLES
DÉVELOPPEMENT DE L'APPLICATION
3 Développement de l'application
3.1 Organisation de l'application
3.1.1 Répertoire de l'application
Le répertoire d'installation de l'application contient tous les fichiers nécessaires à l'exécution du programme. Il est composé :
• d'une archive SIG.jar qui contient le code Java compilé et les différente ressources ;
• d'une répertoire lib/ qui contient les librairies externes utilisées par le programme ;
• d'un répertoire js/ qui contient les fichiers JavaScript qui seront chargés par l'applet ;
• et d'une page Web HTML index.html qui intègre l'applet Java en chargeant le fichier SIG.jar.
3.1.2 Répertoire utilisateur
Lors de la première exécution, l'application crée un répertoire destiné à stocker les données de l'utilisateur.
Le chemin d'accès de ce répertoire est créé à la racine du dossier de l'utilisateur :
• Sous Linux : ~/.sig/
ou $HOME/.sig/
• Sous Windows : C:\Documents and Settings\nom d'utilisateur\SIG\
Par la suite, on utilisera la notation Linux pour parler de ce répertoire mais son contenu est strictement le même quel que soit la plate­forme utilisée.
3.2 Fonctionnalités
Le SIG, n'est pas une application ayant une unique fonctionnalité mais il est composé d'un ensemble d'outils géographiques.
Pour valider l'implémentation du package google et la tester simplement nous avons commencé par développer :
• l'outil de géocodage ;
• le calculateur d'itinéraire.
Nous avons ensuite conçu les outils principaux du SIG :
• le gestionnaire de projets ;
• l'extracteur de villes (pour construire une liste de villes à partir d'une banque de données) ;
• le multi­géocodeur (qui détermine les coordonnées d'une liste de villes) ;
• le constructeur de distancier.
Projet ISIMA 3ème année F2 – Système d'Information Géographique
32/50
BAJART / CHARLES
DÉVELOPPEMENT DE L'APPLICATION
3.3 Architecture Modèle­Vue­Contrôleur
3.3.1 Présentation
Pour développer l'application de manière structurée, nous avons décidé d'utiliser le patron de conception Modèle­Vue­Contrôleur (MVC). Cette architecture organise l'interface homme­
machine (IHM) d'une application en trois parties (Fig. 18) : le modèle (modèle de données), la vue (présentation à l'utilisateur : console, interface graphique) et le contrôleur (gestion des évènements, synchronisation).
3.3.2 Le Modèle
Le modèle représente le comportement « intelligent » de l'application. C'est lui qui assure la lecture, le traitement et le stockage des données. C'est ce composant qui communique avec des extérieurs. Dans le cadre de notre projet, c'est lui qui fera appel à l'API Google.
Lorsque les données changent, le modèle met à jour la vue.
3.3.3 La Vue
La vue correspond à l'interface dont le rôle est de présenter les données par le modèle et de recevoir les actions de l'utilisateur (clics, entrées au clavier, etc.). Elle doit être épurée de tout traitement, elle doit se contenter d'afficher les résultats et de transmettre les évènements au contrôleur.
3.3.4 Le Contrôleur
Le contrôleur reçoit les évènements de la vue et met à jour le modèle si nécessaire. Son rôle est de transmettre (si nécessaire) les actions au modèle pour le synchroniser avec la vue. Certains traitements effectués par le modèle peuvent prendre du temps (lecture/écriture de fichier, communication avec un autre composant, calcul...). C'est pourquoi à chaque fois que la vue demande une action susceptible du durer longtemps, le contrôleur appelle la méthode du modèle dans un nouveau thread qui se terminera à la fin du traitement. Une telle démarche est nécessaire pour éviter de figer la vue lors du traitement (comportement très désagréable qui donne une mauvaise expérience utilisateur).
Fig. 18 ­ Architecture du patron de conception MVC
3.3.5 Utilisation du patron de conception MVC dans le SIG
Le SIG proposant un ensemble d'outils différents, nous avons structuré l'application en plusieurs sous­applications (le géocodeur, le calculateur d'itinéraire, le gestionnaire de projet, Projet ISIMA 3ème année F2 – Système d'Information Géographique
33/50
BAJART / CHARLES
DÉVELOPPEMENT DE L'APPLICATION
l'extracteur de villes, le multi­géocodeur et le constructeur de distancier) qui implémente chacune le patron MVC, chaque vue étant intégrée dans la fenêtre principale sous forme d'onglet.
Les contrôleurs étant des composants assez simples et assez semblables dans toutes les sous­
applications citées ci­dessus, nous ne détaillerons dans ce rapport que les modèles et les vues de chacun des outils.
3.4 Outils de développement pour l'interface graphique
Pour concevoir les vues, nous avons utilisé la bibliothèque Swing qui propose une grande quantité de composants permettant la création d'interface graphique. De plus, cette bibliothèque est totalement adaptée à l'architecture de l'application car elle utilise intrinsèquement le patron de conception MVC.
3.5 Géocodeur
3.5.1 Vue
L'onglet « Géocodage » (Fig. 19) comporte : • un formulaire de saisie d'adresse ;
• un bouton « Géocode » permettant de lancer le géocodage de l'adresse ;
• des champs de texte « Latitude » et « Longitude » où sont inscrits les résultats des requêtes de géocodage ; • une console de sortie.
L'utilisation d'une console de sortie est une méthode très simple pour afficher l'état du programme, les traitements en cours ou finis et les éventuelles erreurs. Fig. 19 ­ Onglet « Géocodage »
Projet ISIMA 3ème année F2 – Système d'Information Géographique
34/50
BAJART / CHARLES
DÉVELOPPEMENT DE L'APPLICATION
En plus de ces éléments, une carte affichant la position de l'adresse géocodée est affichée sur la page Web après chaque requête.
3.5.2 Modèle
Le modèle de l'outil de géocodage utilise la classe GoogleGeocoder pour retrouver les coordonnées de l'adresse envoyée par la vue.
Une fois la requête effectuée, il met à jour la vue en lui envoyant la position de l'adresse géocodée (Fig. 20).
Il se sert ensuite de la classe GoogleMap pour afficher la carte et y placer le marqueur.
Fig. 20 ­ Diagramme de séquence du modèle de l'outil de géocodage
3.6 Recherche d'itinéraire
3.6.1 Vue
L'outil de recherche d'itinéraire dans l'onglet « Recherche d'itinéraire » est composé de deux formulaires de saisie d'adresse : un pour le départ, un autre pour l'arrivée. Comme pour le géocodage, on lance par l'intermédiaire d'un bouton et on surveille le statut du programme avec la console de sortie.
Lorsqu'une requête est effectuée, la carte indiquant le tracé de la route et les instructions de conduite sont affichées sur la page Web (Fig. 21).
3.6.2 Modèle
Le modèle de l'outil de recherche d'itinéraire est très proche de celui de l'outil de géocodage. Cependant, la carte et les instructions ne sont pas affichées à l'aide de classe Java GoogleMap mais directement générées par l'objet JavaScript GDirections de l'API Google Maps. Projet ISIMA 3ème année F2 – Système d'Information Géographique
35/50
BAJART / CHARLES
DÉVELOPPEMENT DE L'APPLICATION
Fig. 21 ­ Onglet « Recherche d'itinéraire » avec carte et directions
Projet ISIMA 3ème année F2 – Système d'Information Géographique
36/50
BAJART / CHARLES
DÉVELOPPEMENT DE L'APPLICATION
3.7 Organisation des projets
Pour faciliter l’utilisation de notre logiciel, nous avons choisi une organisation sous forme de projet. L’utilisateur peut donc créer à tout moment un nouveau projet et ensuite travailler dedans. Cela permet de retrouver facilement des données générées précédemment et de pouvoir les modifier très rapidement.
On stocke les projets dans le répertoire ~/.sig/projects. Les fichiers de chaque projet sont stockés dans un répertoire qui porte le nom du projet.
Exemple : le répertoire du projet « Auvergne » est ~/.sig/projects/Auvergne
Un projet est constitué de fichiers texte :
• cities : liste des villes ;
• positions : coordonnées des villes ;
• distances : distancier contenant les longueurs de trajets ;
• durations : distancier contenant les temps de trajets.
L'onglet « Projet » est organisé en sous­onglets permettant différentes actions :
• Liste des projets ;
• Sélection des villes ;
• Coordonnées des villes ;
• Construction du distancier.
En outre, un indicateur en bas à droite de la fenêtre permet de vérifier quel projet est actuellement sélectionné. Cet indicateur est visible quel que soit le l'onglet actif.
3.8 Liste des projets
3.8.1 Vue
Cet onglet est là pour sélectionner le projet dans lequel nous voulons travailler, créer un nouveau projet, le modifier ou encore le supprimer. Cet onglet est constitué de la liste (JList) contenant le noms des projets existants. Lorsqu'aucun projet n'est sélectionné, la seule action possible est de créer un projet, les autres onglets et boutons sont inaccessibles. Lorsqu'on crée un nouveau projet, une boîte de dialogue s'ouvre pour y entrer le nom. Quand on sélectionne un projet dans la liste, les autres onglets et boutons sont activés. Le bouton « Paramètres » affiche la boîte de dialogue permettant de modifier le nom du projet. Il y a enfin un bouton permettant de supprimer un projet. Ce projet sera donc effacé de la liste, son répertoire et tous ses fichiers seront supprimés.
Projet ISIMA 3ème année F2 – Système d'Information Géographique
37/50
BAJART / CHARLES
DÉVELOPPEMENT DE L'APPLICATION
Le thème graphique de l'application s'adapte au Look & Feel de l'environnement de l'utilisateur. Fig. 22 ­ Onglet « Liste des projets »
Look & Feel GTK sous Linux
Fig. 23 ­ Onglet « Liste des villes »
Look & Feel Windows sur la plate­forme de Microsoft
Projet ISIMA 3ème année F2 – Système d'Information Géographique
38/50
BAJART / CHARLES
DÉVELOPPEMENT DE L'APPLICATION
3.9 Sélection des villes
3.9.1 Objectif
Cette partie de l'application permet de générer une liste réelle de point de passages. Ces points sont en fait des villes pouvant être choisies parmi l'ensemble des villes présentes dans la base de données INSEE que nous avons récupérée. Ainsi, nous travaillons sur des données réelles et non pas sur des données réalistes mais synthétiques.
3.9.2 Données
La base de données INSEE, initialement au format XLS (Microsoft Excel), contenait la liste de toutes les villes françaises identifiée par leur nom et leur code INSEE. Nous disposions, en plus, d'informations supplémentaires comme le numéro de département, le code postal et le nombre d'habitants (remarque : ces données dates de 1990).
Cette feuille Excel de plus de 36 000 lignes contenait d'autres informations dont nous n'avons pas besoin, de plus, le format XLS est assez contraignant à gérer. C'est pourquoi nous avons extrait seulement les informations utiles – à savoir, le nom de la ville, le code postal, le numéro de département et le nombre d'habitants – en les stockant dans des fichiers CSV.
Chaque fichier porte un nom contenant le numéro du département et contient sur chaque la liste des villes du département en question triée par code postal, puis par nom (deux villes peuvent avoir un même code postal). Chaque ligne contient : le code postal, le nom de la ville et le nombre d'habitants.
3.9.3 Vue
Une fois le projet sélectionné, l’utilisateur peut passer à l’onglet suivant : « Sélection des villes » (Fig. 23). Cet onglet permet de sélectionner facilement toutes les villes que nous voulons rattacher à ce projet et qui seront, par la suite, utilisées pour la création du distancier. Les villes peuvent être sélectionnées selon deux critères : le département et nombre minimal d'habitants. On sélectionne d'abord le ou les départements d'où on souhaite extraire les villes, puis on filtre le résultat en choisissant un nombre minimal d'habitant grâce à la glissière. La liste des villes pouvant être ajoutées au projet apparaît dans la liste en bas à gauche (Fig. 23). Cette liste de ville sest mise à jour au moindre déplacement de la glissière et à chaque modification de la sélection des départements.
Les valeurs extrêmes de la glissière sont 0 et 500 000 habitants. Cependant, ces bornes évoluent en fonction du nombre de départements sélectionnés. Par exemple, pour 20 départements, l'intervalle vaut [10 000, 1 000 000]. Lorsqu'on les sélectionne tous, l'intervalle vaut [50 000, 1 000 000]. Nous avons choisi ce comportement pour éviter de faire apparaître trop de villes dans la liste en bas à gauche. D'une part, un trop grand nombre d'éléments dans une liste rend difficile sa lecture. D'autre part, sans cette limitation, la mise à jour de la liste prendrait beaucoup de temps lorsqu'on sélectionne un grand nombre de départements avec un nombre minimal d'habitants peu élevé.
La liste en bas à droite représente la liste des villes que contient le projet. On agrandit cette liste en ajoutant : toutes les villes de la liste de gauche ou seulement une sélection. On réduit cette liste en supprimant une sélection de ville ou en la vidant complètement. Projet ISIMA 3ème année F2 – Système d'Information Géographique
39/50
BAJART / CHARLES
DÉVELOPPEMENT DE L'APPLICATION
3.9.4 Modèle
Le modèle de l'extracteur de ville reçoit trois types d'évènements qui sont chacun associé à un traitement (Tab. 7). Événement
Traitement
Modification de la sélection des départements
Ouvre les fichiers des nouveaux départements sélectionnés (sauf si leur contenu est déjà chargé en cache) et met à jour la liste des villes pouvant être selectionnée
Modification de la valeur du nombre minimal d'habitants
Crée une liste de villes à partir des département sélectionnés en filtrant sur le nombre d'habitants
Modification de la liste des villes du projet
Réécrit le fichier ~/.sig/project/<projet_courant>/cities en y inscrivant la nouvelle liste de villes
Tab. 7 ­ Traitements effectués par le modèle de l'extracteur de villes
63170
63110
63400
63140
63000
63800
63200
63530
Aubière
Beaumont
Chamalières
Châtelguyon
Clermont-Ferrand
Cournon-d'Auvergne
Riom
Volvic
List. 17 ­ Exemple de fichier contenant la liste des villes d'un projet
Les villes inscrites dans le fichier « cities » du projet sont identifiées par leur code postal et leur nom (Exemple : List. 17).
3.10 Coordonnées des villes
3.10.1 Objectif
Afin de pouvoir placer les villes sur une carte, on souhaite connaître la position géographique des villes sélectionnées dans le projet. C'est pourquoi nous avons besoin d'un « multi­
géocodeur » permettant de géocoder une liste d'adresse et d'enregistrer les coordonnées.
3.10.2 Vue
La vue est composée :
• d'un bouton pour lancer le géocodage ;
• d'une barre de progression pour surveiller l'avancement du traitement ;
• d'une console de sortie.
Au fur et à mesure que le traitement avance, le résultat des requêtes de géocodage est affiché dans la console de sortie. À la fin du traitement, les différentes villes sont mis en évidence sur la carte à l'aide de marqueurs (Fig. 24).
Projet ISIMA 3ème année F2 – Système d'Information Géographique
40/50
BAJART / CHARLES
DÉVELOPPEMENT DE L'APPLICATION
Fig. 24 ­ Onglet « Coordonnées des villes » et position des villes sur la carte
Projet ISIMA 3ème année F2 – Système d'Information Géographique
41/50
BAJART / CHARLES
DÉVELOPPEMENT DE L'APPLICATION
3.10.3 Modèle
Le modèle ouvre le fichier contenant la liste des villes et effectue un géocodage pour déterminer une à une la position des villes.
Google autorise un nombre de géocodage limité, c'est pourquoi il faut économiser le nombre de requêtes en évitant de géocoder deux fois la même ville. Pour cela, on stocke le résultat des requêtes dans un cache. On accède au cache en appelant la méthode geocode() de la classe CacheGeocoder qui implémente l'interface Geocoder. Cette classe possède en plus une méthode register() qui permet d'enregistrer la position d'une nouvelle ville. Le géocodage se déroule ainsi : on regarde d'abord si la ville est déjà présente dans le cache ; si c'est le cas, on dispose immédiatement des coordonnées ; sinon on effectue une requête de géocodage avec la classe GoogleGeocoder et on enregistre le résultat dans le cache.
Fig. 25 ­ Algorigramme de principe de l'utilisation cache du géocodeur
Dans le cas où une requête échoue à cause d'un problème du serveur distant ou d'une erreur inconnue, le modèle effectue jusqu'à quatre nouvelles tentatives.
Une fois le traitement achevé, on place les marqueurs de chaque position sur la carte à l'aide de la classe GoogleMap et on la recadre avec le centrage et le niveau de zoom optimal. 3.10.4 Cache
Les données du cache sont situées dans le répertoire ~/.sig/cache/positions/. On structure le cache regroupant les données, par pays puis par département. Le format d'une entrée dans un fichier est :
<numéro de département> <nom de ville>\t<latitude>,<longitude>
Projet ISIMA 3ème année F2 – Système d'Information Géographique
42/50
BAJART / CHARLES
DÉVELOPPEMENT DE L'APPLICATION
Ainsi la position de la ville de Nice (06100) sera stockée dans le fichier ~/.sig/cache/positions/France/06. La ligne qui correspond à cette entrée est :
06100 Nice
43.72758,7.2598915
Ce stockage arborescent permet de retrouver très rapidement une entrée dans le cache. Son utilisation à alors deux conséquences : on limite le nombre de requêtes auprès du fournisseur de services et on accélère le traitement d'un géocodage multiple. Ce traitement est d'autant plus rapide que la taille du cache croît au fur et à mesure qu'on utilise l'application.
3.11 Création du distancier
3.11.1 Objectif
Le but de ce dernier outil est de construire le distancier à partir de la liste des villes. Pour une liste de taille n , ce distancier correspond une matrice M n ,n dont chaque composante c ij est égale à la longueur (métrique ou temporelle) du trajet qui sépare les villes i et j.
Cette matrice est particulière puisque sa diagonale est composée de zéros (la distance entre une ville et elle­même est nulle). De plus, en supposant que le trajet de i vers j est strictement le j vers i , on peut affirmer que c ij=c ji et que nous avons à faire à une matrice nn−1  .
symétrique. Le nombre de que trajets à évaluer est donc égal à trajet inverse de 2
3.11.2 Vue
La vue est pratiquement identique à celle de l'onglet précédent (Fig. 26). La console de sortie affiche le résultat de chaque requête d'itinéraire.
Fig. 26 ­ Onglet « Construction du distancier »
Projet ISIMA 3ème année F2 – Système d'Information Géographique
43/50
BAJART / CHARLES
DÉVELOPPEMENT DE L'APPLICATION
3.11.3 Modèle
Comme précédemment, le modèle utilise un cache faisant appel à la classe CacheRouteFinder qui implémente l'interface RouteFinder.
Au fur et à mesure du traitement, on remplit deux matrices n×n distances (métrique) et durations (temporelle) avec le résultat des requêtes de géocodage. Lorsque toutes les requêtes ont été exécutées, on enregistre les matrices dans les fichiers du même nom.
Les matrices sont stockées sous forme de fichier texte en séparant les colonnes par tes tabulations et les lignes par des retours à la ligne. Les distances sont exprimées en mètres et les durées en secondes.
cities
63170 Aubière
75001 Paris
59800 Lille
distances
0
427726
639391
427726
0
26095
durations
639391 0
26095 14465
0
20913
14465
0
7915
20913
7915
0
Tab. 8 ­ Liste des villes et distanciers
3.11.4 Cache
Lorsqu'on détermine le trajet entre deux villes, par exemple Paris – Lille, on stocke sa longueur (métrique et temporelle) à deux endroits :
Sens aller : • Fichier : ~/.sig/cache/routes/France/75/75001\ Paris
• Ligne : 59000 Lille
226095
7915
Sens retour : • Fichier : ~/.sig/cache/routes/France/59/59000\ Lille
• Ligne : 75001 Paris
226095
7915
Ainsi, le fichier ~/.sig/cache/routes/France/75/75001\ Paris contiendra tous les trajets au départ de Paris.
3.12 Déploiement du SIG
3.12.1 Conditions préalables
3.12.1.1 Java
Pour exécuter l'applet dans le navigateur, il est indispensable de disposer du plugin Java 1.6. À l'heure actuelle, cette version n'est pas encore disponible pour Mac OS X.
3.12.1.2 Serveur Web
Pour pouvoir utiliser l'application, on doit disposer d'un serveur Web tel que le logiciel Apache. Il est fournit de base ou sous forme de package à installer dans la plupart des distributions Linux. Sous Windows, la méthode la plus simple pour l'obtenir est sans doute d'installer la suite Projet ISIMA 3ème année F2 – Système d'Information Géographique
44/50
BAJART / CHARLES
DÉVELOPPEMENT DE L'APPLICATION
EasyPHP.
Mais on peut tout à fait se passer de serveur Web local en utilisant hébergeur, l'important étant de pouvoir accéder à l'application grâce à une URL HTTP.
Par exemple :
• http://localhost/
• http://fc.isima.fr/~username/
• http://foo.free.fr/
• etc.
3.12.2 Clé Google
Pour pouvoir utiliser les services de Google Maps, il faut obtenir une clé en se rendant à l'adresse :
http://code.google.com/intl/fr/apis/maps/signup.html
Cette page d'inscription contient un formulaire où l'on doit entrer l'URL à partir de laquelle sera utilisée l'API. Si on a installé le serveur Apache en local, il s'agit de : http://localhost/.
La clé ainsi obtenue sous forme de chaîne de caractères doit être copiée dans le fichier :
Sous Linux : ~/.sig/googlekey
Sous Windows :
C:\Document and Settings\<utilisateur>\SIG\googlekey (sans extension)
3.12.3 Installation du SIG
Il faut ensuite ensuite extraire l'archive sig.tar.gz dans le répertoire racine du serveur web :
Sous Linux :
/var/www (ou ~/public_html si l'option UserDir d'Apache est activée)
Sous Windows :
C:\Program Files\EasyPHP 3.0\www\
3.12.4 Lancement de l'application
Firefox :
L'accès à l'application se fait en ouvrant la page suivante avec le navigateur Mozilla http://localhost/sig/ ou http://localhost/~username/sig/ si on utilise l'option UserDir d'Apache
Projet ISIMA 3ème année F2 – Système d'Information Géographique
45/50
BAJART / CHARLES
DÉVELOPPEMENT DE L'APPLICATION
Si le domaine est différent, il suffit d'adapter l'URL. Exemples :
http://fc.isima.fr/~username/sig/
http://foo.free.fr/sig/
Au premier lancement, une fenêtre apparaît (Fig. 27) pour demander la validation d'un certificat. Cette validation est nécessaire pour que le navigateur autorise l'applet à lire et écrire des fichiers sur le disque dur.
Fig. 27 ­ Certificat autorisant l'applet à accéder au disque dur
3.12.5 Bugs connus
Nous avons rencontré plusieurs bugs, survenant de manière totalement erratique, que nous n'avons pas su résoudre :
Applet qui ne charge pas : Si aucune exception Java n'est levée, cela provient sans doute d'un bug du navigateur ou du plugin Java.
Brusque fermeture du navigateur lors de l'utilisation de l'applet : Il s'agit vraisemblablement d'un bug (erreur de segmentation) de Mozilla Firefox.
Impossible de saisir des données au clavier dans les champs de texte
Dans la plupart des cas, recharger la page Web ou redémarrer le navigateur corrige le problème.
3.13 Améliorations pouvant être apportées au logiciel
Ce SIG peut­être amélioré sur plusieurs points :
• Il serait intéressant de pouvoir se passer du navigateur en utilisant, non plus une applet, mais une application autonome. Pour cela, il faudrait tenter de trouver une API Java qui fournit les mêmes services que Google Maps.
• On souhaiterai pouvoir afficher le tracé des itinéraires sur les cartes. Cependant, cela exige de pouvoir stocker les points de passages dans un fichier. L'idée est donc de trouver le moyen de sérialiser (ou extraire le contenu) de l'objet GRoute de l'API Google Maps.
Projet ISIMA 3ème année F2 – Système d'Information Géographique
46/50
BAJART / CHARLES
CONCLUSION
CONCLUSION
Le développement du SIG géographique à globalement suivit le planning prévu, même si quelques difficultés techniques ont parfois ralenti notre progression et la plupart des fonctionnalités demandées au départ ont été implémentées. Nous avons travaillé l'ergonomie de l'interface graphique pour faciliter la navigation au sein de ce logiciel et permettre à n’importe qui de pouvoir l’utiliser. Les objectifs ont donc bien été atteints.
La principale difficulté rencontrée au cours du développement fut l'intégration des services de JavaScript de Google Maps dans le programme Java. En effet, nous avons du comprendre comment une tel communication était possible et nous rediriger vers une applet Java plutôt qu’une application Java.
Ce projet nous a permis de mieux comprendre le fonctionnement d’un SIG et ce qu’il est possible de faire avec différentes technologies Web mises à disposition gratuitement. Nous avons appris à utiliser ces technologies écrites en JavaScript au sein d’un programme Java. Il nous a aussi permis de maîtriser le langage JavaScript et d'acquérir une expérience supplémentaire (en particulier pour l'organisation du projet, le patron de conception MVC et la création d'une interface ergonomique avec Swing) quant au développement d'un programme Java conséquent.
Notre logiciel va pouvoir aider plusieurs enseignants­chercheurs dans leurs recherches et dans leurs communications. Dans les mois à venir, d'autres étudiants de l'ISIMA seront sûrement amenés à reprendre ce projet afin de faire évoluer l'application pour mieux prendre en compte les attentes des clients.
Projet ISIMA 3ème année F2 – Système d'Information Géographique
47/50
BAJART / CHARLES
GLOSSAIRE
GLOSSAIRE
Applet
Une applet est un logiciel qui s’exécute dans un navigateur web.
Cache
Un cache est un élément de stockage permet d'enregistrer des résultats de traitement afin de pouvoir les retrouver de manière efficace sans avoir à recommencer le traitement.
CSS
Cascading Style Sheets (feuilles de style en cascade) est un langage informatique qui notamment sert à décrire la présentation, la mise en forme des documents HTML. CSV
Comma­Separated Values est un format de fichiers texte permettant de stocker des données ligne par ligne en séparant les champs par des virgules ou point­virgules.
Distancier Matrice qui stocke les longueurs (métrique ou temporelle) des trajets entre tous les couples possibles d'une liste de villes.
Fonction de rappel Une fonction de rappel, souvent appelée « calback », est une fonction passée en argument qui peut­être appelée dans le corps d'une autre fonction.
Heuristique Méthode de résolution de problème qui fournit une solution acceptable sans pour autant garantir l’optimalité
Listener Le listener, en français « écouteur », est le terme anglais utilisé de façon générale en informatique pour qualifier un élément logiciel qui est à l'écoute d'évènements afin d'effectuer des traitements.
Look & Feel
Le look & feel d'une interface graphique correspond à l'ensemble des caractéristiques visuelles qui donne une identité au logiciel. Il s'agit des polices de caractères, de leur taille, des formes des composants de l'interface, de leur couleurs, de leur disposition, etc.
Projet ISIMA 3ème année F2 – Système d'Information Géographique
48/50
BAJART / CHARLES
GLOSSAIRE
NP­complet
En théorie de la complexité, un problème NP­complet désigne un problème dont les solutions ne peuvent pas être déterminées dans un temps polynomiales. Le temps de résolution croît de façon exponentiel avec la taille du problème.
Porté d’une variable
La portée lexicale d'une variable définit sa visibilité dans le code source du programme. Elle peut­être locale (visible seulement à l'intérieur d'une fonction où d'une classe) ou globale (visible partout dans le code source).
URL
Une URL, de l'anglais Uniform Resource Locator, littéralement « localisateur uniforme de ressource », est une chaîne de caractères utilisée pour adresser les ressources du World Wide Web.
Wrapper Un « wrapper » ou « adaptateur » en français permet de convertir l'interface d'un composant logiciel en une autre interface dans le but de pouvoir le faire communiquer avec d'autres composants qui n'auraient pas pu le faire autrement à cause d'une incompatibilité d'interfaces.
Projet ISIMA 3ème année F2 – Système d'Information Géographique
49/50
BAJART / CHARLES
RÉFÉRENCES EN LIGNE
RÉFÉRENCES EN LIGNE
Communication Java ­ JavaScript
https://developer.mozilla.org/en/Gecko_Plugin_API_Reference/Scripting_plugins
https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/LiveConnect_Overview/
https://developer.mozilla.org/en/LiveConnect
http://www.docjar.com/docs/api/netscape/javascript/JSObject.html
http://www.apl.jhu.edu/~hall/java/JavaScript­from­Java.html
Documentation des fournisseurs de services géographiques
http://code.google.com/apis/maps/documentation/
http://dev.viamichelin.fr/wswebsite/fra/jsp/vmdn/VMDN­Api­Maps­Drive­Reference.jsp
http://api­pro.mappy.com/
Implémentation du patron de conception Modèle­Vue­Contrôleur
http://baptiste­wicht.developpez.com/tutoriel/conception/mvc/
Documentation des packages Java standards
http://java.sun.com/j2se/1.4.2/docs/api/
Projet ISIMA 3ème année F2 – Système d'Information Géographique
50/50