Google Maps API – wstęp

Jeżeli jesteś tutaj po raz pierwszy może chcesz przez feed RSS albo emailem dostawać info o nowych postach?

Kilka słów wyjaśnienia. Artykuł ten jest przeznaczony dla tych, którzy chcą sami napisać aplikację wykorzystującą Google Maps API. Wiedza potrzebna do przetrawienia tych informacji to ogólna wiedza jaką każdy web developer posiadać powinien na temat JavaScriptu i HTMLu. Informacje tutaj podawane są aktualne na dzień 20.08.2007, Google Maps API w wersji stabilnej 2.73.

Google Maps API – wstęp

Aby stworzyć własne mapy niezbędne jest posiadanie tzw. GM API key, czyli identyfikatora przypisanego do danej aplikacji. Można o taki wystąpić tutaj: http://www.google.com/apis/maps/signup.html

UWAGA! Przeczytaj warunki korzystania z API, jest kilka zastrzeżeń, np. aplikacja powstała z wykorzystaniem Google Map API musi być publicznie dostępna. Darmowe Google Map API nie ma limitu liczby wywołań, ale Google sugeruje kontakt jeśli Twoja aplikacja miałaby generować więcej dziennie niż pół miliona odsłon dla Google. Jest za to limit na liczbę konwersji adresów na współrzędne (geocoding), wynoszący 50 tysięcy dziennie. Jeżeli te warunki stanowią ograniczenie dla Twojej aplikacji, możesz się skontaktować z Google w sprawie licencji komercyjnej, która może takie ograniczenia zlikwidować.

Hello world!

Aplikacja korzystająca z GM API jest zwykłą stroną WWW, która wywołuje zewnętrzny plik z kodem JavaScript. Plik ten zawiera bibliotekę służącym tworzeniu i manipulowaniu mapą na naszej stronie. Klucz służy do identyfikacji aplikacji. Aby Google Maps API działało, strona WWW, o której mowa musi mieć URL zgodny z tym co zostało podane podczas występowania o identyfikator aplikacji (GM API key).

Mając identyfikator możemy przystąpić do tworzenia mapy. Sama mapa na stronie jest koniecznie obiektem HTML typu div.

 
        1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
        3 <html xmlns="http://www.w3.org/1999/xhtml">
        4   <head>
        5     <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
        6     <title>GM API: hello world</title>
        7     <script src="http://maps.google.com/maps?file=api&v=2.s&key=BARDZO_DLUGI_KLUCZ"
        8     type="text/javascript"></script>
        9     <script type="text/javascript">
       10     //<![CDATA[
       11     function load() {
       12       if (GBrowserIsCompatible()) {
       13         var map = new GMap2(document.getElementById("map"));
       14         map.setCenter(new GLatLng(52.23185395123989, 21.02083683013916), 17);
       15       }
       16     }
       17     //]]>
       18     </script>
       19   </head>
       20   <body onload="load()" onunload="GUnload()">
       21     <div id="map" style="width: 600px; height: 400px"></div>
       22   </body>
       23 </html>

Przykład dostępny tutaj

Nasz Hello world wyświetla mapę centrum Warszawy, pozwalając przesuwać ją przytrzymując klawisz myszy. Teraz kilka słów wyjaśnienia.

W linii 7 należy umieścić otrzymany identyfikator (GM API key). Właściwa konstrukcja mapy odbywa się w linii 13. Obiekt typu GMap2 reprezentować będzie naszą mapę. Konstruktor przyjmuje jako argument obiekt DOM, w którym ma być umieszczona mapa. Ponieważ API zmienia właściwości CSS tego elementu, jedyne zdefiniowane właściwości CSS (przez tag style) to szerokość i wysokość (linia 21). Definicja tych parametrów jest obowiązkowa, gdyż w ten sposób API może ustalić rozmiar mapy.

W 14 linii ustawiany jest punkt środkowy mapy – jest to obowiązkowa czynność. Po stworzeniu obiektu typu GMap2 następną operacją na tym obiekcie musi być setCenter, inaczej całość może nie działać.

Innym ważnym elementem jest wywołanie GUnload() po zakończeniu wyświetlania strony (właściwość onunload w linii 20), gdyż pozwala to API na właściwe “posprzątanie” i zabezpieczyć powinno użytkowników naszej aplikacji przed „puchnięciem” przeglądarki.

Podstawowe kontrolki

Dodajmy kilka elementów kontrolnych, pozwalających na większą interakcję z mapą. W funkcji load dodajemy kilka wywołań:

