Utiliser Google My Maps comme outil coopératif

Ce texte documente des premiers pas à utiliser Google My Maps pour relever des informations géographiques par plusieurs utilisateurs dans la nature, les exporter, les traiter et les remettre en ligne pour le public. Comme il n’y a à priori pas la possibilité d’occulter des colonnes de données, il faudra deux versions: une carte de travail et une carte traitée publique. Les enjeux sont l’édition par les multiples utilisateurs et l’export et l’import.

Document évolutif!

Edition sous My Maps pour plusieurs éditeurs

Il est possible d’ajouter des utilisateurs/éditeurs sans rendre la carte publique en ajoutant des adresses email d’accès. Ceux-ci doivent disposer de comptes Google (automatique avec tout mobile Android). On invite d’autres utilisateurs sous le menu partager par email. Si cette adresse n’est pas une adresse Google Mail (gmail), l’utilisateur invité sera demande de sélectionner une adresse existante ou d’en créer une. Par la suite le procédé dépend de l’environnement où le nouvel utilisateur ouvre la carte:

Carte partagée utilisée sur ordinateur

Dès que l’identification est passée, l’utilisateur sera dirigé vers My Maps et aura accès aux droits accordées sur la carte spécifiée à l’origine. La version pleine n’est éditable que sous Google Maps sur un ordinateur

Carte partagée utilisée sous portable

Dès que cette identification est passée, l’utilisateur sera questionnée sur l’application à utiliser pour ouvrir la carte. Sous Android il faut utiliser/télécharger Google My Maps, les autres applications proposés ne permettent pas l’édition. My Maps  présente des fonctionnalités réduites comparé à la version sur ordinateur. Mais c’est utilisable sur le terrain quand on a mis en place une carte sur ordinateur avant.

Sous les autres systèmes mobiles il faut utiliser Google Maps dans un navigateur, ce qui est pénible. À la rigueur c’est faisable sur tablette.

Edition de cartes

Version pleine sur ordinateur

  • Entrer dans le menu (trois barres) à gauche du champ de recherche sous Google Maps
  • Sélectionner Vos Adresses
  • Sélectionner Cartes dans le menu horizontal

On trouver alors éventuellement une liste de cartes déjà existantes, en bas il y a toujours le lien Créer une carte. En sélectionnant une des cartes on arrive dans une vue ressemblant à la vue publique de ses cartes, mais on n’y peut que visionner les données. On y trouve cependant le lien Ouvrir dans My Maps. Celui-ci et le lien Créer une carte mènent à l’interface d’édition.

Vue de My Maps sans données

Titre de carte

On peut nommer la carte (c’est celui qui apparaîtra sous  Cartes en venant du menu dans Google Maps). Le menu disponible (trois points) contient des fonctions de base comme le changement de cartes et on y trouve aussi l’unique moyen d’export des données: par KML/KMZ

Calques

Les calques (couches de cartes) peuvent aussi être nommées. S’il y en a plusieurs on peut les déplacer entre eux (drag&drop peu marqué). Dès que l’on a ajouté des points à l’intérieur des calques, il est possible de changer l’ordre à l’intérieur du calque seulement si:

  • les éléments des calques concernées ne sont pas groupés par style uniforme.
  • les éléments des calques ont les mêmes tables de données, cf. ci-bas.

Tables de données des calques

Par défaut, en ajoutant un élément à un calque, on ouvre un tableau contenant les informations suivantes:

  • Nom (qui apparaît dans la listes des éléments du calque)
  • Description (camp additinnel)
  • Les coordonnés (non affichés mais implicitement présentes)

On peut étendre/modifier les colonnes et le contenu de ce tableau en sélectionnant les trois points à la hauteur du non du calque:

Tableau de calque étendu

Versions sur portable

Visualisation

Il est possible de visualiser des cartes sous l’application Google Maps sur toutes les plateformes proposant cette application. Choisir les menu en haut à gauche (trois barres), puis Vos adresses, puis dans le menu horizontal Cartes (glisser le menu vers la gauche pour l’atteindre). Une liste des cartes disponibles apparaît et dans les cartes les informations des points sont affichables.

Edition uniquement sous Android

