В этом документе представлена эталонная архитектура и пример создания визуализаций данных на карте с использованием данных о местоположении в Google Cloud BigQuery и Google Maps Platform Datasets API, например для анализа открытых муниципальных данных, создания карты покрытия телекоммуникационной сети или визуализации следов движения мобильного автопарка.
Визуализация данных на карте – это мощный инструмент, который позволяет привлекать пользователей и выявлять пространственные закономерности в данных о местоположении. Данные о местоположении – это данные, которые содержат объекты в виде точек, линий или многоугольников. Например, карты погоды помогают пользователям планировать поездки и готовиться к штормам, карты бизнес-аналитики – получать ценную информацию из анализа данных, а телекоммуникационные карты – узнавать о покрытии и качестве связи провайдеров в определенной зоне обслуживания.
Однако разработчикам приложений сложно создавать большие визуализации картографических данных, которые были бы эффективными и обеспечивали бы удобство работы пользователей. Большие объемы данных необходимо загружать в память на стороне клиента, что замедляет первую загрузку карты. Визуальный контент должен хорошо работать на всех устройствах, включая мобильные телефоны низкого ценового сегмента, у которых есть ограничения по памяти и графическому процессору. Наконец, разработчикам нужно выбрать библиотеку для рендеринга больших объемов данных, которая будет портативной, надежной и производительной.
Эталонная архитектура
Для разработки приложений с визуализацией больших объемов данных требуются два основных компонента.
- Бэкенд клиента – все данные приложения и сервисы бэкенда, например обработка и хранение.
- Клиент клиента – пользовательский интерфейс вашего приложения с компонентом визуализации карты.
Ниже приведена схема системы, показывающая, как эти два компонента взаимодействуют с пользователем приложения, Google Cloud и платформой Google Карт, чтобы создать приложение для визуализации больших данных.

Рекомендации по дизайну
При создании эффективной визуализации данных с помощью Google Cloud и платформы Google Карт необходимо учитывать ряд факторов.
- Размер исходных данных и частота обновлений.
- Если исходные данные в формате GeoJSON занимают менее 5 МБ или часто обновляются (например, прогноз погоды в реальном времени), рекомендуем передавать их в виде объекта GeoJSON на стороне клиента в приложении и отрисовывать с помощью слоя deck.gl.
- Если размер ваших данных превышает 5 МБ и они обновляются не чаще одного раза в час, используйте архитектуру Datasets API, описанную в этом документе.
- Наборы данных поддерживают файлы размером до 350 МБ.
- Если размер данных превышает 350 МБ, попробуйте удалить или упростить геометрические данные в исходном файле, прежде чем передавать его в наборы данных (см. раздел "Удаление данных" ниже).
- Схема и формат
- Убедитесь, что у каждого объекта в ваших данных есть свойство с глобально уникальным идентификатором. Уникальный идентификатор позволяет выбрать определенный объект и задать для него стиль или объединить данные с объектом для визуализации, например задать стиль для выбранного объекта при событии клика.
- Отформатируйте данные в виде файла CSV или GeoJSON в соответствии со спецификацией Datasets API, указав допустимые названия столбцов, типы данных и типы объектов GeoJSON.
- Чтобы упростить создание наборов данных из BigQuery, создайте столбец с названием
wktв экспортируемом CSV-файле SQL. Наборы данных поддерживают импорт геометрии из CSV-файла в формате Well-Known Text (WKT) из столбца с названиемwkt. - Убедитесь, что данные имеют допустимую геометрию и типы. Например, GeoJSON должен быть в системе координат WGS84, с порядком обхода геометрии и т. д.
- Чтобы проверить, все ли геометрические объекты в исходном файле действительны, используйте такой инструмент, как geojson-validate. Для преобразования исходного файла в другой формат или систему координат можно использовать ogr2ogr.
- Удаление данных
- Используйте как можно меньше свойств объектов. Вы можете добавлять дополнительные свойства к объекту во время выполнения, используя уникальный идентификатор (пример).
- По возможности используйте целочисленные типы данных для объектов свойств, чтобы минимизировать пространство для хранения тайлов и обеспечить их эффективную загрузку по протоколу HTTPS в клиентском приложении.
- Упростите и/или агрегируйте очень сложные геометрии объектов. Попробуйте использовать функции BigQuery, такие как ST_Simplify, для сложных геометрий полигонов, чтобы уменьшить размер исходного файла и повысить производительность карты.
- Мозаика
- Google Maps Datasets API создает фрагменты карты из исходного файла данных для использования с Maps SDK для веб-приложений или мобильных устройств.
- Фрагменты карты – это система индексирования на основе масштаба, которая позволяет более эффективно загружать данные в визуальное приложение.
- При низких уровнях масштабирования на фрагментах карты могут не отображаться плотно расположенные или сложные объекты. При уменьшении масштаба до уровня области или страны (например, уровни 5–12) карта может выглядеть иначе, чем при увеличении до уровня города или района (например, уровни 13–18).
Пример. Железные дороги в Лондоне
В этом примере мы применим эталонную архитектуру, чтобы создать веб-приложение с Google Cloud и Google Картами, которое визуализирует все железные дороги в Лондоне на основе данных Open Street Map (OSM).
Требования
- Доступ к изолированной среде BigQuery и Cloud Console.
- Убедитесь, что у вас настроен облачный проект Google Cloud и платежный аккаунт.
Шаг 1. Запросите данные в BigQuery
Перейдите в раздел BigQuery Public Datasets. Набор данных bigquery-public-data и таблица geo_openstreetmap.planet_features содержат все данные Open Street Map (OSM) со всеми возможными объектами. Ознакомьтесь со всеми доступными функциями для запросов в OSM Wiki, включая amenity, road и landuse.
Используйте Cloud Shell или консоль BigQuery Cloud, чтобы отправить запрос к таблице с помощью SQL. В приведенном ниже фрагменте кода используется команда bq query, которая запрашивает все железные дороги, отфильтрованные по Лондону с помощью граничной рамки и функции ST_Intersects().
Чтобы выполнить этот запрос из Cloud Shell, запустите следующий фрагмент кода, указав идентификатор проекта, набор данных и название таблицы для вашей среды.
bq query --use_legacy_sql=false \
--destination_table PROJECTID:DATASET.TABLENAME \
--replace \
'SELECT
osm_id,
feature_type,
(SELECT value
FROM unnest(all_tags)
WHERE KEY = "name") AS name,
(SELECT value
FROM unnest(all_tags)
WHERE KEY = "railway") AS railway,
geometry as wkt
FROM bigquery-public-data.geo_openstreetmap.planet_features
WHERE ("railway") IN (SELECT key FROM unnest(all_tags))
AND ST_Intersects(
geometry,
ST_MakePolygon(ST_MakeLine(
[ST_GeogPoint(-0.549370, 51.725346),
ST_GeogPoint(-0.549370, 51.2529407),
ST_GeogPoint(0.3110581, 51.25294),
ST_GeogPoint(0.3110581, 51.725346),
ST_GeogPoint(-0.549370, 51.725346)]
))
)'
Запрос возвращает:
- уникальный идентификатор для каждого объекта;
osm_id feature_type, например точки, линии и т.д.nameфункции, напримерPaddington Station.- Тип
railway, например "основной", "туризм", "военный" и т.д. wktобъекта – точка, линия или многоугольник в формате WKT. WKT – это стандартный формат данных, который возвращают столбцы BigQuery Geography в запросе.
Примечание. Чтобы визуально проверить результаты запроса перед созданием набора данных, вы можете быстро визуализировать данные на панели управления из BigQuery с помощью Looker Studio.
Чтобы экспортировать таблицу в CSV-файл в сегменте Google Cloud Storage, используйте команду bq extract в Cloud Shell:
bq extract \
--destination_format "CSV" \
--field_delimiter "," \
--print_header=true \
PROJECTID:DATASET.TABLENAME \
gs://BUCKET/FILENAME.csv
Примечание. Вы можете автоматизировать каждый шаг с помощью Cloud Scheduler, чтобы регулярно обновлять данные.
Шаг 2. Создайте набор данных из CSV-файла
Затем создайте набор данных платформы Google Карт на основе результатов запроса в Google Cloud Storage (GCS). С помощью Datasets API можно создать набор данных, а затем загрузить в него данные из файла, размещенного в GCS.
Чтобы начать работу, включите Maps Datasets API в облачном проекте Google Cloud и ознакомьтесь с документацией по API. Для вызова Datasets API из логики в серверной части приложения есть клиентские библиотеки Python и Node.js. Кроме того, в Cloud Console есть графический интерфейс для создания наборов данных вручную.
После завершения загрузки вы можете посмотреть набор данных в графическом интерфейсе.

