<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="http://www.numabilis.com">
<channel>
 <title>Numabilis - JavaScript</title>
 <link>http://www.numabilis.com/taxonomy/term/10/0</link>
 <description></description>
 <language>fr</language>
<item>
 <title>Google Maps API : gestionnaire automatique de marqueurs</title>
 <link>http://www.numabilis.com/blog/2007-11-21-google_maps_api_gestionnaire_automatique_de_marqueurs</link>
 <description>&lt;p&gt;Comme nous l&#039;avons vu dans le billet précédent sur le &lt;a href=&quot;/blog/2007-11-20-google_maps_api_gestionnaire_de_marqueurs&quot; title=&quot;Lire le billet&quot;&gt;gestionnaire de marqueurs&lt;/a&gt;, l&#039;&lt;a href=&quot;http://www.google.com/apis/maps/index.html&quot; title=&quot;Visiter le site de l&#039;API&quot; hreflang=&quot;en&quot;&gt;API Google Maps&lt;/a&gt; ne gère pas automatiquement le remplacement d&#039;un groupe de marqueurs proches par un marqueur unique à faible facteur de zoom. Heureusement, &lt;a href=&quot;http://en.wikipedia.org/wiki/Jef_Poskanzer&quot; title=&quot;Lire l&#039;article Jef Poskanzer sur Wikipédia&quot; hreflang=&quot;en&quot;&gt;Jef &lt;span class=&quot;np&quot;&gt;Poskanzer&lt;/span&gt;&lt;/a&gt; a écrit une librairie implémentant cette fonctionnalité : &lt;a href=&quot;http://www.acme.com/javascript/#Clusterer&quot; title=&quot;Aller sur la page de la librairie Clusterer&quot; hreflang=&quot;en&quot;&gt;Clusterer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Partons de l&#039;&lt;a href=&quot;/files/demos/google-maps/exemple09.html&quot; title=&quot;Voir la page d&#039;exemple&quot;&gt;exemple&amp;nbsp;9&lt;/a&gt; qui est identique à l&#039;&lt;a href=&quot;/files/demos/google-maps/exemple04.html&quot; title=&quot;Voir la page d&#039;exemple&quot;&gt;exemple&amp;nbsp;4&lt;/a&gt; d&#039;un &lt;a href=&quot;/blog/2007-07-07-google_maps_api_affichage_des_donnees_dun_fichier_json&quot; title=&quot;Lire le billet&quot;&gt;précédent billet&lt;/a&gt; auquel j&#039;ai ajouter une concentration importante de marqueurs à l&#039;est de Paris. Déclarons la librairie dans l&#039;en-tête HTML&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;&amp;lt;script src=&quot;http://www.acme.com/javascript/Clusterer2.jsm&quot; type=&quot;text/javascript&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/div&gt;
&lt;/p&gt;La gestion automatique se fait en déclarant une variable &lt;tt&gt;clusterer&lt;/tt&gt;, instanciée dans la fonction &lt;tt&gt;load&lt;/tt&gt;&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;code_highlight&quot;&gt;var clusterer;&lt;/span&gt;

