Google Maps Api cz.4
W tej części przybliżę zdarzenia oraz geokodowanie. Kod z poprzednich części będzie rozbudowywany. Zdarzenia w Google Maps API otwierają przed nami wiele ciekawych możliwości. Nie sposób opisać tutaj wszystkich dostępnych zdarzeń dla różnych obiektów. Przedstawię zdarzenia na przykładzie prostej aplikacji. Rejestruje ona współrzędne położenia markera w momencie zakończenia jego przeciągania i wyświetla te współrzędne w odpowiednich znacznikach div. Zdarzenia obsługuje się za pomocą metody addListener() obiektu GEvent. Dodajmy na końcu funkcji createMarkerDrag() dodatkowy kod obsługujący zdarzenie. Teraz funkcja wygląda następująco:
function createMarkerDrag(punkt,tresc) { var marker = new GMarker(punkt,{title: 'Najechałeś na mnie myszką', draggable: true, icon: ikonka}); GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(tresc); }); GEvent.addListener(marker, "dragend", function() { var coord = marker.getPoint(); var x = coord.x; var y = coord.y; document.getElementById("coord_x").firstChild.nodeValue = x; document.getElementById("coord_y").firstChild.nodeValue = y; }); map.addOverlay(marker); }Wewnątrz body umieśćmy dwa znaczniki div. W nich wyświetlać się będą współrzędne punktu wyznaczonego przez marker. Funkcja addListener() przyjmuje trzy parametry: obiekt, do którego przypisujemy zdarzenie, ciąg znaków określający rodzaj zdarzenia (np. dragend, click, dblclick) oraz funkcję, która ma być wywołana w momencie zajścia zdarzenia. Pełny spis zdarzeń dostępnych dla poszczególnych obiektów można znaleźć w dokumentacji. My wykorzystamy zdarzenia dragend. Oznacza ono zakończenie przeciągania markera. Funkcja obsługująca zdarzenie najpierw pobiera punkt z markera (marker.getPoint()), a następnie rozkłada go na współrzędne x i y. Ostatnią czynnością jest wstawienie współrzędnych do wcześniej przygotowanych divów. Dodajmy jeszcze dla naszego markera efekt mouseover i mouseout. Do funkcji wystarczy dopisać:
GEvent.addListener(marker, "mouseover", function() { marker.setImage("custom_marker2.png"); }); GEvent.addListener(marker, "mouseout", function() { marker.setImage("custom_marker.png"); });Pierwsze zdarzenie podmieni obrazek markera na plik custom_marker2.png po najechaniu na niego myszką, drugie przywróci poprzedni obrazek po zjechaniu z markera. Pełny kod pliku:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"/> <title>Pierwsza mapa</title> <script src="http://maps.google.com/maps?file=api&v=2&sensor=false&key=KEY" type="text/javascript"></script> <script type="text/javascript"> //<![CDATA[ function init() { if (GBrowserIsCompatible()) { var map = new GMap2(document.getElementById("mapa")); map.addControl(new GLargeMapControl()); map.addControl(new GMapTypeControl()); map.setCenter(new GLatLng(51.7592485,19.4559833),7); function createMarker(punkt,tresc) { var marker = new GMarker(punkt); GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(tresc); }); map.addOverlay(marker); } // deklaracja nowej ikony var ikonka = new GIcon(); ikonka.image = "custom_marker.png"; ikonka.iconAnchor = new GPoint(16, 32); ikonka.shadow = ""; ikonka.infoWindowAnchor = new GPoint(16,16); ikonka.iconSize = new GSize(32, 32); function createMarkerDrag(punkt,tresc) { var marker = new GMarker(punkt,{title: 'Najechałeś na mnie myszką', draggable: true, icon: ikonka}); GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(tresc); }); //do zdarzen GEvent.addListener(marker, "dragend", function() { var coord = marker.getPoint(); var x = coord.x; var y = coord.y; document.getElementById("coord_x").firstChild.nodeValue = x; document.getElementById("coord_y").firstChild.nodeValue = y; }); GEvent.addListener(marker, "mouseover", function() { marker.setImage("custom_marker2.png"); }); GEvent.addListener(marker, "mouseout", function() { marker.setImage("custom_marker.png"); }); map.addOverlay(marker); } // czytamy dane z pliku markery.xml GDownloadUrl("markery.xml", function(dane) { var xmlDoc = GXml.parse(dane); var markers = xmlDoc.getElementsByTagName("marker"); for (var i = 0; i < markers.length; i++) { // przetwarzamy atrybuty znaczników marker var lat = parseFloat(markers[i].getAttribute("lat")); var lng = parseFloat(markers[i].getAttribute("lng")); var point = new GLatLng(lat,lng); var html = GXml.value(markers[i].getElementsByTagName("opis")[0]); var drag = parseInt(markers[i].getAttribute("drag")); // tworzymy marker if(drag==1) { createMarkerDrag(point,html); } else { createMarker(point,html); } } }); } } //]]> </script> </head> <body onload="init()" onunload="GUnload()"> <div id="mapa" style="width: 500px; height: 400px"></div> <div id="coord_x"> </div><div id="coord_y"> </div> </body> </html>
Geokodowanie
Geokodowanie polega na przekształceniu adresu np. Łódź, Piotrkowska 95 na punkt na mapie. W Polsce geokodowanie z dokładnością do numeru budynku można stosować tylko dla większych miast. Należy stworzyć obiekt klasy GClientGeocoder(). Posiada on metodę getLatLng(), która przekształca adres na współrzędne. Metodzie tej musimy przekazać dwa parametry: adres oraz funkcję, która będzie wykonana po zgeokodowaniu adresu. My będziemy odczytywać adresy z pliku XML. Zamiast atrybutów lat i lng, dodaliśmy atrybut adres.<markery> <marker adres="Łódź, Piotrkowska 95" label="Marker One" drag="0"> <opis><![CDATA[ Jakiś opis, w którym <b>można</b> używać html ]]></opis> </marker> <marker adres="Warszawa, Samolotowa 1" label="Marker Two" drag="0"> <opis><![CDATA[ Drugi marker ]]></opis> </marker> <marker adres="Łódź, Sokola 3" label="Marker Three" drag="0"> <opis><![CDATA[ Trzeci marker ]]></opis> </marker> </markery>Najpierw stworzymy obiekt GClientGeocoder().
var geocoder = new GClientGeocoder();Następnym krokiem jest opracowanie działania funkcji przetwarzającej otrzymany adres. Funkcja ta jest drugim parametrem dla metody getLatLng().
geocoder.getLatLng(adres,function(point) { if (!point) { alert(adres + " nie został znaleziony."); } else { if(drag==1) { createMarkerDrag(point,html); } else { createMarker(point,html); } } });Adres miejsca z pliku XML złapiemy w następujący sposób:
var adres = markers[i].getAttribute("adres");Funkcja przetwarzająca adres wstawia marker lub wyświetla komunikat, jeśli adres nie został znaleziony.
Pełny kod pliku:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"/> <title>Pierwsza mapa</title> <script src="http://maps.google.com/maps?file=api&v=2&sensor=false&key=KEY" type="text/javascript"></script> <script type="text/javascript"> //<![CDATA[ function init() { if (GBrowserIsCompatible()) { var map = new GMap2(document.getElementById("mapa")); var geocoder = new GClientGeocoder(); map.addControl(new GLargeMapControl()); map.addControl(new GMapTypeControl()); map.setCenter(new GLatLng(51.7592485,19.4559833),7); function createMarker(punkt,tresc) { var marker = new GMarker(punkt); GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(tresc); }); map.addOverlay(marker); } // deklaracja nowej ikony var ikonka = new GIcon(); ikonka.image = "custom_marker.png"; ikonka.iconAnchor = new GPoint(16, 32); ikonka.shadow = ""; ikonka.infoWindowAnchor = new GPoint(16,16); ikonka.iconSize = new GSize(32, 32); function createMarkerDrag(punkt,tresc) { var marker = new GMarker(punkt,{title: 'Najechałeś na mnie myszką', draggable: true, icon: ikonka}); GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(tresc); }); GEvent.addListener(marker, "dragend", function() { var coord = marker.getPoint(); var x = coord.x; var y = coord.y; document.getElementById("coord_x").firstChild.nodeValue = x; document.getElementById("coord_y").firstChild.nodeValue = y; }); GEvent.addListener(marker, "mouseover", function() { marker.setImage("custom_marker2.png"); }); GEvent.addListener(marker, "mouseout", function() { marker.setImage("custom_marker.png"); }); map.addOverlay(marker); } function geoc(adres,html)//html to opis w dymku { geocoder.getLatLng(adres, function(point) { if (!point) { alert(adres + " not found"); } else { createMarker(point,html); } } ); } // czytamy dane z pliku markery.xml GDownloadUrl("markery2.xml", function(dane) { var xmlDoc = GXml.parse(dane); var markers = xmlDoc.getElementsByTagName("marker"); for (var i = 0; i < markers.length; i++) { var adres = markers[i].getAttribute("adres"); var html = GXml.value(markers[i].getElementsByTagName("opis")[0]); var drag = parseInt(markers[i].getAttribute("drag")); geoc(adres,html); } }); } } //]]> </script> </head> <body onload="init()" onunload="GUnload()"> <div id="mapa" style="width: 500px; height: 400px"></div> <div id="coord_x"> </div><div id="coord_y"> </div> </body> </html>