15         map.addControl(new GLargeMapControl());
16         map.addControl(new GMapTypeControl());
17         map.addControl(new GScaleControl());

Od teraz zyskujemy kontrolę nad poziomem zbliżenia (GLargeMapControl), widokiem mapy/zdjęcie (GMapTypeControl) oraz uzyskujemy skalę odniesienia (GScaleControl). Mapa wyposażona w takie elementy kontrolne jest znacznie bardziej użyteczna, ale wciąż prezentuje tylko dane otrzymane z serwerów Google, a my chcemy umieścić tam również własne obiekty.

Przykład dostępny tutaj

Szukamy adresu, czyli geocoding

Nawigacja z wykorzystaniem myszki jest wystarczająca, jeśli wiemy gdzie dokładnie znajduje się szukany obszar, oraz mapa jest “dość blisko” od szukanego miejsca. Gdy jednak nie jest to prawdą, niezbędna jest metoda na zamianę adresów na współrzędne geograficzne. Proces ten jest nazywany geocoding.

W GM API procesu ten jest realizowany z wykorzystaniem obiektu GClientGeocoder. Po jego zainicjowaniu można skorzystać z metody getLatLng biorącej jako argument adres w postaci tekstowej oraz funkcję z jednym argumentem (typu GLatLng). Funkcja zostanie wywołana po zakończeniu procesu geocodingu a argument będzie miał wartość null gdy odszukanie adresu się nie udało, lub współrzędne punktu który odpowiada szukanemu adresowi. Przyjrzyjmy się wywołaniu getLatLng dokładniej. Najpierw w linii 12 inicjalizujemy obiekt geocodera:

       12     var geocoder = new GClientGeocoder();

Następnie funkcję findAddress przypisujemy do formularza HTML:

       42   <form action="#" onsubmit="findAddress(this.address.value); return false">
       43   <p>
       44           <input type="text" size="60" name="address"/>
       45           <input type="submit" value="Go!" />
       46   </p>
       47   </form>

Jak widać po wciśnięciu przycisku ‘Go!’ zawrtość pola tekstowego zostanie przekazana do funkcji findAddress (linia 42, onsubmit). Spójrzmy na funkcję findAddress:

       25     function findAddress(address) {
       26       geocoder.getLatLng(
       27         address,
       28         function(pt) {
       29           if (!pt) {
       30             alert(address + " - nie umiem znaleźć");
       31           } else {
       32             map.setCenter(pt, 13);
       33           }
       34         }
       35       );
       36     }

Przykład dostępny tutaj

W linii 26 korzystamy z globalnej zmiennej zainicjalizowanej w linii 12 i przekazujemy zapytanie o zapisany adres. Funkcja przekazywana jako drugi argument (tzw closure) zostanie wywołana po zakończonym procesie geocodingu.

Zapytanie o geocoding domyślnie jest asynchroniczne. Oznacza to, że po wywołaniu getLatLng wykonywanie naszego skryptu nie zostanie wstrzymane, tylko nie czekając na wynik ustalania współrzędnych zostanie wykonana kolejna linia (po wywołaniu funkcji geocoder.getLatLng – w tym przykładzie jest to linia 36 – koniec funkcji). Może to zrodzić pewien problem, który teraz spróbuję naświetlić.

Teraz wykorzystujemy statyczne strony HTML, ale w praktyce kod HTML będzie dynamicznie generowany z jakiejś aplikacji (PHP, Ruby on Rails, ASP lub inne) i często będziemy chcieli przekazać do serwera informację, że użytkownik wyszukał adres i zmienił widok (cała komunikacja dotąd odbywa się tylko między przeglądarką klienta i serwerami Google). Jako naturalne rozwiązanie nasuwa się wykorzystanie XMLHttpRequest (AJAX) do poinformowania serwera o nowych parametrach mapy, gdy tylko użytkownik przeniesie się w inne miejsce mapy.