Шаг 4. Свяжите набор данных с идентификатором карты
После создания набора данных вы можете создать идентификатор карты со связанным стилем карты. В редакторе стилей карт можно связать идентификатор mapId и стиль с набором данных. Здесь же можно применить облачные стили карт, чтобы настроить внешний вид карты.
Шаг 5. Создайте визуализацию карты в клиентском приложении
Наконец, вы можете добавить набор данных в клиентское приложение для визуализации данных с помощью Maps JS API. Инициализируйте объект карты, используя идентификатор карты, связанный с набором данных на предыдущем шаге. Затем настройте стиль и интерактивность слоя набора данных. Подробную информацию вы найдете в руководстве по стилям на основе данных для наборов данных.
Вы можете настроить стиль, добавить обработчики событий для динамического изменения стиля и многое другое с помощью Maps JS API. Примеры приведены в документации. Ниже мы определим функцию setStyle, чтобы создать стиль объектов точек и линий для этого примера на основе атрибута feature_type.
function setStyle(params) {
const map.getDatasetFeatureLayer("your-dataset-id");
const datasetFeature = params.feature;
const type = datasetFeature.datasetAttributes["feature_type"];
if (type == "lines") {
return {
fillColor: "blue",
strokeColor: "blue",
fillOpacity: 0.5,
strokeWeight: 1,
}
} else if (type == "points") {
return {
fillColor: "black",
strokeColor: "black",
strokeOpacity: 0.5,
pointRadius: 2,
fillOpacity: 0.5,
strokeWeight: 1,
}
}
}
При инициализации в одностраничном веб-приложении приведенный выше код создает следующую визуализацию данных карты:

Вы можете расширить визуализацию карты в функции setStyle(), добавив логику для фильтрации объектов, стили на основе взаимодействия с пользователем и взаимодействие с остальной частью приложения.
Заключение
В этом документе мы рассмотрели эталонную архитектуру и пример реализации приложения для визуализации больших данных с помощью Google Cloud и платформы Google Карт. Используя эту эталонную архитектуру, вы можете создавать приложения для визуализации данных о местоположении на основе любых данных в Google Cloud BigQuery, которые работают на любом устройстве, с помощью Google Maps Datasets API.
Дальнейшие действия
Что ещё почитать:
- Документация по Google Maps Platform Datasets API
- Просмотр данных в реальном времени с помощью стилей на основе данных
- Введение в геопространственную аналитику в BigQuery
- Использование GeoJSON в BigQuery для геопространственной аналитики
Авторы
Основные авторы:
- Райан Бауманн (Ryan Baumann), менеджер по разработке решений для платформы Google Карт