Przejdź do treści
Programowanie i bazy danych

Google Maps API – jak zacząć: klucz, mapa na stronie i kontrola kosztów

Google Maps API krok po kroku: jak założyć projekt i klucz w Google Cloud, wyświetlić mapę z markerem w JavaScript, zabezpieczyć klucz i nie przepłacić za użycie.

CZCzarek ZawolskiAktualizacja: 7 min czytania
Interaktywna mapa z pinezkami lokalizacji wyświetlana w aplikacji webowej

W skrócie

  • Google Maps Platform to płatne, rozliczane za użycie API — żeby zacząć, potrzebujesz projektu w Google Cloud, włączonej płatności i klucza API.
  • Do mapy na stronie wystarczy Maps JavaScript API; adresy na współrzędne zamienia Geocoding API, a trasy — Routes API.
  • Klucz API jest widoczny w kodzie strony, więc zabezpiecz go ograniczeniem do swoich domen (HTTP referrer) i tylko do potrzebnych API.
  • Jest darmowy limit miesięczny, ale po jego przekroczeniu naliczane są opłaty — ustaw budżet z alertami i limity zapytań, by nie dostać wysokiego rachunku.
  • Zamiast przestarzałego markera (google.maps.Marker) używaj AdvancedMarkerElement i ładuj biblioteki przez importLibrary.
Spis treści

Google Maps API (formalnie Google Maps Platform) to zestaw płatnych, rozliczanych za użycie interfejsów Google do map, geokodowania i wyznaczania tras. Żeby z niego skorzystać, potrzebujesz trzech rzeczy: projektu w Google Cloud, włączonej płatności oraz klucza API, który zabezpieczysz ograniczeniami. Prostą mapę na stronie wyświetlisz w kilkunastu liniach JavaScriptu.

Ten poradnik przeprowadza przez całość: od założenia klucza, przez działający przykład mapy z markerem, po zabezpieczenie klucza i kontrolę kosztów — bo przy Google Maps to właśnie rachunek bywa największą niespodzianką. Zakładam, że znasz podstawy HTML, CSS i JavaScriptu.

Czym jest Google Maps Platform i z jakich API się składa

Nie ma jednego „Google Maps API”. To rodzina usług podzielonych na grupy. Najczęściej używane:

APIDo czego służyGdzie się wywołuje
Maps JavaScript APIInteraktywna mapa na stronie WWWPrzeglądarka
Maps SDK for Android / iOSMapa w natywnej aplikacji mobilnejUrządzenie
Geocoding APIZamiana adresu na współrzędne i odwrotnieNajlepiej serwer
Places APIWyszukiwanie miejsc, autouzupełnianie, szczegółySerwer lub przeglądarka
Routes APIWyznaczanie tras i czasów dojazduSerwer
Maps Static APIStatyczny obrazek mapy (bez interakcji)Serwer lub <img>

Każde API rozliczane jest osobno i ma inną stawkę, dlatego włączaj tylko te, których faktycznie używasz. Dalej skupiam się na Maps JavaScript API, bo od niego zaczyna większość osób.

Krok 1: Projekt w Google Cloud i klucz API

  1. Zaloguj się do Google Cloud Console kontem Google.
  2. Utwórz nowy projekt (menu projektów u góry → Nowy projekt).
  3. Włącz płatności dla projektu — bez tego API zwróci błąd nawet w ramach darmowego limitu. Google wymaga karty, ale dopóki mieścisz się w limicie, nie nalicza opłat.
  4. Włącz potrzebne API: APIs & Services → Library → wyszukaj „Maps JavaScript API” → Enable.
  5. Utwórz klucz: APIs & Services → Credentials → Create credentials → API key.
  6. Od razu kliknij utworzony klucz i przejdź do jego ograniczeń (opisane niżej) — nie zostawiaj klucza bez ograniczeń.

Krok 2: Mapa z markerem na stronie

Współczesny, zalecany sposób to ładowanie API przez tzw. bootstrap loader i import bibliotek funkcją importLibrary, zamiast starego, pojedynczego tagu <script> z callback. Poniżej minimalny, kompletny przykład. Zamień TWOJ_KLUCZ na własny klucz.

<!doctype html>
<html lang="pl">
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <style>
    /* Mapa musi mieć jawnie ustaloną wysokość, inaczej się nie pokaże */
    #mapa { height: 400px; width: 100%; }
  </style>