function load() {
  if (GBrowserIsCompatible()) {
    map = new GMap2(document.getElementById(&quot;map&quot;));
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
    map.setCenter(new GLatLng(46.85, 1.75), 6);
    &lt;span class=&quot;code_highlight&quot;&gt;clusterer = new Clusterer(map);
    clusterer.SetMaxVisibleMarkers(10);
    clusterer.SetMinMarkersPerCluster(5);&lt;/span&gt;

    GDownloadUrl(&quot;exemple10.json&quot;, setup_json);
  } else {
    alert(&quot;Desole, l&#039;API Google Maps n&#039;est pas compatible avec votre navigateur.&quot;);
  }
}&lt;/div&gt;
&lt;p&gt;Un objet &lt;tt&gt;Clusterer&lt;/tt&gt; possède 4 méthodes&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;tt&gt;SetMaxVisibleMarkers(n)&lt;/tt&gt;&lt;/strong&gt;&amp;nbsp;: définie le nombre de marqueurs au delà duquel le &lt;em&gt;clustering&lt;/em&gt; est mis en place (150 par défaut).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;tt&gt;SetMinMarkersPerCluster(n)&lt;/tt&gt;&lt;/strong&gt;&amp;nbsp;: définie le nombre minimum de marqueurs constituant un &lt;em&gt;cluster&lt;/em&gt; (5 par défaut).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;tt&gt;SetMaxLinesPerInfoBox(n)&lt;/tt&gt;&lt;/strong&gt;&amp;nbsp;: définie le nombre de ligne s&#039;affichant dans la fenêtre d&#039;information du marqueur correspondant au &lt;em&gt;cluster&lt;/em&gt; (10 par défaut).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;tt&gt;SetIcon(icon)&lt;/tt&gt;&lt;/strong&gt;&amp;nbsp;: définie l&#039;icône du marqueur correspondant au &lt;em&gt;cluster&lt;/em&gt; si celui par défaut ne convient pas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il suffit ensuite de remplacer chaque appel à &lt;tt&gt;map.addOverlay(marker)&lt;/tt&gt; par un appel à &lt;tt&gt;clusterer.AddMarker(marker, title)&lt;/tt&gt; (où &lt;tt&gt;title&lt;/tt&gt; est la ligne du marqueur réel qui s&#039;affichera dans la fenêtre d&#039;information du marqueur correspondant au &lt;em&gt;cluster&lt;/em&gt;) et chaque appel à &lt;tt&gt;map.removeOverlay(marker)&lt;/tt&gt; par un appel à &lt;tt&gt;clusterer.RemoveMarker(marker)&lt;/tt&gt;. Exemple dans la fonction &lt;tt&gt;setup_json&lt;/tt&gt;&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;setup_json = function(json, status) {
  var data = eval(&#039;(&#039; + json + &#039;)&#039;);
  
  for (var i=0; i&amp;lt;data.markers.length; i++) {
    var point = new GLatLng(data.markers[i].lat, data.markers[i].lng);
    var marker = createMarker(point, data.markers[i].html);
    &lt;span class=&quot;code_highlight&quot;&gt; clusterer.AddMarker(marker, data.markers[i].html);&lt;/span&gt;
  }

}&lt;/div&gt;
&lt;p&gt;Le résultat est visible sur l&#039;&lt;a href=&quot;/files/demos/google-maps/exemple10.html&quot; title=&quot;Voir la page d&#039;exemple&quot;&gt;exemple&amp;nbsp;10&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Cette solution permet de rendre de bons services, mais n&#039;est toute fois pas idéale. En effet, le &lt;em&gt;clustering&lt;/em&gt; est lié au nombre de marqueurs plutôt qu&#039;à leur densité. Ainsi, deux marqueurs supperposés ne seront vus que comme un seul marqueur à fort grossissement (en l&#039;absence de &lt;em&gt;clustering&lt;/em&gt;). D&#039;autre part, l&#039;algorithme n&#039;est pas très précis&amp;nbsp;: sur l&#039;&lt;a href=&quot;/files/demos/google-maps/exemple10.html&quot; title=&quot;Voir la page d&#039;exemple&quot;&gt;exemple&amp;nbsp;10&lt;/a&gt;, le marqueur placé sur Le Havre a été intégré au &lt;em&gt;cluster&lt;/em&gt; bien qu&#039;il en soit assez éloigné&amp;nbsp;!&lt;/p&gt;
&lt;p&gt;Les autres billets de cette série sur l&#039;&lt;a href=&quot;http://www.google.com/apis/maps/index.html&quot; title=&quot;Visiter le site de l&#039;API&quot; hreflang=&quot;en&quot;&gt;API Google Maps&lt;/a&gt;&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-06-10-api_google_maps_premieres_cartes&quot; title=&quot;Lire le billet&quot;&gt;API Google Maps : premières cartes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-06-21-google_maps_api_marqueurs_et_fenetres_dinformations&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : marqueurs et fenêtres d&#039;informations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-07-07-google_maps_api_affichage_des_donnees_dun_fichier_json&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : affichage des données d&#039;un fichier JSON&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-07-08-google_maps_api_geolocalisation_geocoding&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : géolocalisation (geocoding)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-07-08-google_maps_api_un_marqueur_deplacable&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : un marqueur déplaçable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-07-08-google_maps_api_coordonnees_dun_marqueur&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : coordonnées d&#039;un marqueur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-11-20-google_maps_api_gestionnaire_de_marqueurs&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : gestionnaire de marqueurs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Google Maps API : gestionnaire automatique de marqueurs&lt;/li&gt;
&lt;/ul&gt;
</description>
 <category domain="http://www.numabilis.com/blog/Ingenierie-web">Ingénierie web</category>
 <category domain="http://www.numabilis.com/blog/JavaScript">JavaScript</category>
 <category domain="http://www.numabilis.com/blog/Web-2.0">Web 2.0</category>
 <pubDate>Wed, 21 Nov 2007 20:42:00 +0100</pubDate>
</item>
<item>
 <title>Google Maps API : gestionnaire de marqueurs</title>
 <link>http://www.numabilis.com/blog/2007-11-20-google_maps_api_gestionnaire_de_marqueurs</link>
 <description>&lt;p&gt;Reprenons notre exploration de l&#039;&lt;a href=&quot;http://www.google.com/apis/maps/index.html&quot; title=&quot;Visiter le site de l&#039;API&quot; hreflang=&quot;en&quot;&gt;API Google Maps&lt;/a&gt; pour résoudre le problème suivant&amp;nbsp;: &lt;strong&gt;comment afficher un unique marqueur regroupant plusieurs marqueurs lorsque le niveau de zoom est faible&amp;nbsp;?&lt;/strong&gt; En effet, lorsque le nombre de marqueurs est très important sur une petite région, la carte est difficile à lire et lente à s&#039;afficher. La réponse semble être le gestionnaire de marqueurs &lt;a href=&quot;http://www.google.com/apis/maps/documentation/reference.html#GMarkerManager&quot; title=&quot;Lire la documentation de l&#039;API&quot; hreflang=&quot;en&quot;&gt;GMarkerManager&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Partons de l&#039;&lt;a href=&quot;/files/demos/google-maps/exemple04.html&quot; title=&quot;Voir la page d&#039;exemple&quot;&gt;exemple&amp;nbsp;4&lt;/a&gt; d&#039;un &lt;a href=&quot;/blog/2007-07-07-google_maps_api_affichage_des_donnees_dun_fichier_json&quot; title=&quot;Lire le billet&quot;&gt;précédent billet&lt;/a&gt; dans lequel nous déléguons l&#039;affichage des marqueurs à un gestionnaire de marqueurs. Pour cela, on déclare une variable &lt;tt&gt;mgr&lt;/tt&gt;, que l&#039;on instancie dans la fonction &lt;tt&gt;load&lt;/tt&gt;&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;code_highlight&quot;&gt;var mgr;&lt;/span&gt;

function load() {
  if (GBrowserIsCompatible()) {
    map = new GMap2(document.getElementById(&quot;map&quot;));
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
    map.setCenter(new GLatLng(46.85, 1.75), 6);
    &lt;span class=&quot;code_highlight&quot;&gt;mgr = new MarkerManager(map);&lt;/span&gt;

    GDownloadUrl(&quot;exemple04.json&quot;, setup_json);
  } else {
    alert(&quot;Desole, l&#039;API Google Maps n&#039;est pas compatible avec votre navigateur.&quot;);
  }
}&lt;/div&gt;
&lt;p&gt;L&#039;ajout des marqueurs se fait dans la fonctions &lt;tt&gt;setup_json&lt;/tt&gt; en créant d&#039;abord un tableau de marqueurs, &lt;tt&gt;markers&lt;/tt&gt;, ajouter en une fois à la carte via la fonction &lt;tt&gt;addMarkers&lt;/tt&gt; 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&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;setup_json = function(json, status) {
  var data = eval(&#039;(&#039; + json + &#039;)&#039;);
  &lt;span class=&quot;code_highlight&quot;&gt;var markers = new Array();&lt;/span&gt;
  
  for (var i=0; i&amp;lt;data.markers.length; i++) {
    var point = new GLatLng(data.markers[i].lat, data.markers[i].lng);
    var marker = createMarker(point, data.markers[i].html);
    &lt;span class=&quot;code_highlight&quot;&gt;markers.push(marker);&lt;/span&gt;
  }

  &lt;span class=&quot;code_highlight&quot;&gt;mgr.addMarkers(markers, 5);
  mgr.refresh();&lt;/span&gt;
}&lt;/div&gt;
&lt;p&gt;Le résultat est visible sur l&#039;&lt;a href=&quot;/files/demos/google-maps/exemple08.html&quot; title=&quot;Voir la page d&#039;exemple&quot;&gt;exemple&amp;nbsp;8&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On peut appeler plusieurs fois la méthode &lt;tt&gt;addMarkers&lt;/tt&gt; avec différents tableaux de marqueurs pour différents niveau de zoom et gérer ainsi, &lt;em&gt;à la mano&lt;/em&gt;, les regroupements de marqueurs. Cela implique donc de calculer, sur le serveur, l&#039;emplacement des marqueurs qui prendront la place d&#039;un ensemble de marqueurs et du niveau de zoom auquel on affiche chacun... Pas simple&amp;nbsp;! Heureusement il existe une solution toute faite via une librairie JavaScript... Suite au prochain épisode&amp;nbsp;!&lt;/p&gt;
&lt;p&gt;Les autres billets de cette série sur l&#039;&lt;a href=&quot;http://www.google.com/apis/maps/index.html&quot; title=&quot;Visiter le site de l&#039;API&quot; hreflang=&quot;en&quot;&gt;API Google Maps&lt;/a&gt;&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-06-10-api_google_maps_premieres_cartes&quot; title=&quot;Lire le billet&quot;&gt;API Google Maps : premières cartes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-06-21-google_maps_api_marqueurs_et_fenetres_dinformations&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : marqueurs et fenêtres d&#039;informations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-07-07-google_maps_api_affichage_des_donnees_dun_fichier_json&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : affichage des données d&#039;un fichier JSON&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-07-08-google_maps_api_geolocalisation_geocoding&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : géolocalisation (geocoding)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-07-08-google_maps_api_un_marqueur_deplacable&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : un marqueur déplaçable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-07-08-google_maps_api_coordonnees_dun_marqueur&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : coordonnées d&#039;un marqueur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Google Maps API : gestionnaire de marqueurs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-11-21-google_maps_api_gestionnaire_automatique_de_marqueurs&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : gestionnaire automatique de marqueurs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
 <category domain="http://www.numabilis.com/blog/Ingenierie-web">Ingénierie web</category>
 <category domain="http://www.numabilis.com/blog/JavaScript">JavaScript</category>
 <category domain="http://www.numabilis.com/blog/Web-2.0">Web 2.0</category>
 <pubDate>Tue, 20 Nov 2007 19:54:34 +0100</pubDate>
</item>
<item>
 <title>Google Maps API : coordonnées d&#039;un marqueur</title>
 <link>http://www.numabilis.com/blog/2007-07-08-google_maps_api_coordonnees_dun_marqueur</link>
 <description>&lt;p&gt;Ce sixième et dernier billet (pour le moment du moins) sur l&#039;&lt;a href=&quot;http://www.google.com/apis/maps/index.html&quot; title=&quot;Visiter le site de l&#039;API&quot; hreflang=&quot;en&quot;&gt;API Google Maps&lt;/a&gt; vous apprendra à récupérer les coordonnées d&#039;&lt;a href=&quot;/blog/2007-07-08-google_maps_api_un_marqueur_deplacable&quot; title=&quot;Lire le précédent billet&quot;&gt;un marqueur déplaçable&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Partons de l&#039;&lt;a href=&quot;/files/demos/google-maps/exemple06.html&quot; title=&quot;Voir la page d&#039;exemple&quot;&gt;exemple&amp;nbsp;6&lt;/a&gt; du &lt;a href=&quot;/blog/2007-07-08-google_maps_api_un_marqueur_deplacable&quot; title=&quot;Lire le cinquième billet&quot;&gt;billet précédent&lt;/a&gt;. Les coordonnées sont des propriétés du marqueur qu&#039;il suffit de récupérer à la fin d&#039;un glisser/déposer dans la fonction &lt;tt&gt;createMarker&lt;/tt&gt;&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;GEvent.addListener(marker, &quot;dragend&quot;, function() {
  htm = html + &#039;&amp;lt;br /&amp;gt;Lat_1 = &#039; + point.lat() + &#039; Lat_2 = &#039; + marker.getPoint().lat();
  htm = htm + &#039;&amp;lt;br /&amp;gt;Lng_1 = &#039; + point.lng() + &#039; Lng_2 = &#039; + marker.getPoint().lng();
  marker.openInfoWindowHtml(htm);
});&lt;/div&gt;
&lt;p&gt;Voilà&amp;nbsp;! Nous avons tout ce dont nous avons besoin pour faire un formulaire d&#039;enregistrement de coordonnées en plus de l&#039;affichage de marqueurs correspondants à des emplacements fournis sous forme de données JSON.&lt;/p&gt;
&lt;p&gt;Le résultat est visible sur l&#039;&lt;a href=&quot;/files/demos/google-maps/exemple07.html&quot; title=&quot;Voir la page d&#039;exemple&quot;&gt;exemple&amp;nbsp;7&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Les autres billets de cette série sur l&#039;&lt;a href=&quot;http://www.google.com/apis/maps/index.html&quot; title=&quot;Visiter le site de l&#039;API&quot; hreflang=&quot;en&quot;&gt;API Google Maps&lt;/a&gt;&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-06-10-api_google_maps_premieres_cartes&quot; title=&quot;Lire le billet&quot;&gt;API Google Maps : premières cartes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-06-21-google_maps_api_marqueurs_et_fenetres_dinformations&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : marqueurs et fenêtres d&#039;informations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-07-07-google_maps_api_affichage_des_donnees_dun_fichier_json&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : affichage des données d&#039;un fichier JSON&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-07-08-google_maps_api_geolocalisation_geocoding&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : géolocalisation (geocoding)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-07-08-google_maps_api_un_marqueur_deplacable&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : un marqueur déplaçable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Google Maps API : coordonnées d&#039;un marqueur&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-11-20-google_maps_api_gestionnaire_de_marqueurs&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : gestionnaire de marqueurs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-11-21-google_maps_api_gestionnaire_automatique_de_marqueurs&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : gestionnaire automatique de marqueurs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
 <category domain="http://www.numabilis.com/blog/Ingenierie-web">Ingénierie web</category>
 <category domain="http://www.numabilis.com/blog/JavaScript">JavaScript</category>
 <category domain="http://www.numabilis.com/blog/Web-2.0">Web 2.0</category>
 <pubDate>Sun, 08 Jul 2007 22:55:10 +0200</pubDate>