Użyjmy na przykład script.aculo.us/Prototype do obsługi AJAX (http://script.aculo.us/) i po zakończeniu wywołania klienta geocodera poinformujmy nasz serwer:

       25     function findAddress(address) {
       26       geocoder.getLatLng(
       27         address,
       28         function(pt) {
       29           if (!pt) {
       30             alert(address + " - nie umiem znaleźć");
       31           } else {
       32             map.setCenter(pt, 13);
       33           }
       34         }
       35       );
       36   new Ajax.Request('/app/hej_mapa_ma_nowy_srodek', 
       37        {method: 'post', postBody: 'srodek='+map.getCenter().toUrlValue() }
       38 }

Niestety, jest to błędne rozwiązanie. Geocoder użyty w funkcji findAddress jest (jak wcześniej wspomniałem) asynchroniczny i na pewno map.getCenter() w Ajaxowym wywołaniu będzie wywołane przed zakończeniem pracy geocodera, co oznacza, że map.getCenter() zwróci stare współrzędne środka mapy.

Przebieg wykonania będzie pewnie tak wyglądał:

  • linia 26 – wywołanie asynchroniczne geocodera
  • linia 36 – Ajax.Request ze starą wartością zwracaną przez map.getCenter()
  • powrót z funkcji
  • Po zakończeniu przetwarzania adresu na współrzędne wywołane zostanie setCenter z linii 32 (o ile adres udało się rozpoznać)

Poprawnym rozwiązaniem jest przeniesienie wywołania Ajax.Request do closure w funkcji findAddress (czyli między linie 32 i 33). W ten sposób mamy zagwarantowane, że wywołanie żądania AJAX odbędzie się z poprawnie ustawionym stanem obiektu map (co za tym idzie dane przekazane do naszego serwera będą poprawne).

Zaznaczanie punktów

Aby zaznaczać punkty na mapie użyjemy tzw. znaczników. W Google Maps API reprezentowane są przez obiekty typu GMarker. Konstruktor takiego obiektu jako parametr potrzebuje współrzędne punktu, który będzie reprezentował. Współrzędne te muszą zostać podane w formie kolejnego obiektu GLatLng. Tyle nam wystarczy, aby zacząć zaznaczać punkty. Tak, więc, do dzieła!

Do kodu funkcji load dodajemy kolejną linię:

       20         map.addOverlay( new GMarker( new GLatLng( 52.23185395123989, 21.02083683013916) ) )

Przykład dostępny tutaj

W ten sposób na mapie mamy zaznaczony pewien charakterystyczny obiekt w Warszawie. Przełączcie w tryb Hybrid, może zgadniecie o co chodzi. A jeśli nie…

Punkt (marker) ten zostaje przypisany do współrzędnych geograficznych i API zajmuje się jego właściwym umieszczeniem w zależności od tego jak mapa zostanie przeskalowana czy przesunięta. GMarker jest przykładem obiektu z kategorii Overlay, która oprócz punktów na mapie pozwala również nanosić linie oraz wielokąty.

Mamo, tato narysujmy coś!

Linie reprezentuje obiekt typu GPolyline. Jego konstruktor potrzebuje tablicy z obiektami typu GLatLng jako argumentu i umieszczony na mapie (używając znanej już metody addOverlay) zostanie pieczołowicie odrysowany. Gdybyśmy chcieli pokazać komuś jak obejść dookoła zaznaczony wcześniej charakterystyczny obiekt w Warszawie, potrzebujemy mniej więcej takiego kodu w funkcji load :

       24         points = [
       25           new GLatLng (52.23212993512015, 21.020729541778564),
       26           new GLatLng (52.231913090787245, 21.020150184631348),
       27           new GLatLng (52.23143340107545, 21.020429134368896),
       28           new GLatLng (52.23158453674942, 21.02134108543396),
       29           new GLatLng (52.2321430771669, 21.021265983581543),
       30           new GLatLng (52.2321430771669, 21.020890474319458)
       31         ]
       32
       33         map.addOverlay ( new GPolyline (points) )

Przykład dostępny tutaj

Jeśli potrzebujesz narzędzia do rysowania linii na Google Maps zajrzyj na http://nhw.pl/download/points.html. Jest tam to czego szukasz.

Wracając do kodu – w stosunku do poprzednich przykładów musieliśmy zmienić trochę więcej kodu HTML. Otóż w nowa postać linii 3:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml">

Ponadto musimy dodać specjalny styl CSS:

      38   <style type="text/css">
      39   v\:* {
      40     behavior:url(#default#VML);
      41   }
      42   </style>

Całe to zamieszanie jest z powodu Internet Explorera. W tej przeglądarce linie są rysowane z wykorzystaniem VML – Vector Markup Language. Dlatego musimy zrobić te zmiany, aby linie były widoczne w IE (w pozostałych przeglądarkach linie są “rysowane” jako obrazki generowane przez serwery Google lub z wykorzystaniem SVG). Bez tych dwóch zmian IE nie wyświetli nic.

Znaczniki na mapie można opisywać. Obiekty GMarker mają dostępną metodę openInfoWindowHtml, która jako argument przyjmuje kod HTML, który ma zostać wyświetlony. Po stworzeniu znacznika dodajemy dla niego obsługę zdarzenia “click” czyli co ma się stać po kliknięciu na niego:

       22         map.addOverlay( marker = new GMarker( new GLatLng( 52.23185395123989, 21.02083683013916) ) )
       23
       24         GEvent.addListener(marker, "click", function() {
       25               marker.openInfoWindowHtml("Nie wiesz co tutaj jest? Zajrzyj: "+
       26               "<a href='http://images.google.com/images?hl=en&q=palma+warszawa&btnG=Search+Images&gbv=2'>"+
       27               "tutaj</a>")
       28            });
 

Przykład dostępny tutaj

Umieszczając elementy graficzne (tag img) w openInfoWindowHtml koniecznie trzeba podać atrybuty width oraz height inaczej rozmiar okna wyświetlającego nie będzie poprawnie dobrany. Niestety, ale jest to powszechny błąd, a objawia się tym, że często zdjęcie większych rozmiarów nieładnie wyjeżdża poza okno. Dodanie rozmiarów obrazka do tagu img pozwala na uniknięcie takiego zgrzytu w UI.

W tym przykładzie dotknęliśmy również zupełnie nowego tematu, jakim jest model zdarzeń (events), pozwalający na uczynienie z mapy naprawdę interaktywnej aplikacji. API generuje wiele zdarzeń, dla których można po stronie naszej aplikacji wykonywać kod. Zdarzenia te to kliknięcie w obiekt, najechanie kursorem, utworzenie obiektu, przesunięcie, itp.

Aby móc reagować na zdarzenia należy przekazać API informację jakie zdarzenie nas interesuje, dla jakiego obiektu oraz co zrobić gdy ono wystąpi. Google Maps API udostępnia w tym celu zbiór funkcji w przestrzeni nazw GEvent. W szczególności interesuje nas funkcja addListener z tej przestrzeni (dlatego w powyższym kodzie wywołujemy ją przez GEvent.addListener), która pozwala nam dla stworzonego wcześniej obiektu typu GMarker (zmienna marker) dla zdarzenia typu “click” zarejestrować funkcję, która powoduje wyświetlenie okna z opisem znacznika.

O ile pierwsze dwa parametry z przykładu nie budzą żadnych podejrzeń, to dla osób nieprogramujących w JavaScripcie lub innym języku wspierającym tzw. closures zaskoczeniem może być definicja funkcji w miejscu argumentu. Jest to zupełnie poprawne i często stosowane gdy obsługa zdarzenia da się zmieścić w kilku liniach kodu. Oczywiście trzeba pamiętać, że wzrost liczby i długości takich funkcji fatalnie odbić się może na czytelności kodu i przełoży się w takim wypadku na trudniejszą pielęgnację i rozwój aplikacji.

Dostępna dokumentacja

Opisałem tutaj parę podstawowych informacji, niezbędnych do rozpoczęcia pracy z GM API. Zainteresowanych bardziej zaawansowanymi aspektami odsyłam teraz do dokumentacji ale nie ukrywam, że mam w planach napisanie jeszcze dodatkowych tekstów o GM API.

Dokumentacja do Google Maps API jest dość kompletna, dostępna pod adresem http://www.google.com/apis/maps/documentation/. Niezastąpionym źródłem informacji jest grupa news (http://groups.google.com/group/Google-Maps-API/). Ze źródeł informacji innych niż firma Google polecam stronę Mike Williamsa poświęconą Google Maps API (Mike jest również bardzo aktywny na grupie) dostępną pod adresem http://www.econym.demon.co.uk/googlemaps/. W szczególności przydatna jest lista wszystkich zdarzeń (events) dla różnych obiektów Google Maps API (w oficjalnej dokumentacji Google nie znalazłem takiej całościowej informacji) http://www.econym.demon.co.uk/googlemaps/gevent.htm.

Niezłym zasobem informacji dysponuje również serwis Mapki




Potrzebujesz napisać aplikację wykorzystującą Google Maps API? Lub inną opartą o Ruby on Rails? Skontaktuj się ze mną, zajmuje się takimi rzeczami.


(c) Witold Rugowski
wersja 1.1 2007.08.24

Popularity: 30% [?]

31 Responses to Google Maps API – wstęp

  1. skarlcf says:

    Obecnie Google udostępniło wstawianie map poprzez obiekty.
    @netmaniac: Znasz może różnice w funkcjonalności obu usług (nie chodzi mi o implementacje)?

  2. NetManiac says:

    Masz na myśli embedded maps?

    Z tego co mi się wydaje (ale embedded się jeszcze nie przyjrzałem uważnie) to mapy stworzone przez siebie możesz bardziej dostosowywać. Własne ikony, obsługa zdarzeń, itp.

    Jeśli potrzebujesz prostą mapę z zaznaczonym punktem – pewnie embedded wystarczy. Jeśli bardziej jest potrzebna aplikacja to zostaje użycie API.

  3. rafau says:

    Cześć, fajny tutek:).. przydał się bardzo tylko mam pytanie odnośnie: http://nhw.pl/download/points.html. Bawiłem się troszkę z tymi rozwiązaniami i podobnie jak na w/w stronie pod IE nie pojawia się ikonka (tutaj cross png)? Jakiś pomysł?

  4. NetManiac says:

    @rafau
    Możesz powiedzieć który IE? Ja mam 7 i ‘u mnie działa’ :)

  5. rafau says:

    IE6.. tutaj screen, może się przyda -> http://arytmia.eu/mapa.jpg . Walczę z tym i nic;)

  6. NetManiac says:

    @rafau
    Obawiam się, że nie zgłębię teraz przyczyny, bo nie mam dostępu do IE6 i to raczej się nie zmieni…

  7. Interlive says:

    Witam
    Jak można umieśćić kilka map na jednej stronie??

  8. NetManiac says:

    @interlive
    Tworzysz dwa obiekty div w HTML w których chcesz osadzić mapy, nadajesz im id na przykład map1 i map2 i potem w kodzie JavaScript

    
    var map_one = new GMap2(document.getElementById("map1"));
    map.setCenter(new GLatLng(52.23185395123989, 21.02083683013916), 17);
    
    var map_two = new GMap2(document.getElementById("map2"));
    map.setCenter(new GLatLng(52.23185395123989, 21.02083683013916), 17);
    

    Powinno zadziałać, choć nigdy tego nie testowałem…

  9. Peter says:

    Witam,

    Zrobiłem tutek dla początkujących o Google Maps API. Ilość korespondencji i pytań skłoniła mnie do zrobienia skryptu generującego gotowe mapy. Wystarczy zarejestrować klucz uzupełnić nim wygenerowany kod i przenieść całość na swoją stronę www. Zastosowałem kilka najbardziej poszukiwanych opcji. Punkty można szukać przez Geolokalizację, manualnie lub przez podanie współrzędnych GPS. Zachęcam do korzystania: http://www.web4you.com.pl/geofinder.php

    Pozdrawiam Peter

  10. ader says:

    Hej!

    Czyli rozumiem, że można wykorzystywać mapkę google na stronie firmowej za darmo? Gdzieś czytałem, że tak nie jest więc bardzo chciałbym się upewnić.

  11. NetManiac says:

    Jak najbardziej można, trzeba tylko przestrzegać innych obostrzeń – takich jak publiczny dostęp (nie może to być dostępne “tylko dla klientów z loginem” itp)

    Warto przeczytać Terms of Service.

  12. Maciek says:

    Witam,
    Wykorzystuję funkcję geocoder.getLatLng(address1,function(point)); W przypadku gdy “google” nie może znaleźć address1 chciałbym aby poszukał address2. Skąd to się wzięło? W przypadku gdy podamy nazwę małego miasteczka z adresem np. “Końskie, Polna 9″ to google tego nie wyświetli. Jesli podamy w postaci “Końskie” lub “26-200 Końskie” to wyświetli.
    Czy jest na to sposób?
    pozdrawiam
    Maciek

  13. Marcin says:

    Kurcze – wszyscy piszą o cudeńkach, polygonach, warstwach, obrazkach w znaczniku – a ja potrzebuję stworzyć prostą stronkę w dwoma ramkami (albo polami tabeli whatever). W jednej mapka a w drugiej lista miejsc. Po kliknięciu mapka się centruje na wybrany punkt.

    (W końcowej wersji lista będzie generowana z bazy MSQL po wypisaniu części nazwy miejsca. baza to będzie nazwa + współrzędne). Ktoś może mi pomóc ?

  14. NetManiac says:

    @Marcin
    Ależ jak najbardziej. W pierwszym listingu masz wszystko co potrzeba.

    Dodaj tylko drugi div na listę miejsc i tam listę miejsc

    <a href=”#” onclick=”map.setCenter(new GLatLng(21,22))” >pierwsze miejsce</a>
    <a href=”#” onclick=”map.setCenter(new GLatLng(33,44))” >drugiemiejsce</a>

    Pisane z głowy wiec może być jakiś błąd, ale idea jest taka jak wyżej.

  15. NetManiac says:

    @Maciek

    Wybacz trochę byłem zajęty – ale może to co piszę w tym poście pomoże Ci podjeść do tematu

    http://nhw.pl/pl/2008/02/poczta-polska-i-geocoding-drugie-podjescie

  16. Pingback: Poczta Polska i geocoding - drugie podjeście : NetManiac

  17. zulu says:

    bardzo fajny tutorial.
    a ja mam takie pytanie:
    Czy jest mozliwosc wyciagniecia poprawnej nazwy miejscowosci z API GM ?
    Chodzi mi o to , ze w wpisze na przyklad ‘siemianowice slaskie’ i googiel stawia ladnie punkcik nad Siemianowicami Śląskimi – ladnie czyli z duzej litery i po polsku.
    Czy teraz tak zapisana nazwe moge zapisac do swojej bazy ?

  18. NetManiac says:

    @zulu
    Jeśli potrzebujesz jakiejś biblioteki do ‘poprawiania’ nazw miejscowości, to pewnie możesz to zrobić a GM API – geocoder może zwracać strukturę z adresami.

    Trochę więcej o tym jest w moim poście o lokalizacji placówek Poczty Polskiej

    Choć jeśli tylko chodzi o poprawianie nazw może jakaś integracja ze słownikiem byłaby lepsza?

  19. bouli says:

    A czy da sie wykorzystujac google api wyswietlic WLASNA MAPA ze swoich plikow?

  20. NetManiac says:

    @bouli
    Da się. Przykłady na stronie Mike Williamsa i w serwisie Mapki

  21. mag32 says:

    No i nie działa, może ktoś wie dla czego ?

    Klucz API dla Map Google, używany w tej witrynie był zarejestrowany dla innej witryny internetowej. Możesz utworzyć nowy klucz dla tej witryny na http://code.google.com/apis/maps/

    Klucz wygenerowałem dla ww adresu, również sprawdzałem dla adresu z nazwą pliku html, ale i tak nie działa, ciągle mam ten komunikat, a na przeglądarce prucz niego wyświetlaja się cyfry.
    3 4 5 6 7 9 19 20 21
    22 23

  22. NetManiac says:

    @mag32
    Jesli chodzi Ci o http://iszt.pl/ to dla jakiego URL wygenerowałeś klucz? Dla http://iszt.pl/ czy dla http://zzk.hostingpro.pl/iszt/ ? Bo na tym drugim fizycznie znajduje sie HTML zawierający odwołanie do biblioteki GM API – a źródło tego jest przez Google porównywane z kluczem.

    Wygeneruj klucz dla tego drugiego adresu.

  23. mag32 says:

    Pomogło, dziękuję.

  24. bouli says:

    Czy można ograniczeć przesuwanie mapy do konkretnego obszaru?
    Tak żeby możńa było przesuwać w granicach konkretnego obszaru ustalonego i nie można by wychodzic poza niego?

  25. mag32 says:

    a ja z innej beczki, czy zna ktoś sposób na naniesienie punktów zapisanych w bazie MySQL w aplikacji PHP na mapę googla ? Proszę o wskazówki.

  26. marcel says:

    Czy jest mozliwe wstawianie kilku pktow na mapie? Mam wstawiony jeden pkt z komentarzem, ale to dla mnie za malo: http://palmiarnia.info/content/lokalizacja-palm-w-polsce

  27. @marcel
    Oczywiście, że można.

    Powtórz kilka razy operację new GLatLng, new GPoint, new GMarker, .addOverlay i tyle

  28. Grzesiek says:

    Czy ma ktoś Terms of Service w języku polskim?
    z angielskim jest nie najlepiej. Z góry dziękuję za pomoc.

  29. Kurt says:

    w uzupełnieniu do pytania Marcina z30 styczeń, 2008 at 13:59
    a jak zrobić odwrotnie:
    1. po załadowaniu mapy z bazy pobierana jest lokalizacja obiektów mieszczących się w zadanym obszarze: point albo pt w tym artykule
    2. Na tej podstawie tworzone są na mapie markery.
    3. Obok mapy wyświetlane są linki do obiektów, których markery zostały umieszczone na mapie.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>