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>
