Stage Web Services cartographiques


Stagiaire :Mohcen BENMOUNAH
Période : 16 mars au 16 septembre 2011


>> Télécharger le fichier rapport_mohcen.pdf

Infos et notes
http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=SommaireMethodologie

Objectif :

Création de web services géographiques.


Le projet libre http://www.openstreetmap.org/ (OSM) a dès à présent numérisé les limites administratives d'environs 22 000 communes, c'est en se basant sur ces données que les services web seront développés en PHP.

Le stagiaire sera amené à :

  • * réaliser un cahier des charges des services (quels besoins ? quelles réponses ? etc...).
  • * intégrer les données d'OSM afin de les exploiter.
  • * fournir une solution simple permettant d'intégrer régulièrement les nouvelles données d'OSM.
  • * développer au moins un service web en PHP.

Pré-analyse
Mygis et requete SIG, concernant Mysql, l'extension GIS est déjà active, cf : http://dev.mysql.com/tech-resources/articles/4.1/gis-with-mysql.html, est ce suffisant ? Il n'y aurait rien a installer sur le serveur.

Réalisation


Etapes du travail:



1> Récupération d'un lot de données:
  • *  OpenStreeMap offre la possibilité de récupérer des cartes de données géographiques d'un pays. Ces cartes sous forme de fichiers XML se trouvent sur l'adresse suivante http://download.geofabrik.de/osm/ . En effet, le format propre aux données données géographiques issues de la plateforme  OpenStreetMap respectent une structure, voire une syntaxe XML, et ont pour extension OSM.




2> Intégration des données dans la base.

  • Description brève de la BD  OpenStreetMap :
    • La base de données OSM dispose principalement des trois entités suivantes : relation, way, et node.
    • Chaque relation définit un niveau bas de découpage d'une surface terrestre, elle englobe un grand nombre de Ways. Un way est un découpage d'un niveau supérieur à celui défini par une relation. À son tout, un way référence un certain nombre de nodes, un node est encore un niveau de découpage supérieur. En réalité, un node est un point précis sur la surface terrestre, et qui peut, entre autres, décrire un couple longitude/latitude.

  • * Chaque relation et way sont accompagnés d'un certain nombre de tags, ou métadonnées.
  • * Lorsqu'il s'agit d'une entité administrative (relation ou way), cette dernière est balisée avec les données Administrative et Boundary.
  • * Il est évident que dans le cas de ce projet, seules les informations administratives nous intèressent. Ainsi, on ne prendra en compte que les relations et ways taggués avec boundary et administrative.
  • * En se penchant sur les tags, et dans le cas de la France, les relations ayant les tags boundary avec la valeur administrative, et le tag admin_level pour valeur 4 définissent les régions. Lorsque le tag admin_level a pour valeur 6 les relations décrivent les département, et dans le cas où admin_level possède la valeur 8, la relation définie une commune.
    • Ainsi :
  • - Une région est dans une "relation (administrative)" et d'un niveau administrative valant 4.
    • Un département est dans une "relation (administrative)" et d'un niveau administrative valant 6.
    • Les communes sont dans des "relation (administrative)" et d'un niveau administrative valant 8.
    • Les limites géographiques sont les "nodes" référencés par les "way" qui sont référencés par les relations recherchées.
    • Ex : Le département de l'Hérault ( tag boundary = administrative et admin_level =6), la relation correspondante porte numéro d'id : 7429, Il est alors possible de :
    • Afin d'éviter de remplir la base de données avec des informations inutiles (que contient France.osm par exemple), Nous allons nous intéresser seulement aux relations avec des tags (k="boundary" v="administrative", k="admin_level" v="8"), comme ci-dessous:

<relation id="1">
  <tag k="type" v="boundary" />
  <tag k="boundary" v="administrative" />
  <tag k="land_area" v="administrative" />
  <tag k="admin_level" v="2" />
  <tag k="name" v="light green country" />
  <member type="way" id="AB" role="outer" />
  <member type="way" id="AC" role="inner" />
</relation>