Actuellement il n’y a qu’une application pour Android, elle s’appelle aussi My Maps. Elle n’est pas très stable et plante assez souvent. Les fonctionnalités d’édition sont limités: il n’est pas possible d’importer ou d’exporter, de créer des calques, de sélectionner des types d’icônes, d’éditer des tableaux et d’ajouter des photos.

Il est cependant possible d’ajouter des points à des calques prédéfinis auparavant sur ordinateur et aussi de remplir des tableaux élargies avant. Cela suffit pour le travail sur le terrain.

Importer et exporter des donnés de My Maps

Nous avons vu l’export par KML/KMZ et ci-haut les tableaux de données. En gros tout est disponible, mais les chemins d’éditions hors du système ne sont pas aisées. On peut espérer que ce soit rendu plus facile dans le futur

Exporter de My Maps

On exporte sous le menu à gauche du titre de la carte. On traite ainsi toute la carte, contrairement à l’importation qui se passe au niveau des calques.

En exportant par KML/KMZ on a toutes les données dans un fichier XML organisée de manière géographique. Le fichier KMZ contient aussi des fichiers des icones. Pour l’éditer il faut le dé-zipper (Format .zip). Il est impossible d’éditer ces fichiers directement hors de Google Earth ou d’un SIG (Système d’Information Géographique) coûteux ou compliqué. Dans la plupart des cas on perdra aussi les donnés graphiques ajoutés comme les icônes ou les photos. Exporter vers KMZ permet la visualisation entière avec icônes, photos ajoutés et données sous Google Earth.

Pour des petites tables il est possible de sélectionneuse les lignes et de les faire passer par copier/coller dans un autre programme. On perd cependant les coordonnées, icônes et photos ajoutés.

Il y a des convertisseurs KML vers d’autres formats libres, mais ils ne sont pas toujours à jour, nécessitent des bibliothèque additionnelles ou omettent des informations importantes. Le plus grand souci est que l’on y perd toujours quelque chose. Si on trouve un convertisseur pour sortir du .csv (Comma Separated Values) ou du .tsv (Tab Separated Values) incluant les coordonnées géographiques on aura souvent les données additionnelles sous balises HTML et des photos ajoutés sont en général perdues lors du ré-import dans My Maps sous forme de table .csv ou .tsv.

En exportant vers .kmz et en dé-zippant par la suite, les informations ajoutés aux points sont enregistrés de manière double dans une balise <description> au format libre et dans une autre plus structurée sous <ExtendedData>.

<Placemark>
 <name>Pamela</name>
 <description><![CDATA[<img src="https://lh4.googleusercontent.com/6[...]" height="200" width="auto" /><br><br>rue: rjj<br>numero: 44g<br>taille: p<br>quoi: prêt à porter<br>marque: n<br>etat:[...] ]]></description>
 <styleUrl>#icon-1549-0F9D58</styleUrl>
 <ExtendedData>
 <Data name="rue">
 <value>rjj</value>
 </Data>
 <Data name="numero">
 <value>44g</value>
 </Data>
 <Data name="taille">
 <value>p</value>
 </Data>
 <Data name="quoi">
 <value>prêt à porter</value>
 [...]

Un moyen d’édition des fichiers .kml est décrit plus bas

Importer dans My Maps

Google My Maps offre plusieurs formats pour importer des données.

En utilisant .kml ou .gpx. il y a des limites de taille assez restrictive. La documentation indique 5mo, mais lors du procéde d’import est affiché une limite de lignes et d’éléments qui varie. Les données textes sont moins limités.

On importe des donnés directement dans un calque. Si les données de base sont composés de plusieurs couches, celles-ci sont transposés dans plusieurs calques dans My Maps. Il y a cependant une limite de 10 calques et de 2000 éléments. L’interface avertit de ces limites lors de l’import, cependant cela se passe aussi avant d’atteindre ces limites. Il n’est donc jamais sûr si vraiment tous les Clements seront présents. Il vaut mieux procéder calque par calque.

Les formats géographiques .kml, .kmz permettent d’importer des icônes, sous  .gpx cela ne marche à priori pas. De même sous les formats texte et listes n’apparaîtra qu’une icône défaut. Il faudra les adapter après.

Importer par .csv

