Ruchomy marker w google maps api v3
Dodawanie markerów do mapy googla nie jest zbyt trudne. Drobne problemy mogą pojawić w momencie, gdy zechcemy dodać marker, który da się przesuwać. Taka sytuacja będzie miała miejsce, gdy mapka będzie służyła np. do wskazywania jakiegoś określonego miejsca, a geocoder będzie wstępnie określać obszar. Główne założenia: marker da się przesunąć przy pomocy drag&drop, można go przesunąć klikając od razu na mapie oraz można go przesunąć na podstawie współrzędnych geocodera.
Na początku skryptu definiujemy zmienną marker. Zmienna ta będzie przechowywać odpowiedni obiekt i pozwoli określić czy marker ma być wstawiony czy przesunięty. Do mapy podpinamy wydarzenie click, którego zadaniem będzie dodawanie markera. Na koniec sam marker tworzymy dodając do opcji pozycję dragable: true. Całość może wyglądać następująco:
var map ; var marker ; function initialize() { lat = 52 ; long = 33 ; var latlng = new google.maps.LatLng(lat, long); var myOptions = { zoom: 14, center: latlng, mapTypeId: google.maps.MapTypeId.ROADMAP } ; map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); google.maps.event.addListener(map, 'click', function(event) { add_marker(event.latLng, 'miejsce', 'opis' ); } ); } function add_marker( pos, pos_title, pos_str ) { if( marker != null ) { marker.setPosition( pos ) ; } else { marker = new google.maps.Marker( { position: pos, map: map, draggable: true, title: pos_title } ); } }
Funkcję initialize() wywołujemy po załadowaniu dokumentu. Jeżeli wszystko jest dobrze, to marker będzie się przesuwać po mapie (podpiętej pod diva z id map_canvas) zgodnie z kliknięciami oraz zgodnie z ruchami myszki (o ile został chwycony).
Potrzebny jeszcze będzie kod pozwalający zapisywać położenie markera w ukrytym polu (trzeba będzie lekko zmienić funkcję add_marker):
function updateMarkerPosition(latLng) { $("#ID_POLA").val( [ latLng.lat(), latLng.lng() ].join(', ')); } /* zmieniona wersja wcześniejszego add_marker */ function add_marker( pos, pos_title, pos_str ) { if( marker != null ) { marker.setPosition( pos ) ; updateMarkerPosition( pos ) ; } else { marker = new google.maps.Marker( { position: pos, map: map, draggable: true, title: pos_title } ); updateMarkerPosition( pos ) ; google.maps.event.addListener(marker, 'drag', function() { updateMarkerPosition(marker.getPosition()); } ); } }
Teraz każde kliknięcie na mapie lub przesunięcie markera spowoduje wpisanie do #ID_POLA nowego położenia (w razie potrzeby współrzędne można umieścić w dwóch różnych polach, wystarczy odwołać się do latLng.lat() i latLng.lng()). Jeżeli mapka będzie służyła także do edycji wcześniej oznaczonych miejsc, to w initialize() należy dodać odczyt zapisanego położenia i wywołanie na samym końcu add_marker z odpowiednimi parametrami: add_marker( new google.maps.LatLng(lat, long), 'poprzednie polozenie’, 'opis’ );
należy skorzystac z Listenera na dragend
google.maps.event.addListener(marker, 'dragend’, function() {
updateMarkerPosition(marker.getPosition());
});