</item>
<item>
 <title>Google Maps API : un marqueur déplaçable</title>
 <link>http://www.numabilis.com/blog/2007-07-08-google_maps_api_un_marqueur_deplacable</link>
 <description>&lt;p&gt;Ce cinqième billet sur l&#039;&lt;a href=&quot;http://www.google.com/apis/maps/index.html&quot; title=&quot;Visiter le site de l&#039;API&quot; hreflang=&quot;en&quot;&gt;API Google Maps&lt;/a&gt; vous apprendra à créer un marqueur déplaçable par simple glisser/déposer (&lt;em&gt;drag and drop&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Partons de l&#039;&lt;a href=&quot;/files/demos/google-maps/exemple05.html&quot; title=&quot;Voir la page d&#039;exemple&quot;&gt;exemple&amp;nbsp;5&lt;/a&gt; du &lt;a href=&quot;/blog/2007-07-08-google_maps_api_geolocalisation_geocoding&quot; title=&quot;Lire le quatrième billet&quot;&gt;billet précédent&lt;/a&gt; dont nous allons simplement modifier la fonction de création de marqueur &lt;tt&gt;createMarker&lt;/tt&gt;&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;function createMarker(point,html) {
  var icon = new GIcon(G_DEFAULT_ICON);
  icon.image = &quot;http://www.numabilis.com/files/demos/google-maps/blue-dot.png&quot;;
  
  var options = {
    icon: icon,
    draggable: true
  };
  var marker = new GMarker(point, options);
  GEvent.addListener(marker, &quot;dragstart&quot;, function() {
    map.closeInfoWindow();
  });
  
  GEvent.addListener(marker, &quot;dragend&quot;, function() {
    marker.openInfoWindowHtml(html);
  });
  
  GEvent.addListener(marker, &quot;click&quot;, function() {
    marker.openInfoWindowHtml(html);
  });
  
  return marker;
}&lt;/div&gt;
&lt;p&gt;Le marqueur est donc construit en passant des options au constructeur&amp;nbsp;: l&#039;URL (absolue) d&#039;une icône (pour différencier le marqueur déplaçable des autres) et un simple booléen indiquant que le marqueur est déplaçable&amp;nbsp;! Il est également possible, comme dans cet exemple de définir des fonctions appelées au début et à la fin du déplacement.&lt;/p&gt;
&lt;p&gt;Le résultat est visible sur l&#039;&lt;a href=&quot;/files/demos/google-maps/exemple06.html&quot; title=&quot;Voir la page d&#039;exemple&quot;&gt;exemple&amp;nbsp;6&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Les autres billets de cette série sur l&#039;&lt;a href=&quot;http://www.google.com/apis/maps/index.html&quot; title=&quot;Visiter le site de l&#039;API&quot; hreflang=&quot;en&quot;&gt;API Google Maps&lt;/a&gt;&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-06-10-api_google_maps_premieres_cartes&quot; title=&quot;Lire le billet&quot;&gt;API Google Maps : premières cartes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-06-21-google_maps_api_marqueurs_et_fenetres_dinformations&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : marqueurs et fenêtres d&#039;informations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-07-07-google_maps_api_affichage_des_donnees_dun_fichier_json&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : affichage des données d&#039;un fichier JSON&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-07-08-google_maps_api_geolocalisation_geocoding&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : géolocalisation (geocoding)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Google Maps API : un marqueur déplaçable&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-07-08-google_maps_api_coordonnees_dun_marqueur&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : coordonnées d&#039;un marqueur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-11-20-google_maps_api_gestionnaire_de_marqueurs&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : gestionnaire de marqueurs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-11-21-google_maps_api_gestionnaire_automatique_de_marqueurs&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : gestionnaire automatique de marqueurs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
 <category domain="http://www.numabilis.com/blog/Ingenierie-web">Ingénierie web</category>
 <category domain="http://www.numabilis.com/blog/JavaScript">JavaScript</category>
 <category domain="http://www.numabilis.com/blog/Web-2.0">Web 2.0</category>
 <pubDate>Sun, 08 Jul 2007 19:02:32 +0200</pubDate>