.csv signifie comma-separated values, les séparateurs sont obligatoirement des virgules, les points-virgules ne fonctionnent pas. Ceci implique que des virgules ne sont pas autorisés dans les valeurs. La longueur des champs ne doit pas dépasser 64 caractères.

Ci-bas le contenu d’un exemple d’un fichier .csv. La première ligne contient des titres des colonnes, au-dessous ce sont les lignes données. En nommant les paires de coordonnées lat et long, My Maps les reconnaîtra comme coordonnées pour placer les repères. Il faut aussi penser à ajouter une colonne avec un nom, My Maps en a besoin pour labelliser le repère.

lat,long,nom,rue,numero,taille,quoi,marque,etat,depuis,avant,info
43.432227,6.736347,garage nouveau,rg,93,p,garage,,,,,,
43.432444,6.734671,ancienne boulangerie,rgcdg,42,g,v,,,

Importer par .tsv

.tsv signifie tabs-separated values, les séparateurs sont obligatoirement des tabulateurs, cela a l’avantage de pouvoir utiliser des virgules dans les champs. Il n’y pas de limite de longueur de champ à 64 caractères! Attention, le fichier doit vraiment avoir l’extension *.tsv et non pas *.csv.

ficher .tsv

Importer par .xlsx

.xslx est le format de Microsoft Excel basé sur XML, beaucoup de logiciels tableur peuvent le traiter. Le téléchargment se passe de manière similaire au format .tsv.

logiciel tabulateur pour exporter/importer le format .xlsx

Importer au format .gpx

Non testé, mais à priori il n’y a pas moyen de faire suivre des icônes ou des photos ajoutées aux points.

Importer au format .kml/.kmz

Il faut construire un fichier .kml correctement formaté et encodé (UTF-8) et faut observer la limitation à 5mo qui est très vite atteinte au-delà de 500 éléments car le format XML n’est pas économe en place.

À défaut de disposer d’un système d’information géographique puissant et onéreux et comme l’édition sous Google Earth n’apporte pas fonctionnalités supplémentaires, ces formats ne semblent pas très utiles pour importer et exporter de My Maps, bien que ce soient des formats géographiques. Il faut donc éditer ces fichiers si on veut y changer quelque chose, c’est assez pénible et un moyen est décrit dans le prochain chapitre.

Edition de fichiers .kml pour être ré-importes dans My Maps

Ayant à la base une carte générée et éditée sous My Maps avec des données standardisés dans des champs prédéfinis dans les calques, on peut travailler ces fichiers .kml à deux nivaux:

  • dans le texte, donc principalement par chercher/remplacer dans un éditeur texte. Le problème est que pour par exemple retirer une colonne de données, il faut retirer une balise XML qui s’étend dans le ficher sur plusieurs lignes et qui n’est identifié  que par une ID dans la balise initiale.
  • au niveaux du DOM XML (Document Object Model), donc de manière hiérarchique. Le problème ici: il y très peu de programmes permettant ceci et la plupart sont très coûteux.

Il y cependant un programme utilisé par tous qui permet l’édition d’un DOM, c’est un simple navigateur avec le moteur JavaScrit inclus. En se servant de la console d’erreur, on peut éditer un fichier .kml et y apporter des modifications. Cela n’est pas tout à fait automatisable et dans le cas de .kml il faudra corriger des erreurs produite par la console.

Il faut un fichier .html local dans lequel on inclut le fichier  .kml entier. Le bloc JavaScript travaillera sur le bloc KML et le transformera. En bas en vert le code HTML, en mauve la partie script en en orange la partie KML incluse. Les choses à transformer sont: enlever et transformer quelques données dans les balises <Data> et éditer les balises <description>.

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <script>
      fonction init(){
        // ICI MODIFICATIONS DU FICHIER .kml
      }
      function printDOM() { // FONCTION POUR AFFICHER LE CONTENU MODIFIÉ DANS LA CONSOLE
        console.clear();
        console.log(document.getElementsByTagName('div')[0].innerHTML) ;
      }     
    </script>
  </head>
  <body onload="init()">
    <button onclick="printDOM()">Print DOM</button><hr/>
