JavaRush /Курсы /Модуль 4: FastAPI /Работа с Google Maps API: получение и отображение геоданн...

Работа с Google Maps API: получение и отображение геоданных

Модуль 4: FastAPI
17 уровень , 5 лекция
Открыта

Google Maps API предоставляет набор возможностей для работы с географическими данными. Вы можете:

  • Геокодировать адреса в координаты (и наоборот).
  • Создавать маршруты между точками.
  • Отображать карты в веб-приложениях, включая карты с маркерами, полигонами или маршрутами.

Например, вы хотите создать приложение для заказа доставки еды. Вам нужно определить координаты клиента по адресу, показать их на карте, найти ближайшую кухню и построить маршрут доставки. Google Maps API — идеальный инструмент для таких задач!

Что нам понадобится?

Для работы с Google Maps API нам понадобятся:

  1. API-ключ, который нужно сгенерировать в Google Cloud Console.
  2. Понимание основных возможностей API — мы будем работать с геокодированием и отображением карт.
  3. Немного магии асинхронного программирования через FastAPI.

Получение геоданных с помощью Geocoding API

Геокодирование — это процесс преобразования текстового адреса (например, "ул. Вязов, 10, Кентербери") в координаты (широта и долгота). Это основа для работы с геоданными.

Настройка API-ключа

Перед началом работы вам нужно сгенерировать API-ключ:

  1. Перейдите в Google Cloud Console.
  2. Создайте новый проект или выберите существующий.
  3. Активируйте Geocoding API в разделе API и службы.
  4. Создайте API-ключ в разделе "Учетные данные" и сохраните его.

Установка httpx

Мы будем использовать библиотеку httpx для отправки асинхронных HTTP-запросов. Установите её, если ещё не сделали этого:

pip install httpx

Пример получения геоданных

Теперь создадим FastAPI-эндпоинт для преобразования адреса в координаты:


from fastapi import FastAPI, HTTPException
import httpx

app = FastAPI()

GOOGLE_MAPS_API_KEY = "ваш_ключ_сюда"

@app.get("/geocode/")
async def geocode(address: str):
    """Эндпоинт для получения координат по адресу."""
    url = f"https://maps.googleapis.com/maps/api/geocode/json"
    params = {
        "address": address,
        "key": GOOGLE_MAPS_API_KEY
    }
    
    async with httpx.AsyncClient() as client:
        response = await client.get(url, params=params)
        if response.status_code != 200:
            raise HTTPException(status_code=response.status_code, detail="Ошибка при запросе к Geocoding API")
        
        data = response.json()
        if "results" not in data or len(data["results"]) == 0:
            raise HTTPException(status_code=404, detail="Адрес не найден")
        
        location = data["results"][0]["geometry"]["location"]
        return {"latitude": location["lat"], "longitude": location["lng"]}

Как это работает?

  1. Пользователь отправляет GET-запрос на /geocode/ с параметром address.
  2. Мы отправляем запрос к Geocoding API с этим адресом.
  3. Получаем координаты и возвращаем их пользователю.

Пример запроса:

curl "http://localhost:8000/geocode/?address=улица Ленина, Москва"

Пример ответа:

{
  "latitude": 55.755826,
  "longitude": 37.6173
}

Отображение геоданных в веб-приложении

  • Встраивание Google Maps в приложение.
    Отображение карты осуществляется через JavaScript API. Для этого мы передадим координаты и ключ API в фронтенд (или HTML-страницу).
  • Генерация карты с маркерами.
    Создадим HTML-страницу для показа карты:

<!DOCTYPE html>
<html>
  <head>
    <title>Google Maps Example</title>
    <script src="https://maps.googleapis.com/maps/api/js?key=ваш_ключ_сюда"></script>
    <script>
      function initMap() {
        const location = { lat: 55.755826, lng: 37.6173 }; // Пример: Москва
        const map = new google.maps.Map(document.getElementById("map"), {
          zoom: 10,
          center: location,
        });
        const marker = new google.maps.Marker({
          position: location,
          map: map,
        });
      }
    </script>
  </head>
  <body onload="initMap()">
    <div id="map" style="height: 500px; width: 100%;"></div>
  </body>
</html>

После загрузки страницы карта отображается с маркером по указанным координатам.

  • Интеграция с FastAPI.
    Теперь создадим эндпоинт, который будет возвращать карту с заданным адресом.

from fastapi.responses import HTMLResponse

@app.get("/map/", response_class=HTMLResponse)
async def map_page(address: str):
    """Возвращает карту с маркером для указанного адреса."""
    # Получаем координаты
    coordinates = await geocode(address)
    html_content = f"""
    <!DOCTYPE html>
    <html>
      <head>
        <title>Google Maps Example</title>
        <script src="https://maps.googleapis.com/maps/api/js?key={GOOGLE_MAPS_API_KEY}"></script>
        <script>
          function initMap() {{
            const location = {{ lat: {coordinates['latitude']}, lng: {coordinates['longitude']} }};
            const map = new google.maps.Map(document.getElementById("map"), {{
              zoom: 10,
              center: location,
            }});
            const marker = new google.maps.Marker({{
              position: location,
              map: map,
            }});
          }}
        </script>
      </head>
      <body onload="initMap()">
        <div id="map" style="height: 500px; width: 100%;"></div>
      </body>
    </html>
    """
    return HTMLResponse(content=html_content)

Пример запроса:

curl "http://localhost:8000/map/?address=улица Ленина, Москва"

Частые ошибки и их обработка

Давайте разберёмся, где всё может пойти не так:

  1. Неверный API-ключ. Если вы видите, что API возвращает "API key not valid", проверьте, активированы ли все необходимые API.
  2. Лимиты запросов. У Google Maps есть квоты на количество запросов. Для больших систем используйте стратегии кеширования.
  3. Пустые результаты. Если адрес некорректный, API может вернуть пустой список результатов. Всегда проверяйте статус ответа.

Практическое применение

Знания из этой лекции открывают множество возможностей:

  • Создание приложений для доставки, такси или курьерской службы.
  • Разработка географических информационных систем (ГИС).
  • Интеграция карт в личные проекты, такие как трекеры путешествий.

Если вам кажется, что что-то упущено, не переживайте. Мы ещё будем углубляться в асинхронную обработку запросов и оптимизацию API в следующих лекциях. А пока — вперёд, прокладывать маршруты и навигации! 🚀

1
Задача
Модуль 4: FastAPI, 17 уровень, 5 лекция
Недоступна
Получение координат
Получение координат
1
Задача
Модуль 4: FastAPI, 17 уровень, 5 лекция
Недоступна
Геокодирование и отображение карты
Геокодирование и отображение карты
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