</item>
<item>
 <title>Google Maps API : géolocalisation (geocoding)</title>
 <link>http://www.numabilis.com/blog/2007-07-08-google_maps_api_geolocalisation_geocoding</link>
 <description>&lt;p&gt;Ce quatrième billet sur l&#039;&lt;a href=&quot;http://www.google.com/apis/maps/index.html&quot; title=&quot;Visiter le site de l&#039;API&quot; hreflang=&quot;en&quot;&gt;API Google Maps&lt;/a&gt; vous apprendra à afficher la carte d&#039;un lieu à partir de son adresse. C&#039;est ce que l&#039;on nomme &lt;a href=&quot;http://www.google.com/apis/maps/documentation/services.html#Geocoding&quot; title=&quot;Lire la documentation de l&#039;API&quot; hreflang=&quot;en&quot;&gt;geocoding&lt;/a&gt; dans l&#039;API, opération réalisée grâce à un objet JavaScript, le &lt;a href=&quot;http://www.google.com/apis/maps/documentation/reference.html#GClientGeocoder&quot; title=&quot;Lire le détail de l&#039;API du geocoder&quot; hreflang=&quot;en&quot;&gt;geocoder&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Partons de l&#039;&lt;a href=&quot;/files/demos/google-maps/exemple04.html&quot; title=&quot;Voir la page d&#039;exemple&quot;&gt;exemple&amp;nbsp;4&lt;/a&gt; du &lt;a href=&quot;/blog/2007-07-07-google_maps_api_affichage_des_donnees_dun_fichier_json&quot; title=&quot;Lire le troisième billet&quot;&gt;billet précédent&lt;/a&gt; auquel nous ajoutons la variable globale &lt;tt&gt;geocoder&lt;/tt&gt;. Le chargement du fichier JSON est remplacé par l&#039;instanciation du geocoder dans la fonction &lt;tt&gt;load&lt;/tt&gt;&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;var geocoder;