</head>
<body>
  <div id="mapa"></div>

  <script>
    // Oficjalny loader Google Maps (bootstrap)
    (g => { var h, a, k, p = "The Google Maps JavaScript API";
      var c = "google", l = "importLibrary", q = "__ib__", m = document,
      b = window; b = b[c] || (b[c] = {}); var d = b.maps || (b.maps = {}),
      r = new Set, e = new URLSearchParams, u = () => h || (h = new Promise(
      async (f, n) => { await (a = m.createElement("script"));
      e.set("libraries", [...r] + ""); for (k in g) e.set(k.replace(/[A-Z]/g,
      t => "_" + t[0].toLowerCase()), g[k]); e.set("callback", c + ".maps." + q);
      a.src = `https://maps.${c}apis.com/maps/api/js?` + e; d[q] = f;
      a.onerror = () => h = n(Error(p + " could not load.")); a.nonce =
      m.querySelector("script[nonce]")?.nonce || ""; m.head.append(a) }));
      d[l] ? console.warn(p + " only loads once. Ignoring:", g) :
      d[l] = (f, ...n) => r.add(f) && u().then(() => d[l](f, ...n)) })({
        key: "TWOJ_KLUCZ",
        v: "weekly",
      });

    async function initMap() {
      const { Map } = await google.maps.importLibrary("maps");
      const { AdvancedMarkerElement } = await google.maps.importLibrary("marker");

      const pozycja = { lat: 52.2297, lng: 21.0122 }; // Warszawa

      const mapa = new Map(document.getElementById("mapa"), {
        center: pozycja,
        zoom: 12,
        mapId: "DEMO_MAP_ID", // wymagane przez AdvancedMarkerElement
      });

      new AdvancedMarkerElement({
        map: mapa,
        position: pozycja,
        title: "Warszawa",
      });
    }

    initMap();
  </script>
</body>
</html>

Dwie rzeczy, na których najczęściej potykają się początkujący:

  • Kontener mapy musi mieć wysokość. Bez height w CSS <div> ma 0 pikseli i mapy nie widać.
  • AdvancedMarkerElement wymaga mapId. Identyfikator mapy tworzy się w konsoli (Map Management); na potrzeby testów można użyć dowolnej wartości, ale do stylowania mapy potrzebny jest prawdziwy identyfikator.

Stary new google.maps.Marker(...) nadal działa, ale jest oznaczony jako przestarzały (deprecated) — w nowych projektach używaj AdvancedMarkerElement.

Krok 3: Zabezpieczenie klucza API

Klucz do Maps JavaScript API jest wysyłany do przeglądarki, więc każdy może go odczytać w kodzie strony. Nie da się go ukryć — zabezpiecza się go inaczej, ograniczając to, skąd i do czego może być użyty. To kluczowy krok, bo skradziony, nieograniczony klucz może wygenerować Ci duży rachunek.

W konsoli, w ustawieniach klucza (APIs & Services → Credentials → Twój klucz):

  1. Application restrictions → Websites (HTTP referrers). Dodaj dokładnie swoje domeny, np. https://twojadomena.pl/* oraz http://localhost:*/* do testów. Klucz zadziała wtedy tylko na Twoich stronach.
  2. API restrictions. Ogranicz klucz wyłącznie do API, których używasz (np. tylko Maps JavaScript API). Klucz uniwersalny jest groźny, bo nadaje się do wszystkich płatnych usług.

Uwaga: Klucze do API wywoływanych z serwera (Geocoding, Routes, Places bez komponentów przeglądarkowych) trzymaj po stronie serwera, nigdy w kodzie frontendu. Ogranicz je przez adres IP serwera i przechowuj w zmiennych środowiskowych, a nie w repozytorium. Zasady bezpiecznego projektowania takich usług opisuje tekst Wprowadzenie do REST API.

Jeśli klucz przypadkiem wyciekł (np. trafił do publicznego repozytorium), od razu go usuń lub wygeneruj nowy i podmień — to częsty mechanizm przejmowania, pokrewny kradzieży poświadczeń opisanej przy API.

Krok 4: Kontrola kosztów

Google Maps Platform rozlicza się za liczbę zapytań, a stawki różnią się między API — inaczej liczone jest wyświetlenie mapy, inaczej geokodowanie, a inaczej wyznaczenie trasy. Jest darmowy limit miesięczny, poniżej którego nie płacisz, ale po jego przekroczeniu naliczane są opłaty.

Dokładne, aktualne stawki i wielkość darmowego limitu podaje wyłącznie oficjalny cennik Google Maps Platform — Google okresowo zmienia zarówno ceny, jak i zasady darmowego progu, dlatego nie opieraj się na liczbach z artykułów sprzed kilku lat.

Niezależnie od stawek zrób trzy rzeczy, które chronią przed niespodziewanym rachunkiem:

  1. Ustaw budżet z alertami w Billing → Budgets & alerts (np. powiadomienie przy 50%, 90% i 100% zakładanej kwoty). Alert nie zablokuje usługi, ale ostrzeże.
  2. Ustaw limity zapytań na dobę dla każdego API w APIs & Services → wybrane API → Quotas. To twarde ograniczenie, które powstrzyma lawinę opłat przy błędzie w kodzie lub ataku.
  3. Ogranicz klucz jak w kroku 3 — to jednocześnie zabezpieczenie przed kosztami generowanymi przez cudze strony.

