Google Maps API предоставляет набор возможностей для работы с географическими данными. Вы можете:
- Геокодировать адреса в координаты (и наоборот).
- Создавать маршруты между точками.
- Отображать карты в веб-приложениях, включая карты с маркерами, полигонами или маршрутами.
Например, вы хотите создать приложение для заказа доставки еды. Вам нужно определить координаты клиента по адресу, показать их на карте, найти ближайшую кухню и построить маршрут доставки. Google Maps API — идеальный инструмент для таких задач!
Что нам понадобится?
Для работы с Google Maps API нам понадобятся:
- API-ключ, который нужно сгенерировать в Google Cloud Console.
- Понимание основных возможностей API — мы будем работать с геокодированием и отображением карт.
- Немного магии асинхронного программирования через FastAPI.
Получение геоданных с помощью Geocoding API
Геокодирование — это процесс преобразования текстового адреса (например, "ул. Вязов, 10, Кентербери") в координаты (широта и долгота). Это основа для работы с геоданными.
Настройка API-ключа
Перед началом работы вам нужно сгенерировать API-ключ:
- Перейдите в Google Cloud Console.
- Создайте новый проект или выберите существующий.
- Активируйте Geocoding API в разделе API и службы.
- Создайте 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"]}
Как это работает?
- Пользователь отправляет GET-запрос на
/geocode/с параметромaddress. - Мы отправляем запрос к Geocoding API с этим адресом.
- Получаем координаты и возвращаем их пользователю.
Пример запроса:
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=улица Ленина, Москва"
Частые ошибки и их обработка
Давайте разберёмся, где всё может пойти не так:
- Неверный API-ключ. Если вы видите, что API возвращает "API key not valid", проверьте, активированы ли все необходимые API.
- Лимиты запросов. У Google Maps есть квоты на количество запросов. Для больших систем используйте стратегии кеширования.
- Пустые результаты. Если адрес некорректный, API может вернуть пустой список результатов. Всегда проверяйте статус ответа.
Практическое применение
Знания из этой лекции открывают множество возможностей:
- Создание приложений для доставки, такси или курьерской службы.
- Разработка географических информационных систем (ГИС).
- Интеграция карт в личные проекты, такие как трекеры путешествий.
Если вам кажется, что что-то упущено, не переживайте. Мы ещё будем углубляться в асинхронную обработку запросов и оптимизацию API в следующих лекциях. А пока — вперёд, прокладывать маршруты и навигации! 🚀
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