Nous avons évidement mentionnées les niveaux administratifs de niveau 8, car seules les communes nous intéressent.
Les noms des communes sont cités dans les tags "name" des relations prises en compte.
3> Développement d'un Script PHP calculant et retournant le nom d'une commune et le code INSEE à partir des coordonnées (Lat/Lon) demandées, et de la base de données.

  • Pour cela, nous avons besoin de :
    • a> Remplissage de la BD :
      • 1-Parser le fichier France.osm et récupérer la liste des ID des relations administratives correspondant à toutes les communes françaises. Pour ce faire, il suffit de ne prendre en compte que la liste des ID des relations administratives et de niveau administratif 8 dans http://download.geofabrik.de/osm/europe/france.osm.bz2
      • 2- La liste de toutes les références vers ways de toutes les relations administratives. Pour ce faire, on doit mettre en place un script qui parcourt chaque ID relation administrative, et récupère un fichier XML qui contient la liste des ID des "ways" de la relation, en effectuant des appels à l'API  OpenStreetMap : http://api.openstreetmap.org/api/0.6/relation/"idRelation". A chaque appel, les données OSM récupérées sont ajoutées aux données précédemment récupérées et stockées dans un fichier xml.
      • 3-La liste de toutes les références vers tous les nodes. Même chose que précédemment mais avec http://api.openstreetmap.org/api/0.6/relation/"idWay".
      • 4-La liste de tous les nodes. Même chose mais avec http://api.openstreetmap.org/api/0.6/relation/"idNode"
      • 5-A la fin, nous obtenons un fichier (monFichier.osm) qui contient toutes les relations, ways et noeuds administratifs de la France.
      • PS: A voir aussi et à vérifier http://api.openstreetmap.org/api/0.6/relation/id/full (permet de retourner un fichier XML qui contient les relations, ways et les neouds d'un identifiant relation connu )
        • 6-Intégration des données avec l'aide d'Osmosis: ./osmosis --read-xml file="monFichier.osm" --write-mysql populateCurrentTables=yes host="localhost" database="france" user="root" password="xxxx"
        • 7-Filtrage d'un fichier osm :./osmosis --read-xml corse.osm --tf accept-relations boundary=administrative --tf accept-relations admin_level=8 --used-node --write-xml corseOut.osm
          • (Ici on accepte seulement les relations qui concernent les limites administratives des communes )

  • b> Récupération des requêtes utilisateurs et retour du nom de la commune et son numéro INSEE :
    • Nous devons écrire un script php qui, à partir des données longitude et latitude fournies par l'utilisateur correspondant à un point précis, renvoie le nom de la commune. Le script a également besoin des données administratives présentes dans la BD.
    • Nous devons appliquer des algorithmes géospatiales spécifiques qui sont à même de fournir pour un point précis, et un certain nombre de points limites, l'information indiquant quels points limites délimitent ce point.

4> Script pour la procédure de mise à jour des données:
  • * Mise à jour via les “diff” en comparant les deux fichiers(base OSM et la base locale).

Avancement du travail:

  • Récupération d'un fichier OSM .
  • Filtrage du fichier à l'aide d'une commande OSMOSIS afin garder juste les relations qui contient les ref:INSEE (Communes ) comme suit:
    • #!/bin/bash
      /home/mohcen/Applications/osmosis-0.39/bin/osmosis  \
      --fast-read-xml /home/mohcen/Documents/osm/FICHIER.osm \
      --tf accept-relations ref:INSEE=* \
      --used-way \       //garder que les ways qui nous intéressent 
      --used-node \      //garder que les noeuds qui nous intéressent 
      --wx /home/mohcen/Documents/osm/FICHIER_FILTRE.osm
      


  • Script php qui parse le fichier(XMLReader) "osmFiltré" et rempli la base, il contient :
-La fonction "recupererRelationsWaysFrance()": récupère toutes les relations du fichier osm (id_commune,Nom et INSEE), remplie la table `communeOSM` ainsi que la table ` RelationsWays` qui contient(id_relation, id_way, role(null, inner, outer, exclave et enclave) ) -La fonction "recupererWaysNodesFrance()" récupère l'id_way et tous les id_node de chaque way et remplie la table ` WaysNodes` et l'ordre (ordre des neouds de chaque way tels qu'ils sont dans le fichier OSM) .
-La fonction "recupererNodesLatLonFrance() "récupère tous les l'id_node et les valeurs(Lat/Lon) correspondantes et remplie la table ` NodesLatLon` .
-La fonction "ordonnerWays()" algorithme qui calcule l'ordre et le sens de chaque way dans une relation et remplie la table ` RelationsWays` (ordre et sens) l'ordre des ways est indispensable pour la constitution d'un polygone fermé( c.à.d que chaque way est relié au suivant par son dernier node.).
-La fonction "remplirPolygone()" parcourt tous les ways et les noeuds de chaque relation en prenant en considération l'ordre et le sens de chaque ways . Update du champ polygone de chaque relation dans la table ` CommuneOSM`.
  • UPDATE `communeOSM` SET `polygon` = POLYFROMTEXT('MULTIPOLYGON((($separationVirgulePolygone)))'),`note` = 'Polygone complet' WHERE `communeOSM`.`id_com` = {$idCommune} %%
-Gestion des Multipolygones.
-Création du webservice.
  • implémentation script de localisation.
  • création du service
-Mise à jour de la base de données.
  • génération du fichier de différence à l'aide d'osmosis
  • analyse des variation des données.
  • Mise a jour régulière des données a partir des variations.