function load() {
  if (GBrowserIsCompatible()) {
    map = new GMap2(document.getElementById(&quot;map&quot;));
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
    map.setCenter(new GLatLng(46.85, 1.75), 6);
    &lt;span class=&quot;code_highlight&quot;&gt;geocoder = new GClientGeocoder();&lt;/span&gt;
  } else {
    alert(&quot;Desole, l&#039;API Google Maps n&#039;est pas compatible avec votre navigateur.&quot;);
  }
}&lt;/div&gt;
&lt;p&gt;Nous ajoutons à la page un formulaire permettant la saisie de l&#039;adresse cherchée. La validation du formulaire est interceptée par la fonction &lt;tt&gt;geocode&lt;/tt&gt; qui prend en paramètre l&#039;adresse saisie&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;&amp;lt;form &lt;span class=&quot;code_highlight&quot;&gt;onsubmit=&quot;return geocode(this.address.value);&quot;&lt;/span&gt;&amp;gt;
  Adresse : &amp;lt;input type=&quot;text&quot; size=&quot;80&quot; name=&quot;address&quot; /&amp;gt;
  &amp;lt;input type=&quot;submit&quot; value=&quot;GO&quot; /&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/div&gt;
&lt;p&gt;Cette fonction &lt;tt&gt;geocode&lt;/tt&gt;, qui va faire tout le travail, est extrêmement simple&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;function geocode(address) {
  geocoder.getLatLng(
    address,
    function(point) {
      if (!point) {
        alert(address + &quot; not found&quot;);
      } else {
        map.setCenter(point, 13);
        var marker = createMarker(point, address);
        map.addOverlay(marker);
        marker.openInfoWindowHtml(address);
      }
    }
  );
  
  return false;
}&lt;/div&gt;
&lt;p&gt;Elle consiste à appeler la fonction &lt;tt&gt;getLatLng&lt;/tt&gt; du &lt;tt&gt;geocoder&lt;/tt&gt; en lui passant en paramètre l&#039;adresse saisie et une fonction appelée par le &lt;tt&gt;geocoder&lt;/tt&gt; au retour de la requête HTTP. En cas de succès, on centre la carte sur le point correspondant à l&#039;adresse, on créé un marqueur que l&#039;on ajoute sur la carte et on affiche la fenêtre d&#039;information.&lt;/p&gt;
&lt;p&gt;Le résultat est visible sur l&#039;&lt;a href=&quot;/files/demos/google-maps/exemple05.html&quot; title=&quot;Voir la page d&#039;exemple&quot;&gt;exemple&amp;nbsp;5&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Les autres billets de cette série sur l&#039;&lt;a href=&quot;http://www.google.com/apis/maps/index.html&quot; title=&quot;Visiter le site de l&#039;API&quot; hreflang=&quot;en&quot;&gt;API Google Maps&lt;/a&gt;&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-06-10-api_google_maps_premieres_cartes&quot; title=&quot;Lire le billet&quot;&gt;API Google Maps : premières cartes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-06-21-google_maps_api_marqueurs_et_fenetres_dinformations&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : marqueurs et fenêtres d&#039;informations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-07-07-google_maps_api_affichage_des_donnees_dun_fichier_json&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : affichage des données d&#039;un fichier JSON&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Google Maps API : géolocalisation (geocoding)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.numabilis.com/blog/2007-07-08-google_maps_api_un_marqueur_deplacable&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : un marqueur déplaçable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-07-08-google_maps_api_coordonnees_dun_marqueur&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : coordonnées d&#039;un marqueur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-11-20-google_maps_api_gestionnaire_de_marqueurs&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : gestionnaire de marqueurs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-11-21-google_maps_api_gestionnaire_automatique_de_marqueurs&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : gestionnaire automatique de marqueurs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
 <category domain="http://www.numabilis.com/blog/Ingenierie-web">Ingénierie web</category>
 <category domain="http://www.numabilis.com/blog/JavaScript">JavaScript</category>
 <category domain="http://www.numabilis.com/blog/Web-2.0">Web 2.0</category>
 <pubDate>Sun, 08 Jul 2007 14:55:14 +0200</pubDate>
</item>
<item>
 <title>Google Maps API : affichage des données d&#039;un fichier JSON</title>
 <link>http://www.numabilis.com/blog/2007-07-07-google_maps_api_affichage_des_donnees_dun_fichier_json</link>
 <description>&lt;p&gt;Ce troisième billet sur l&#039;&lt;a href=&quot;http://www.google.com/apis/maps/index.html&quot; title=&quot;Visiter le site de l&#039;API&quot; hreflang=&quot;en&quot;&gt;API Google Maps&lt;/a&gt; vous apprendra à afficher des données distantes au format &lt;a href=&quot;http://www.json.org/jsonfr.html&quot; title=&quot;Lire la présentation de la notation objet de JavaScript&quot; hreflang=&quot;fr&quot;&gt;JSON&lt;/a&gt; (produites dynamiquement par un serveur par exemple). L&#039;API peut utiliser le format XML. Je préfère cependant utiliser le format JSON, plus compact et plus rapide à traiter en JavaScript, mais aussi plus complexe.&lt;/p&gt;
&lt;p&gt;Partons de l&#039;&lt;a href=&quot;/files/demos/google-maps/exemple03.html&quot; title=&quot;Voir la page d&#039;exemple&quot;&gt;exemple&amp;nbsp;3&lt;/a&gt; du &lt;a href=&quot;/blog/2007-06-21-google_maps_api_marqueurs_et_fenetres_dinformations&quot; title=&quot;Lire le second billet&quot;&gt;billet précédent&lt;/a&gt; dont nous supprimons la création du marqueur lors du chargement de la page (fonction &lt;tt&gt;load&lt;/tt&gt;) pour la remplacer par un appel à la fonction &lt;tt&gt;GDownloadUrl&lt;/tt&gt;. Cette fonction permet de charger une ressource de manière asynchrone et prends deux paramètres&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;tt&gt;&lt;strong&gt;url&lt;/strong&gt;&lt;/tt&gt;&amp;nbsp;: l&#039;URL de la ressource, &lt;a href=&quot;/files/demos/google-maps/exemple04.json&quot; title=&quot;Voir le fichier JSON utilisé pour ce tutoriel&quot;&gt;&lt;tt&gt;exemple04.json&lt;/tt&gt;&lt;/a&gt; dans notre exemple.&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;&lt;strong&gt;onload&lt;/strong&gt;&lt;/tt&gt;&amp;nbsp;: la fonction à appeler après le chargement de la ressource. Cette fonction doit avoir deux paramètres&amp;nbsp;:
&lt;ul&gt;
&lt;li&gt;&lt;tt&gt;&lt;strong&gt;text&lt;/strong&gt;&lt;/tt&gt;&amp;nbsp;: le texte du document téléchargé.&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;&lt;strong&gt;status&lt;/strong&gt;&lt;/tt&gt;&amp;nbsp;: le code du statut de la réponse HTTP.&lt;/li&gt;
&lt;/ul&gt;
En cas de &lt;em&gt;timeout&lt;/em&gt; de la requête, la fonction est appelée avec &lt;tt&gt;null&lt;/tt&gt; et &lt;tt&gt;-1&lt;/tt&gt; comme arguments.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nous avons donc la fonction &lt;tt&gt;load&lt;/tt&gt; suivante&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;function load() {
  if (GBrowserIsCompatible()) {
    map = new GMap2(document.getElementById(&quot;map&quot;));
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
    map.setCenter(new GLatLng(46.85, 1.75), 6);
    
    GDownloadUrl(&quot;exemple04.json&quot;, setup_json);
  } else {
    alert(&quot;Desole, l&#039;API Google Maps n&#039;est pas compatible avec votre navigateur.&quot;);
  }
}&lt;/div&gt;
&lt;p&gt;Notons au passage que la vairable &lt;tt&gt;map&lt;/tt&gt; a été sortie de la fonction afin de la rendre globale et de pouvoir y accéder dans la fonction &lt;tt&gt;set_json&lt;/tt&gt;&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;setup_json = function(json, status) {
  var data = eval(&#039;(&#039; + json + &#039;)&#039;);
  
  for (var i=0; i&amp;lt;data.markers.length; i++) {
    var point = new GLatLng(data.markers[i].lat, data.markers[i].lng);
    var marker = createMarker(point, data.markers[i].html);
    map.addOverlay(marker);
  }
}&lt;/div&gt;
&lt;p&gt;Le résultat est visible sur l&#039;&lt;a href=&quot;/files/demos/google-maps/exemple04.html&quot; title=&quot;Voir la page d&#039;exemple&quot;&gt;exemple&amp;nbsp;4&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Plus de précisions : &lt;a href=&quot;http://econym.googlepages.com/basic12.htm&quot; title=&quot;Lire le tutorial&quot; hreflang=&quot;en&quot;&gt;Data in JSON files&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Les autres billets de cette série sur l&#039;&lt;a href=&quot;http://www.google.com/apis/maps/index.html&quot; title=&quot;Visiter le site de l&#039;API&quot; hreflang=&quot;en&quot;&gt;API Google Maps&lt;/a&gt;&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-06-10-api_google_maps_premieres_cartes&quot; title=&quot;Lire le billet&quot;&gt;API Google Maps : premières cartes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-06-21-google_maps_api_marqueurs_et_fenetres_dinformations&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : marqueurs et fenêtres d&#039;informations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Google Maps API : affichage des données d&#039;un fichier JSON&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;/blog/2007-07-08-google_maps_api_geolocalisation_geocoding&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : géolocalisation (geocoding)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.numabilis.com/blog/2007-07-08-google_maps_api_un_marqueur_deplacable&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : un marqueur déplaçable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-07-08-google_maps_api_coordonnees_dun_marqueur&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : coordonnées d&#039;un marqueur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-11-20-google_maps_api_gestionnaire_de_marqueurs&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : gestionnaire de marqueurs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-11-21-google_maps_api_gestionnaire_automatique_de_marqueurs&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : gestionnaire automatique de marqueurs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
 <category domain="http://www.numabilis.com/blog/Ingenierie-web">Ingénierie web</category>
 <category domain="http://www.numabilis.com/blog/JavaScript">JavaScript</category>
 <category domain="http://www.numabilis.com/blog/Web-2.0">Web 2.0</category>
 <pubDate>Sat, 07 Jul 2007 13:47:49 +0200</pubDate>
</item>
<item>
 <title>Google Maps API : marqueurs et fenêtres d&#039;informations</title>
 <link>http://www.numabilis.com/blog/2007-06-21-google_maps_api_marqueurs_et_fenetres_dinformations</link>
 <description>&lt;p&gt;Ce second billet vous apprendra à ajouter des marqueurs affichant une fenêtre d&#039;information lorsque l&#039;on clique dessus.&lt;/p&gt;
&lt;p&gt;Partons de l&#039;&lt;a href=&quot;/files/demos/google-maps/exemple02.html&quot; title=&quot;Voir la page d&#039;exemple&quot;&gt;exemple&amp;nbsp;2&lt;/a&gt; du &lt;a href=&quot;/blog/2007-06-10-api_google_maps_premieres_cartes&quot; title=&quot;Lire le premier billet&quot;&gt;billet précédent&lt;/a&gt; auquel nous ajoutons le bloc suivant dans le corps, afin de pr&amp;eacute;venir les utilisateurs ne disposant pas de JavaScript&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;&amp;lt;noscript&amp;gt;
  &amp;lt;b&amp;gt;JavaScript doit &amp;ecirc;tre activ&amp;eacute; pour utiliser Google Maps.&amp;lt;/b&amp;gt;
  Il semblerait que JavaScript soit d&amp;eacute;sactiv&amp;eacute; ou non support&amp;eacute; par votre navigateur.
  Pour visualiser les cartes Google Maps, activez JavaScript dans les options de votre navigateur et r&amp;eacute;essayez.
&amp;lt;/noscript&amp;gt;
&lt;/div&gt;
&lt;p&gt;Pr&amp;eacute;venons aussi les utilisateurs dont le navigateur n&#039;est pas compatible avec l&#039;API Google Maps en définissant la clause &lt;tt&gt;else&lt;/tt&gt; du test de compatibilit&amp;eacute; dans la fonction &lt;tt&gt;load&lt;/tt&gt;&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;if (GBrowserIsCompatible()) {
  // ...
} else {
  alert(&quot;Desole, l&#039;API Google Maps n&#039;est pas compatible avec votre navigateur.&quot;);
}
&lt;/div&gt;
&lt;p&gt;Ajoutons ensuite, lors de la création de la carte, dans la fonction &lt;tt&gt;load&lt;/tt&gt;, l&#039;affichage du contrôle de positionnement et de zoom&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;map.addControl(new GLargeMapControl());&lt;/div&gt;
&lt;p&gt;ainsi que le contrôle du type de carte (plan, satellite ou mixte)&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;map.addControl(new GMapTypeControl());&lt;/div&gt;
&lt;p&gt;Définissons un premier marqueur sur &lt;a href=&quot;http://fr.wikipedia.org/wiki/Mantes-la-Jolie&quot; title=&quot;Voir la page Wikipédia sur Mantes-la-Jolie&quot; hreflang=&quot;fr&quot;&gt;Mantes-la-Jolie&lt;/a&gt; (de coordonnées 48.9908338, 1.717222)&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;var point = new GLatLng(48.9908338,1.717222);
var marker = createMarker(point,&#039;Ici, c\&#039;est chez moi&amp;nbsp;!&#039;)
map.addOverlay(marker);
&lt;/div&gt;
&lt;p&gt;La fonction &lt;tt&gt;createMarker&lt;/tt&gt; est la suivante&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;function createMarker(point,html) {
  var marker = new GMarker(point);
  GEvent.addListener(marker, &quot;click&quot;, function() {
    marker.openInfoWindowHtml(html);
  });

  return marker;
}
&lt;/div&gt;
&lt;p&gt;Le résultat est visible sur l&#039;&lt;a href=&quot;/files/demos/google-maps/exemple03.html&quot; title=&quot;Voir la page d&#039;exemple&quot;&gt;exemple&amp;nbsp;3&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;La fenêtre d&#039;information affiche du HTML standard et il est possible de définir autant de marqueur que l&#039;on souhaite...&lt;/p&gt;
&lt;p&gt;Plus de précisions : &lt;a href=&quot;http://econym.googlepages.com/basic1.htm&quot; title=&quot;Lire le tutorial&quot; hreflang=&quot;en&quot;&gt;Markers and info windows&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Les autres billets de cette série sur l&#039;&lt;a href=&quot;http://www.google.com/apis/maps/index.html&quot; title=&quot;Visiter le site de l&#039;API&quot; hreflang=&quot;en&quot;&gt;API Google Maps&lt;/a&gt;&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-06-10-api_google_maps_premieres_cartes&quot; title=&quot;Lire le billet&quot;&gt;API Google Maps : premières cartes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Google Maps API : marqueurs et fenêtres d&#039;informations&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-07-07-google_maps_api_affichage_des_donnees_dun_fichier_json&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : affichage des données d&#039;un fichier JSON&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;/blog/2007-07-08-google_maps_api_geolocalisation_geocoding&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : géolocalisation (geocoding)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.numabilis.com/blog/2007-07-08-google_maps_api_un_marqueur_deplacable&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : un marqueur déplaçable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-07-08-google_maps_api_coordonnees_dun_marqueur&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : coordonnées d&#039;un marqueur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-11-20-google_maps_api_gestionnaire_de_marqueurs&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : gestionnaire de marqueurs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-11-21-google_maps_api_gestionnaire_automatique_de_marqueurs&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : gestionnaire automatique de marqueurs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
 <category domain="http://www.numabilis.com/blog/Ingenierie-web">Ingénierie web</category>
 <category domain="http://www.numabilis.com/blog/JavaScript">JavaScript</category>
 <category domain="http://www.numabilis.com/blog/Web-2.0">Web 2.0</category>
 <pubDate>Thu, 21 Jun 2007 19:27:09 +0200</pubDate>
</item>
<item>
 <title>API Google Maps : premières cartes</title>
 <link>http://www.numabilis.com/blog/2007-06-10-api_google_maps_premieres_cartes</link>
 <description>&lt;p&gt;Je me lance dans la découverte de l&#039;&lt;a href=&quot;http://www.google.com/apis/maps/index.html&quot; title=&quot;Visiter le site de l&#039;API&quot; hreflang=&quot;en&quot;&gt;API Google Maps&lt;/a&gt; et en profite pour rédiger une série de billets sur le sujet. Voici le premier tutoriel permettant de débuter dont la plupart des informations viennent de ce &lt;a href=&quot;http://econym.googlepages.com/index.htm&quot; title=&quot;Visiter la page du tutorial&quot; hreflang=&quot;en&quot;&gt;Google Maps API Tutorial&lt;/a&gt; de Mike Williams.&lt;/p&gt;

&lt;p&gt;Avant toute chose, il faut disposer d&#039;un &lt;a href=&quot;http://www.google.com/accounts/&quot; title=&quot;Créer un comte Google&quot; hreflang=&quot;fr&quot;&gt;compte Google&lt;/a&gt; car Google ne donne accès à son service qu&#039;à travers une clé d&#039;identification fournie aux seuls possesseurs de compte Google.&lt;/p&gt;

&lt;p&gt;Disposant d&#039;un compte Google, vous devez ensuite, &lt;a href=&quot;http://www.google.com/apis/maps/signup.html&quot; title=&quot;Allez sur la page de création de la clé&quot; hreflang=&quot;en&quot;&gt;générer la clé d&#039;identification&lt;/a&gt; valable pour une URL donnée (et toutes ses sous URL) et qui devra être communiquée à chaque requête. La validation du formulaire vous donne&amp;nbsp;:&lt;/p&gt;
&lt;p&gt;Une clé du genre&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;ABQIAAAA1x2klffHrefUjPpt9uu-YRSFwTc1YMYqORShagowwmhC3WCZJBTJ7YUSLR4rEGMAxpz2Jm54o0aACw
&lt;/div&gt;

&lt;p&gt;et le code d&#039;une page permettant de tester le service avec cette clé&amp;nbsp:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;&amp;lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot;
  &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&amp;gt;
&amp;lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&amp;gt;
  &amp;lt;head&amp;gt;&lt;!li&gt;&lt;a href=&quot;/blog/2007-07-08-google_maps_api_coordonnees_dun_marqueur&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : coordonnées d&#039;un marqueur&lt;/a&gt;&lt;/li&gt;
    &amp;lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=utf-8&quot;/&amp;gt;
    &amp;lt;title&amp;gt;Google Maps JavaScript API Example&amp;lt;/title&amp;gt;
    &amp;lt;script src=&quot;http://maps.google.com/maps?file=api&amp;amp;v=2&amp;amp;key=ABQIAAAA1x2klffHrefUjPpt9uu-YRSFwTc1YMYqORShagowwmhC3WCZJBTJ7YUSLR4rEGMAxpz2Jm54o0aACw&quot;
      type=&quot;text/javascript&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;

    //&amp;lt;![CDATA[

    function load() {
      if (GBrowserIsCompatible()) {
        var map = new GMap2(document.getElementById(&quot;map&quot;));
        map.setCenter(new GLatLng(37.4419, -122.1419), 13);
      }
    }

    //]]&amp;gt;
    &amp;lt;/script&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body onload=&quot;load()&quot; onunload=&quot;GUnload()&quot;&amp;gt;
    &amp;lt;div id=&quot;map&quot; style=&quot;width: 500px; height: 300px&quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/div&gt;

&lt;p&gt;Le résultat de cette page ressemble à cet &lt;a href=&quot;/files/demos/google-maps/exemple01.html&quot; title=&quot;Voir la page d&#039;exemple&quot;&gt;exemple&amp;nbsp;1&lt;/a&gt;. Le code source est assez limpide et simple à modifier pour centrer la carte sur la France avec un facteur de zoom adapté à la taille du &lt;tt&gt;div&lt;/tt&gt;. Pour cela il suffit de modifier la ligne suivante&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;        map.setCenter(new GLatLng(37.4419, -122.1419), 13);
&lt;/div&gt;
&lt;p&gt;en fournissant latitude, longitude et facteur de zoom voulus&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;        map.setCenter(new GLatLng(46.85, 1.75), 6);
&lt;/div&gt;
&lt;p&gt;J&#039;utilise aussi un &lt;tt&gt;div&lt;/tt&gt; de taille supérieure&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;&amp;lt;div id=&quot;map&quot; style=&quot;width: 650px; height: 650px&quot;&amp;gt;&amp;lt;/div&amp;gt;
&lt;/div&gt;
&lt;p&gt;Le résultat est visible sur l&#039;&lt;a href=&quot;/files/demos/google-maps/exemple02.html&quot; title=&quot;Voir la page d&#039;exemple&quot;&gt;exemple&amp;nbsp;2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Plus de détails sur &lt;a href=&quot;http://econym.googlepages.com/wizard.htm&quot; title=&quot;Lire le tutoriel de Mike Williams&quot; hreflang=&quot;en&quot;&gt;Instant maps with the Google Wizard&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Les autres billets de cette série sur l&#039;&lt;a href=&quot;http://www.google.com/apis/maps/index.html&quot; title=&quot;Visiter le site de l&#039;API&quot; hreflang=&quot;en&quot;&gt;API Google Maps&lt;/a&gt;&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;API Google Maps : premières cartes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-06-21-google_maps_api_marqueurs_et_fenetres_dinformations&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : marqueurs et fenêtres d&#039;informations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-07-07-google_maps_api_affichage_des_donnees_dun_fichier_json&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : affichage des données d&#039;un fichier JSON&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;/blog/2007-07-08-google_maps_api_geolocalisation_geocoding&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : géolocalisation (geocoding)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.numabilis.com/blog/2007-07-08-google_maps_api_un_marqueur_deplacable&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : un marqueur déplaçable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-07-08-google_maps_api_coordonnees_dun_marqueur&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : coordonnées d&#039;un marqueur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-11-20-google_maps_api_gestionnaire_de_marqueurs&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : gestionnaire de marqueurs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2007-11-21-google_maps_api_gestionnaire_automatique_de_marqueurs&quot; title=&quot;Lire le billet&quot;&gt;Google Maps API : gestionnaire automatique de marqueurs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
 <category domain="http://www.numabilis.com/blog/Ingenierie-web">Ingénierie web</category>
 <category domain="http://www.numabilis.com/blog/JavaScript">JavaScript</category>
 <category domain="http://www.numabilis.com/blog/Web-2.0">Web 2.0</category>
 <pubDate>Sun, 10 Jun 2007 15:08:59 +0200</pubDate>
</item>
<item>
 <title>Héritage en JavaScript</title>
 <link>http://www.numabilis.com/blog/2006-12-12-heritage_en_javascript</link>
 <description>&lt;p&gt;Comment faire hériter une &lt;em&gt;classe&lt;/em&gt; &lt;code&gt;Book&lt;/code&gt; d&#039;une &lt;em&gt;classe&lt;/em&gt; &lt;code&gt;Item&lt;/code&gt; en JavaScript&amp;nbsp;?&lt;/p&gt;
&lt;p&gt;La classe &lt;code&gt;Item&lt;/code&gt; possède deux propriétés (&lt;code&gt;id&lt;/code&gt; et &lt;code&gt;price&lt;/code&gt;), deux méthodes pour lire ces propriétés (&lt;code&gt;getId&lt;/code&gt; et &lt;code&gt;getPrice&lt;/code&gt;) et une méthode pour obtenir une représentation de l&#039;objet sous forme d&#039;une chaîne de caractères (&lt;code&gt;toString&lt;/code&gt;)&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;function Item(id, price) {
  this.id = id;
  this.price = price;
}
Item.prototype.getId = function() {
  return this.id;
}
Item.prototype.getPrice = function() {
  return this.price;
}
Item.prototype.toString = function() {
  return &quot;Item[id=&quot;+this.getId()+&quot;,price=&quot;+this.getPrice()+&quot;]&quot;;
}&lt;/div&gt;
&lt;p&gt;Une méthode classique d&#039;&lt;a href=&quot;http://www.aidejavascript.com/article68.html &quot; title=&quot;Lire l&#039;article décrivant en détail cette méthode&quot; hreflang=&quot;fr&quot;&gt;héritage en Javascript&lt;/a&gt; est dite par prototypage&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;Book.prototype = new Item;
function Book(id, price, title) {
  this.super = Item;
  this.super(id, price);
  this.title = title;
}
Book.prototype.getTitle = function() {
  return this.title;
}
Book.prototype.toString = function() {
  return &quot;Book[id=&quot;+this.getId()+&quot;,price=&quot;+this.getPrice()+&quot;,title=&quot;+this.getTitle()+&quot;]&quot;;
}
&lt;/div&gt;
&lt;p&gt;Ainsi, le code suivant&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;var myBook = new Book(1001, 10.5, &quot;The definitive JS Guide&quot;);
alert(myBook);
&lt;/div&gt;
&lt;p&gt;provoquera l&#039;affichage de la chaîne de caractères&amp;nbsp: &lt;code&gt;Book[id=1001,price=10.5,title=The definitive JS Guide]&lt;/code&gt;. Parfait&amp;nbsp;! Mais l&#039;article de Douglas Crockford intitulé &lt;a href=&quot; http://javascript.crockford.com/prototypal.html&quot; title=&quot;Lire l&#039;article&quot; hreflang=&quot;en&quot;&gt;Prototypal Inheritance in JavaScript&lt;/a&gt; m&#039;a inspiré une autre méthode pour définir de manière automatique et dynamique la fonction &lt;code&gt;Book&lt;/code&gt;. Pour cela on écrit une fonction &lt;code&gt;inherit&lt;/code&gt; prenant la &lt;em&gt;classe&lt;/em&gt; de base en paramètre et renvoyant la fonction définissant la &lt;em&gt;sous-classe&lt;/em&gt;. Cette fonction&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Détermine le nombre et le noms des arguments du constructeur de la &lt;em&gt;classe&lt;/em&gt; de base (&lt;code&gt;args&lt;/code&gt;) par un mécanisme mimant l&#039;introspection,&lt;/li&gt;
&lt;li&gt;Construit une chaîne de caractère (&lt;code&gt;str&lt;/code&gt;) dont l&#039;évaluation définira la fonction faisant appel au constructeur de la &lt;em&gt;classe&lt;/em&gt; de base avec les bons paramètres.&lt;/li&gt;
&lt;li&gt;Copie tous les attributs et toutes les fonctions de la &lt;em&gt;classe&lt;/em&gt; de base dans la &lt;em&gt;classe&lt;/em&gt; dérivée.&lt;/li&gt;
&lt;li&gt;Retourne la fonction&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;code&quot;&gt;function inherit(super) {
  var introspect = &#039;&#039; + super;
  introspect = introspect.substring (introspect.indexOf(&#039;(&#039;)+1);
  introspect = introspect.substring(0, introspect.indexOf(&#039;)&#039;));
  var args = introspect.explode(&#039;,&#039;);

  var str = &quot;new Function(&quot;;
  for(var i = 0; i &lt; args.length ; i++) {
    str += &quot;\&quot;&quot;+args[i]+&quot;\&quot;, &quot;;
  }
  str += &quot;\&quot;this.super=\&quot;+super+\&quot;;this.super(&quot;;
  for(var i = 0; i &lt; args.length; i++) {
    str += &quot;&quot;+args[i];
    if(i &lt; args.length-1) {
      str += &quot;, &quot;;
    }
  }
  str += &quot;);\&quot;);&quot;;
  F = eval(str);
  for (property in super) {
    F[property] = super[property];
  }

  return F;
}
&lt;/div&gt;
&lt;p&gt;Ce code s&#039;appuie sur les extensions &lt;code&gt;trim&lt;/code&gt; et &lt;code&gt;explode&lt;/code&gt; apportées à l&#039;objet &lt;code&gt;String&lt;/code&gt;&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;String.prototype.trim = function() {
  return this.replace(/(^\s*)|(\s*$)/g,&#039;&#039;);
}

String.prototype.explode = function(delim) {
  var exploded = new Array();
  var copy = this;
  var i = copy.indexOf(delim);
  while(i&gt;0) {
    extracted = copy.substring(0, i);
    copy = copy.substring(i+1);
    exploded.push (extracted.trim());
    i = copy.indexOf(delim);
  }
  exploded.push(copy.trim());

  return exploded;
}
&lt;/div&gt;
&lt;p&gt;Le constructeur étant défini automatiquement, on ne peut pas lui ajouter des paramètres spécifiques à la &lt;em&gt;sous-classe&lt;/em&gt; (&lt;code&gt;title&lt;/code&gt; par exemple). L&#039;initialisation de l&#039;objet dérivé doit donc se terminer à l&#039;extérieur du constructeur&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;Book = inherit(Item);
Book.prototype.title = &quot;&quot;;
Book.prototype.getTitle = function() {
  return this.title;
}
Book.prototype.toString = function() {
  return &quot;Book[id=&quot;+this.getId()+&quot;,price=&quot;+this.getPrice()+&quot;,title=&quot;+this.getTitle()+&quot;]&quot;;
}
&lt;/div&gt;
&lt;p&gt;Le code suivant&amp;nbsp;:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;var myBook = new Book(1001, 10.5);
myBook.title = &quot;The definitive JS Guide&quot;;
alert(myBook);
&lt;/div&gt;
&lt;p&gt;provoquera l&#039;affichage de la chaîne de caractères&amp;nbsp: &lt;code&gt;Book[id=1001,price=10.5,title=The definitive JS Guide]&lt;/code&gt; comme précédemment.&lt;/p&gt;
&lt;p&gt;Il serait possible d&#039;étendre ce mécanisme en ajoutant des paramètres à la fonction &lt;code&gt;inherit&lt;/code&gt; afin d&#039;avoir un constructeur prenant plus de paramètres que le constructeur de base. Un des paramètres serait un bout de code à exécuter pour finir l&#039;initialisation de l&#039;objet dérivé. Mais cela aurait-il un intérêt&amp;nbsp;?&lt;/p&gt;
&lt;p&gt;Si l&#039;on met de côté le fait que la définition de fonction à l&#039;aide de la fonction &lt;code&gt;Function&lt;/code&gt; et l&#039;utilisation de la fonction &lt;code&gt;eval&lt;/code&gt; sont fortement déconseillées, cette méthode est amusante, non&amp;nbsp;?&lt;/p&gt;
</description>
 <category domain="http://www.numabilis.com/blog/Ingenierie-web">Ingénierie web</category>
 <category domain="http://www.numabilis.com/blog/JavaScript">JavaScript</category>
 <pubDate>Tue, 12 Dec 2006 21:54:41 +0100</pubDate>
</item>
</channel>
</rss>
