Dodano 2017-06-10 12:53:38 przez Daniel
W poprzedniej części omówiliśmy sobie najprostszą z możliwych metod umieszczania mapy google na stronie za pomocą ramki. W tej części trochę więcej sobie pokodujemy.
Wyobraź sobie sytuację, w której klient ma całą sieć punktów sprzedażowych i chciałby je wszystkie umieścić na mapce kontaktowej. Co więcej chciałby żeby zamiast standardowego znacznika wyświetlały się jego loga w miejscach, w których znajdują się jego placówki. Jakby tego było mało klient chce także żeby te punkty były jakoś podpisane. Raczej ciężko byłoby to zrealizować za pomocą mapki w ramce, dlatego też wykorzystamy javascript api (moje ulubione do tych celów) i zrealizujemy wszystkie przedstawione tutaj zagadnienia.
Na początek dodamy sobie po prostu mapkę. Pierwsza kwestia niczym się nie różni do części poprzedniej, trzeba wygenerować klucz dla usługi, aby to zrobić można wejść TUTAJ i wybrać GET a key, dalej dodajemy projekt lub generujemy klucz dla dotychczasowego projektu.
Kolejnym krokiem jest dodanie mapy za pomocą odpowiedniego kodu do naszego pliku z widokiem podstrony na przykład kontaktu.
Po pierwsze w sekcji <head> naszego dokumentu, lub jeśli robimy to w jakimś projekcie to pewnie mamy plik ze stylami np style.css gdzie trzymamy style. W każdym razie definiujemy wymiary boksa, w którym będzie się zawierać mapa (jest to ważny punkt bo łatwo go zapomnieć a bez niego mapy po prostu nie będzie widać :P). Poniżej przykładowy kod stylów do dodania do sekcji head.
#map { height: 400px; width: 100%; }
Drugim z czterech najważniejszych kroków jest dodanie tego boksa, dla którego przed chwilą ustaliliśmy parametry w miejscu gdzie ma się wyświetlać.
<div id="map"></div>
Trzecim krokiem będzie umieszczenie na stronie kodu JavaScript, dzięki któremu określimy że mapka ma się wyświetlać w tym a nie w innym boksie oraz gdzie zaznaczyć punkt na mapie. No ale zanim przejdziemy do kodu warto wiedzieć jaki jest najprostszy sposób na pobranie współrzędnych jakiegoś punktu na mapie google.
Sposób jest prosty i szybki. Otwieramy przeglądarkę google i wpisujemy adres, który nas interesuje i zaznaczamy że chcemy mape.
I teraz kiedy już mamy mapę, powinien się nieco zmienić link, wnikamy dokładnie w ten adres i w oko powinny się rzucić dość charakterystyczne liczby zaraz po adresie, to będą nasze szukane współrzędne.
W tym przypadku widać że współrzędne mojego adresu to 52.009422 oraz 23.0938793. Teraz skoro już wiemy jak pozyskać te dane możemy sobie na próbę wykorzystać je w skrypcie JS.
function initMap() { var tu_mieszkam = {lat: 52.009422, lng: 23.0938793}; var map = new google.maps.Map(document.getElementById('map'), { zoom: 12, center: tu_mieszkam }); var marker = new google.maps.Marker({ position: tu_mieszkam, map: map }); }
Co się dzieje w powyższym kodzie? Po pierwsze określamy zmienną „tu_mieszkam”, która jest obiektem współrzędnych mojego punktu na mapie pobranego wyżej. Dalej tworzymy obiekt mapy google w boksie o identyfikatorze „map”, który utworzyliśmy wczesniej a następnie ustawiamy przybliżenie mapy na 12 oraz centrujemy na wcześniej określonym punkcie. Dalej tworzymy obiekt „marker”, który jest znacznikiem, podajemy tutaj dwa podstawowe parametry pozycje (ustalony punkt czyli na środku mapy) oraz mapę (obiekt, który utworzyliśmy wyżej).
Czwartym z najważniejszych kroków w dodawaniu mapy google jest dodanie api. Można to zrobić po prostu odnosząc się do zasobów google za pomocą specjalnego linku tak jak poniżej.
<script async defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCg-NuXqdDnV5y5GgBVDj2H6wzI4kkQ8EM&callback=initMap"> </script>
Tutaj ważne jest aby zmienić klucz na swój wygenerowany na początku.
Składając te wszystkie elementy w jedną całość otrzymujemy najprostszy przykład mapy google. Jest na niej zaznaczony jeden punkt na środku. Całość przedstawiam w listingu poniżej.
<!DOCTYPE html> <html> <head> <style> #map { height: 400px; width: 100%; } </style> </head> <body> <div id="map"></div> <script> function initMap() { var tu_mieszkam = {lat: 52.009422, lng: 23.0938793}; var map = new google.maps.Map(document.getElementById('map'), { zoom: 12, center: tu_mieszkam }); var marker = new google.maps.Marker({ position: tu_mieszkam, map: map }); } </script> <script async defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCg-NuXqdDnV5y5GgBVDj2H6wzI4kkQ8EM&callback=initMap"> </script> </body> </html>
Zastosowanie powyższego kodu powinno dać efekt jak na obrazku poniżej.
Czasami pojawia się konieczność zmiany wyglądu punktu na mapie google. A zmiana taka jest bardzo łatwa, wystarczy dodać do markera parametr icon a w nim ścieżkę interesującej nas grafiki.
var marker = new google.maps.Marker({ position: tu_mieszkam, map: map, icon: 'http://zaawansowanywordpress.pl/wp-content/themes/zwp/images/zaawansowanywordpress_logo.jpg' });
Efekt powyższego listingu nie jest najciekawszy ponieważ dana grafika jest całkiem spora i pokrywa znaczną część mapy. Warto wykorzystać w tym przypadku dodatkowe parametry, i w ten sposób tworzymy obiekt z parametrami obrazka a następnie wykorzystujemy przy markerze skalowanie.
var image = { //adres obrazka url: 'http://zaawansowanywordpress.pl/wp-content/themes/zwp/images/zaawansowanywordpress_logo.jpg', //skalowanie scaledSize: new google.maps.Size(120, 30) }; var marker = new google.maps.Marker({ position: tu_mieszkam, map: map, icon: image });
W efekcie otrzymujemy efekt jak na obrazku poniżej.
Zastosowanie takie jak powyżej możemy wykorzystać co najwyżej na naszej własnej stronie, klient raczej nie ogarnie pobierania punktu z mapy google, a przynajmniej tak będzie w większości przypadków, a strona gdzie nie da się edytować adresu siedziby to trochę słabo.
Dlatego teraz warto by dodatkowo określić pozycję markera na podstawie konkretnego adresu, aby pozycja pobierała się sama, wtedy w panelu wystarczy dodać jakieś pole o nazwie adres i klient może sobie sam dowolnie modyfikować w prosty sposób.
Wykonanie takiego rozwiązania jest nieco bardziej skomplikowane, ale dalej do zrobienia w tym celu wykorzystujemy geocoder.
var geocoder = new google.maps.Geocoder(); geocoder.geocode( { 'address': "Grzybowa 37 Biała Podlaska"}, function(results, status) { if (status == 'OK') { map.setCenter(results[0].geometry.location); var marker = new google.maps.Marker({ map: map, icon: image, position: results[0].geometry.location }); } });
W powyższym przykładzie tworzymy obiekt Geocoder-a następnie jako pierwszy parametr przekazujemy obiekt z adresem, który nas interesuje a jako drugi funkcję. Funkcja sprawdza status zapytania o adres i jeśli wszystko jest ok centruje mapkę na znalezionym adresie a następnie stawia w tym miejscu marker.
Efekt powinien być identyczny jak wcześniej z tym że teraz zamiast współrzędnych wykorzystaliśmy adres.
Na koniec sytuacja w której klient ma kilka placówek i chciałby je zaznaczyć na mapce. W tym celu po prostu utworzymy tablicę z adresami tych placówek i dodamy je wykorzystując pętlę i wcześniejszy przykład.
var geocoder = new google.maps.Geocoder(); var adresy = ["grzybowa 37 biała podlaska", "Dworzec pkp biała podlaska", "Pocztowa 2b Biała podlaska"]; adresy.forEach(function(address){ geocoder.geocode( { 'address': address}, function(results, status) { if (status == 'OK') { map.setCenter(results[0].geometry.location); var marker = new google.maps.Marker({ map: map, position: results[0].geometry.location }); } }); });
W powyższym kodzie najpierw tworzymy obiekt Gocoder, dalej tablicę z adresami a następnie wykorzystujemy pętlę by pobrać adresy z tablicy z adresami oraz wyświetlić punkty na mapie zgodnie z tymi adresami, tak jak w przykładzie z akapitu wyżej.
Ostateczny efekt to powinno być coś podobnego jak na obrazku poniżej. Warto tutaj wspomnieć że nie zawsze trzeba znać dokładny adres, w tablicy wpisałem także dworzec pkp i też został odpowiednio zaznaczony.
Jak widać na mapie są zaznaczone trzy punkty czyli oczekiwany efekt został osiągnięty. I to by było na tyle w tej części. Cały kod js wykorzystany w tym przykładzie przedstawia poniższy listing. Aby zmienić punkty na dowolne obrazki wystarczy podstawić parametr icon : image w markerze.
function initMap() { var map = new google.maps.Map(document.getElementById('map'), { zoom: 12 }); var image = { //adres obrazka url: 'http://zaawansowanywordpress.pl/wp-content/themes/zwp/images/zaawansowanywordpress_logo.jpg', //skalowanie scaledSize: new google.maps.Size(120, 30) }; var geocoder = new google.maps.Geocoder(); var adresy = ["grzybowa 37 biała podlaska", "Dworzec pkp biała podlaska", "Pocztowa 2b Biała podlaska"]; adresy.forEach(function(address){ geocoder.geocode( { 'address': address}, function(results, status) { if (status == 'OK') { map.setCenter(results[0].geometry.location); var marker = new google.maps.Marker({ map: map, position: results[0].geometry.location }); } }); }); }