Comme nous l'avons vu dans le billet précédent sur le gestionnaire de marqueurs, l'API Google Maps ne gère pas automatiquement le remplacement d'un groupe de marqueurs proches par un marqueur unique à faible facteur de zoom. Heureusement, Jef Poskanzer a écrit une librairie implémentant cette fonctionnalité : Clusterer.
Partons de l'exemple 9 qui est identique à l'exemple 4 d'un précédent billet auquel j'ai ajouter une concentration importante de marqueurs à l'est de Paris. Déclarons la librairie dans l'en-tête HTML :
Un objet Clusterer possède 4 méthodes :
Il suffit ensuite de remplacer chaque appel à map.addOverlay(marker) par un appel à clusterer.AddMarker(marker, title) (où title est la ligne du marqueur réel qui s'affichera dans la fenêtre d'information du marqueur correspondant au cluster) et chaque appel à map.removeOverlay(marker) par un appel à clusterer.RemoveMarker(marker). Exemple dans la fonction setup_json :
Le résultat est visible sur l'exemple 10.
Cette solution permet de rendre de bons services, mais n'est toute fois pas idéale. En effet, le clustering est lié au nombre de marqueurs plutôt qu'à leur densité. Ainsi, deux marqueurs supperposés ne seront vus que comme un seul marqueur à fort grossissement (en l'absence de clustering). D'autre part, l'algorithme n'est pas très précis : sur l'exemple 10, le marqueur placé sur Le Havre a été intégré au cluster bien qu'il en soit assez éloigné !
Les autres billets de cette série sur l'API Google Maps :
Reprenons notre exploration de l'API Google Maps pour résoudre le problème suivant : comment afficher un unique marqueur regroupant plusieurs marqueurs lorsque le niveau de zoom est faible ? En effet, lorsque le nombre de marqueurs est très important sur une petite région, la carte est difficile à lire et lente à s'afficher. La réponse semble être le gestionnaire de marqueurs GMarkerManager.
Partons de l'exemple 4 d'un précédent billet dans lequel nous déléguons l'affichage des marqueurs à un gestionnaire de marqueurs. Pour cela, on déclare une variable mgr, que l'on instancie dans la fonction load :
L'ajout des marqueurs se fait dans la fonctions setup_json en créant d'abord un tableau de marqueurs, markers, ajouter en une fois à la carte via la fonction addMarkers prenant comme second paramètre le niveau de zoom minimum en deçà duquel les marqueurs ne sont pas affichés, et un troisième argument optionnel, le niveau de zoom maximum au delà duquel les marqueurs ne sont pas affichés :
Le résultat est visible sur l'exemple 8.
On peut appeler plusieurs fois la méthode addMarkers avec différents tableaux de marqueurs pour différents niveau de zoom et gérer ainsi, à la mano, les regroupements de marqueurs. Cela implique donc de calculer, sur le serveur, l'emplacement des marqueurs qui prendront la place d'un ensemble de marqueurs et du niveau de zoom auquel on affiche chacun... Pas simple ! Heureusement il existe une solution toute faite via une librairie JavaScript... Suite au prochain épisode !
Les autres billets de cette série sur l'API Google Maps :
Le développement d'une application s'appuyant sur un service externe (mashup) tel que Google Maps ou facebook nécessite de le faire sur un serveur accessible depuis Internet. Cela est imposé par le fournisseur du service qui soit délivre une clé liée au nom du serveur (Google Maps par exemple), soit fait des requêtes directement sur le serveur (facebook). Voici une adaptation d'un tutoriel permettant de développer une telle application sur votre propre poste de développement local (si vous maîtrisez votre réseau).
Il n'y a pas de solution miracle. La seule possibilité est de mettre son poste de développement (le PC) sur Internet. Cela implique de pouvoir faire de la translation de port sur votre routeur NAT. Cette opération varie d'un routeur à un autre. Mais vous aurez généralement besoin de connaître l'adresse IP du PC sur le réseau interne ainsi que son adresse MAC. Pour cela il suffit de taper la commande ifconfig eth0 qui vous sort un truc comme ça (les adresses ci-dessous sont fictives) :
L'adresse IP du PC sur le réseau interne est donc 192.168.0.13 et son adresse MAC 00:12:62:4A:BA:28.
Il suffit de configurer son routeur pour lui indiquer que l'adresse MAC 00:12:62:4A:BA:28 doit toujours être associée à l'adresse IP 192.168.0.13 et que les requêtes reçu par le routeur sur le port 80 doivent être renvoyées vers le port 80 de la machine d'adresse IP 192.168.0.13.
Vous pouvez chercher la procédure adaptée à votre routeur sur le site Port Forward. Dans le cas d'une freebox, il suffit d'aller sur la page de configuration accessible après login, et de remplir le formulaire :

Vérifiez que cela fonctionne en pointant votre navigateur vers l'adresse IP publique de votre routeur, récupérable via son interface de configuration ou via le service web What is my IP (88.171.154.137 par exemple). Vous devez voir la racine de votre serveur web... Vous pouvez même donner un nom DNS à cette adresse IP. Il ne vous reste plus qu'à générer la clé du service pour cette adresse IP !
Ce sixième et dernier billet (pour le moment du moins) sur l'API Google Maps vous apprendra à récupérer les coordonnées d'un marqueur déplaçable.
Partons de l'exemple 6 du billet précédent. Les coordonnées sont des propriétés du marqueur qu'il suffit de récupérer à la fin d'un glisser/déposer dans la fonction createMarker :
Voilà ! Nous avons tout ce dont nous avons besoin pour faire un formulaire d'enregistrement de coordonnées en plus de l'affichage de marqueurs correspondants à des emplacements fournis sous forme de données JSON.
Le résultat est visible sur l'exemple 7.
Les autres billets de cette série sur l'API Google Maps :