<div><?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
  <Document>
    <name>FREJUS 2016 BASE DE TRAVAIL</name>
    <description><![CDATA[type:<br>cafe:...]]></description>
    <Style id="icon-1534-7CB342-labelson">
      <IconStyle>
        <scale>1</scale>
        <Icon>
          <href>images/icon-1.png</href>
        </Icon>
      </IconStyle>
    </Style>
    ...
    <Folder>
      <name>magasins</name>
      <Placemark>
        <name>Musso</name>
        <description><![CDATA[<img src="https://lh5.googleusercontent.com/3zYWpckblawx8dB5lx9...]]></description>
        <styleUrl>#icon-1534-7CB342-labelson</styleUrl>
        <ExtendedData>
          <Data name="date">
            <value>2016.0</value>
          </Data>
          <Data name="rue">
            <value>rjj</value>
          </Data>
          <Data name="numero">
            <value>44d</value>
          </Data>
          <Data name="taille">
            <value>g</value>
          </Data>
          <Data name="occu">
            <value>o</value>
          </Data>
          <Data name="utile">
            <value>3</value>
          </Data>
          <Data name="type">
            <value>cafe</value>
          </Data>
          <Data name="quoi">
            <value>pâtissier</value>
          </Data>
          <Data name="marque">
            <value>n</value>
          </Data>
          <Data name="etat">
            <value>b</value>
          </Data>
          <Data name="depuis">
            <value>1992</value>
          </Data>
          <Data name="avant">
            <value/>
          </Data>
          <Data name="info">
            <value>entre 2008 et 2013 le magasin a été réduit aux 2/3 de la largeur de la maison</value>
          </Data>
          <Data name="gx_media_links">
            <value>https://lh5.googleusercontent.com/3zYWpckblawx8dB5lx9....</value>
          </Data>
        </ExtendedData>
        <Point>
          <coordinates>
            6.7352263,43.4328709,0
          </coordinates>
        </Point>
      </Placemark>
      ....
    </Folder>
  </Document>
</kml>
    </div>
  </body>
</html>

Pour modifier le code XML (KML), il faut des commandes dans le bloc script. Dans l’exemple suivant on tranforme le contenu de chaque champ „description“. Le contenu est ici entouré de <![CDATA[...]]>, ceci est nécessaire si la description contient du code HTML comme des photos.

function init(){ 
  var DescriptionElems = document.getElementsByTagName("description");
  for(var i = 0;i < DescriptionElems.length; i++){
     DescriptionElems[i].innerHTML = "<![CDATA[Données relevées par ...]]>";
  }
}

Pour toucher à un élément <Data>, qui représente une cellule du tableau de données dans My Maps, on peut procéder de manière similaire. N’étant pas sûr si une balise <Data> ne peut pas exister ailleurs qu’auprès des points de la carte, je prends soin de ne sélectionner que ceux dans le champ de donnés d’un point à l’intérieur d’une balise <ExtendedData>. Dans l’exemple qui suit, j’efface la cellule „utile“ et comme je le fait pour tous les Elements de la carte, ce sera la colonne correspondante qui sera effacée.

 function init(){
   var ExtendedDataElems = document.getElementsByTagName("ExtendedData");
   for(var e = 0;e < ExtendedDataElems.length; e++){
     var DataElems = ExtendedDataElems[e].getElementsByTagName("Data"); 
     for(var d = 0;d < DataElems.length; d++){
      if(DataElems[d].getAttribute("name") == "utile"){
        ExtendedDataElems[e].removeChild(DataElems[d]); // EFFACER ENTIÈREMENT 
      }
   }
}

Pour éditer le contenu d’une cellule on procède ainsi. Le contenu est ici initiallement une seule lettre et il est transformé en texte plus explicite grâce à une liste prédéfinie dans le script:

var taille2correct = [];
taille2correct["p"] = "petit magasin";
taille2correct["m"] = "magasin de taille moyenne";
taille2correct["g"] = "grand magasin";

function init(){
  var ExtendedDataElems = document.getElementsByTagName("ExtendedData");
  for(var e = 0;e < ExtendedDataElems.length; e++){
    var DataElems = ExtendedDataElems[e].getElementsByTagName("Data"); 
    for(var d = 0;d < DataElems.length; d++){
      if(DataElems[d].getAttribute("name") == "taille"){
      var infoHere = DataElems[d].getElementsByTagName('value')[0].innerHTML; // CONTENU
      infoHere = taille2correct[infoHere]; // TRANSFORMATION DU CONTENU AVEC LISTE PRÉDÉFINIE
      DataElems[d].getElementsByTagName('value')[0].innerHTML = infoHere; // NOUVEAU CONTENU
    }
  }
}

Lorsque tous les transformations désirées sont placés dans le script, on ouvre le fichier local dans un navigateur et en même temps la console (Ctrl+Maj+I), J’utilise Google Chrome qui a l’avantage d’afficher tout le résultat dans la console sans couper des informations. Le script démarrant en chargeant la page (onload), la transformation est faite d’office. Bien sûr on ne voit rien car le navigateur n’est pas fait pour visualiser du KML directement. On en reconnaît cependant des bribes:

Le fichier .html chargé dans le navigateur

En actionnant le bouton „Print DOM“ on écrit la page modifiée dans la console. En y changeant, on découvre le code KML modifié, on reconnaît par exemple les changements pour rendre les informations plus explicites. Mais, et c’est le grand défaut, la console apporte aussi des modifications non souhaitées. Dans la capture d’écran ci-bas on reconnaît:

  • certaines balises transformés en minuscules <Data> et <data> sont deux balises différentes et My Maps n’accepte pas la version en minuscules. Un multitude de balises sont concernées.
  • Les blocs CDATA et l’entête XML sont entourés de commentaires <!-- -->, ce qui rend le fichier corrompu.
  • En copiant le bloc on copie aussi des lignes de la console.
  • Il reste des lignes vides aux éléments effaces, c’est juste une question cosmétique.

Vue de la console avec le code tranformé

Pour y remédier je n’ai trouvé d’autre moyen que de faire passer le ficher dans un autre script qui corrige ces erreurs. C’est un fichier Perl, mais on peut utiliser tout autre script ou éditeur permettant le chercher/remplacer en large nombre des éléments avec des „expressions régulières“ (RegEx). Je copie ici le ficher tel quel, il ouvre un fichier prédéfini et écrit un nouveau corrigé:

$infile = "./doc2.kml";
$outfile = "./doc3.kml";
open(INFILE, "<",$infile) or die "Can't open input $infile: $!\n";
open(OUTFILE,">",$outfile) or die "Can't open output $outfile: $!\n";
while (<INFILE>) { #LOOP TO THE END OF FILE
  $line = $_;
  $line =~ s/^Navigated.*//g; # EFFACE PREMIER LIGNE DE CONSOLE
  $line =~ s/.*Console.*//g; # EFFACE MESSAGE DE LA CONSOLE
  $line =~ s/.*\.html\:\d+ //g; # EFFACE DÉBUT DEUXIÈME LIGNE DE LA CONSOLE

  $line =~ s/^\<\!\-\-\?xml/\<\?xml/; # CORRIGE ENCODAGE ENTÊTE
  $line =~ s/\?\-\-\>$/\?\>/;

  $line =~ s/document\>/Document\>/g; // CORRECTION DE BALISES
  $line =~ s/folder\>/Folder\>/g;
  $line =~ s/\<style/\<Style/g;
  $line =~ s/style\>/Style\>/g;
  $line =~ s/placemark\>/Placemark\>/g;
  $line =~ s/styleurl/styleUrl/g;
  $line =~ s/\<Styleurl\>/\<styleUrl\>/g; # ??
  $line =~ s/extendeddata\>/ExtendedData\>/g;
  $line =~ s/\<data/\<Data/g;
  $line =~ s/data\>/Data\>/g;
  $line =~ s/point\>/Point\>/g;
 
  $line =~ s/\&nbsp\;/ /g; # ERREURS AVEC DES ESPACES A LA FIN DE CELLULE
 
  $line =~ s/\<\!\-\-\[CDATA/\<\!\[CDATA/g; # CORRECTION ENDODAGE CDATA
  $line =~ s/\]\]\-\-\>/\]\]\>/g;
 
  $line =~ s/^ *\n//g; # EFFACE LES LIGNES VIDES
 
  print OUTFILE $line;
}
close(INFILE);

Le fichier généré par le script Perl est le fichier .kml final que l’on peut de nouveau charger dans My Maps dans une nouvelle carte ou dans un nouveau calque.

 

No Comments

Leave a Comment