Фрагменты карты – это просто деление мира на индексированную сетку. Она позволяет эффективно и динамически получать доступ к данным карт и использовать их в различных картографических масштабах. Map Tiles API предоставляет доступ к нескольким тематическим наборам геоданных, в том числе к следующим наборам, подготовленным Google:
Фрагменты изображений дорожной карты на основе векторных топографических данных с картографическим стилем Google.
Ортофотографии, сделанные спутниковыми и бортовыми камерами, которые обеспечивают съемку Земли сверху вниз (надир).
Контурные карты с отмывкой рельефа.
Все двумерные фрагменты карт имеют географическую привязку и выровнены относительно друг друга. Они выбираются на основе географического охвата области просмотра и уровня масштабирования. Уровни масштабирования варьируются от 0 (карта всего мира) до 22 (улицы и кварталы).
Темы карт
Вы можете получить фрагменты карт для следующих тем.
| Тема карты | Описание |
|---|---|
| План развития | Дороги, здания, объекты инфраструктуры и политические границы |
| Спутник | Фотографии, сделанные из космоса. |
| Рельеф | Контурная карта, на которой показаны природные объекты, например растительность |
Чтобы запросить фрагменты карты из Map Tiles API, сначала нужно запросить токен сеанса. Токен сеанса отслеживает текущее состояние карты и области просмотра. При настройке токена сеанса необходимо задать значение mapType, соответствующее нужной теме карты.
Затем вы должны включать токен сеанса в каждый запрос к Map Tiles API.
Запросы информации об области просмотра
Область просмотра определяет размер рамки, в которой отображается сцена. Запросы информации об области просмотра возвращают сведения о фрагментах карты, которые составляют текущую область просмотра. Запрашивать информацию об области просмотра нужно для того, чтобы не запрашивать изображения с несуществующими уровнями масштабирования.
Например, для большинства городов доступны изображения с уровнем масштабирования 22, но для океана – нет, поскольку в этом случае на экране будут отображаться только синие квадраты.
Запрос области просмотра – это HTTPS-запрос GET в следующем формате:
curl "https://tile.googleapis.com/tile/v1/viewport?session=YOUR_SESSION_TOKEN &key=YOUR_API_KEY &zoom=zoom &north=north &south=south &east=east &west=west"
Запрос содержит следующие поля:
zoom- Уровень масштабирования области просмотра.
north,south,east,west- Самые северные, южные, восточные и западные точки в области просмотра, выраженные в градусах. Значения для севера и юга должны находиться в диапазоне от -90 до 90, а для востока и запада – от -180 до 180. Чтобы указать границы, пересекающие антимеридиан, можно задать положительное значение для запада (например, 170) и отрицательное для востока (например, -170). Все параметры обязательны.
Ответы с информацией об области просмотра
В ответе на запрос области просмотра указывается, для каких областей и на каких уровнях масштабирования доступны изображения. Ответ с информацией об области просмотра имеет следующий формат.
{
"copyright": "Map data ©2023",
"maxZoomRects": [
{
"maxZoom": 19,
"north": 90,
"south": -90,
"east": 180,
"west": -180
},
{
"maxZoom": 9,
"north": 90,
"south": -90,
"east": 180,
"west": -180
},
{
"maxZoom": 14,
"north": 84.375,
"south": -84.375,
"east": 180,
"west": -180
}, ...
]
}
Тело ответа содержит следующие поля.
copyright- Содержит строку с указанием авторства, которую необходимо показывать на карте вместе с фрагментами схемы и спутниковых снимков. Подробную информацию вы найдете в правилах Map Tiles API.
maxZoomRect- Содержит массив ограничивающих прямоугольников, которые перекрываются с текущей областью просмотра. Также содержит максимальный уровень масштабирования, доступный в каждом прямоугольнике.
Функции координат фрагмента
В большинстве языков программирования есть инструменты (простые функции) для преобразования пар широты и долготы в координаты фрагмента при определенном уровне масштабирования.
Рассмотрим следующий пример кода JavaScript, который сначала преобразует latLng в точку, а затем точку – в координаты фрагмента.
var TILE_SIZE = 256;
function fromLatLngToPoint(latLng) {
var mercator = -Math.log(Math.tan((0.25 + latLng.lat() / 360) * Math.PI));
return {
x: TILE_SIZE * (latLng.lng() / 360 + 0.5),
y: TILE_SIZE / 2 * (1 + mercator / Math.PI)
};
}
function fromLatLngToTileCoord(latLng, zoom) {
var point = fromLatLngToPoint(latLng);
var scale = Math.pow(2, zoom);
return {
x: Math.floor(point.x * scale / TILE_SIZE),
y: Math.floor(point.y * scale / TILE_SIZE),
z: zoom
};
}