Technicznie koszty obniżysz też, nie odświeżając mapy bez potrzeby: dla wielu statycznych podglądów taniej jest użyć Maps Static API (obrazek) niż pełnej mapy JavaScript, a przy dużej liczbie markerów stosować ich grupowanie (klastrowanie) biblioteką MarkerClusterer.

Najczęstsze problemy

  • „This page can’t load Google Maps correctly” / szara mapa.** Zwykle brak włączonej płatności, nieaktywne API albo niepoprawne ograniczenia klucza (np. zła domena w HTTP referrer). Szczegół błędu zawsze podpowiada konsola przeglądarki.
  • RefererNotAllowedMapError. Domena, z której ładujesz mapę, nie pasuje do ograniczeń klucza. Dodaj ją (pamiętaj o http://localhost:*/* przy pracy lokalnej).
  • ApiNotActivatedMapError. Nie włączyłeś danego API w projekcie.
  • Mapa niewidoczna, choć brak błędów.** Kontener nie ma wysokości w CSS.
  • Marker się nie pokazuje przy AdvancedMarkerElement.** Brak mapId w konfiguracji mapy.

Czy warto wybrać Google Maps

Google Maps API ma bardzo dobrą jakość danych, globalne pokrycie i bogate funkcje (Street View, Places, Routes), więc dla wielu projektów komercyjnych jest naturalnym wyborem. Ma jednak dwie wady: wymaga podania karty i potrafi być drogie przy dużym ruchu.

Jeśli potrzebujesz tylko prostej mapy bez funkcji Google, warto rozważyć alternatywy oparte na OpenStreetMap, np. biblioteki Leaflet lub MapLibre GL z danymi od dostawców takich jak MapTiler. Są tańsze (często z hojniejszym darmowym progiem) i otwarte, choć bez usług typu Street View czy pełnej bazy miejsc Google. Wybór zależy od tego, czy korzystasz z unikalnych danych Google, czy wystarczy Ci sama mapa. Dobrą praktyką, niezależnie od dostawcy, jest wczytywanie mapy dopiero, gdy jest potrzebna (lazy loading), bo biblioteki mapowe są ciężkie i spowalniają start strony — ich realny wpływ na czas ładowania sprawdzisz narzędziem w rodzaju WebPageTest.

Najczęściej zadawane pytania

Czy Google Maps API jest darmowe?

Nie w pełni. Google Maps Platform rozlicza się za użycie, ale ma darmowy limit miesięczny — do pewnej liczby zapytań nie płacisz, a dopiero nadwyżka jest płatna. Aby w ogóle używać API, musisz włączyć płatności i podać kartę. Aktualne limity i stawki sprawdzaj na oficjalnej stronie cennika, bo Google je zmienia.

Jak uzyskać klucz do Google Maps API?

Załóż projekt w Google Cloud Console, włącz płatności, aktywuj potrzebne API (np. Maps JavaScript API), a następnie w sekcji „Dane logowania” (APIs & Services → Credentials) utwórz klucz API i od razu ogranicz go do swoich domen i wybranych API.

Czy mogę ukryć klucz API Map Google?

Klucz do Maps JavaScript API jest zawsze widoczny w przeglądarce, więc nie da się go w pełni ukryć. Zabezpiecza się go inaczej: ograniczeniem do konkretnych domen (HTTP referrer) i tylko do używanych API. Klucze do API wywoływanych z serwera (np. Geocoding) trzymaj po stronie serwera i ogranicz po adresie IP.

Ile kosztuje Google Maps API?

Model jest oparty na liczbie zapytań, a stawki różnią się między API (inaczej liczy się wyświetlenie mapy, inaczej geokodowanie czy wyznaczanie trasy). Jest darmowy limit miesięczny, a nadwyżka jest płatna. Dokładne, aktualne ceny podaje wyłącznie oficjalny cennik Google Maps Platform.

Czym zastąpić przestarzały google.maps.Marker?

Nowym AdvancedMarkerElement z biblioteki marker. Standardowy google.maps.Marker jest oznaczony jako deprecated; nowy marker jest wydajniejszy i łatwiejszy do stylowania własnym HTML.

CZ

Autor

Czarek Zawolski

Założyciel i redaktor XAD.pl. Pisze o sieciach, bezpieczeństwie IT, administracji systemami Windows i Linux oraz o sprzęcie, który sprawia ludziom problemy na co dzień.