В этом документе описывается, почему и как реализовать динамическую стилизацию Google Boundaries на основе данных с использованием API JavaScript Карт, что полезно для различных вариантов использования в разных отраслях и сегментах.
Анимированное количество такси в Нью-Йорке по почтовым индексам (симуляция, покадровая съемка):


Управляемый данными стиль — это возможность платформы Google Maps, которая позволяет вам использовать административные границы полигонов Google, применять стиль к этим полигонам для отображения на ваших картах и объединять ваши собственные данные для создания насыщенных, настраиваемых карт, которые можно использовать для визуального анализа и улучшенного понимания ваших данных. В этом документе будут рассмотрены некоторые варианты использования, которые объясняют, почему и как вы можете визуализировать свои данные с помощью управляемого данными стиля на карте в режиме, близком к реальному времени, путем интеграции динамических каналов данных.
Управляемый данными стиль позволяет создавать карты, которые показывают географическое распределение данных, динамически настраивать стиль полигонов и взаимодействовать с вашими данными через события щелчка. Эти функции можно использовать для создания информативных и интересных карт для различных вариантов использования и отраслей.
Вот несколько примеров вариантов использования, которые могут быть применимы к карте, отображающей динамические обновления данных в стиле, управляемом данными:
- Совместное пользование поездками: обновления в режиме реального времени могут использоваться для выявления зон с высоким спросом. В этом случае некоторые поставщики услуг могут устанавливать резкие скачки цен.
- Транспорт: обновления в режиме реального времени можно использовать для выявления районов с заторами, что поможет определить наилучшие альтернативные маршруты.
- Выборы: В ночь выборов данные опросов в режиме реального времени можно использовать для визуализации результатов по мере их поступления.
- Безопасность работников: обновления в режиме реального времени можно использовать для отслеживания событий по мере их развития, выявления зон повышенного риска и предоставления ситуационной осведомленности спасателям на местах.
- Погода: обновления в режиме реального времени можно использовать для отслеживания перемещения штормов, выявления текущих опасностей, а также предоставления предупреждений и оповещений.
- Окружающая среда: обновления в режиме реального времени можно использовать для отслеживания перемещения вулканического пепла и других загрязняющих веществ, выявления областей ухудшения состояния окружающей среды и мониторинга воздействия деятельности человека.
Во всех этих ситуациях клиенты могут получить дополнительную выгоду, объединив свои потоки данных в реальном времени с границами Google, чтобы быстро и легко визуализировать свои данные на карте, что дает им супервозможность практически мгновенного получения информации для принятия более обоснованных решений.
Архитектурный подход к решению
Теперь давайте рассмотрим создание карты с использованием стилизации Data-driven для визуализации динамических данных. Как было показано ранее, вариант использования — это количество такси Нью-Йорка, визуализированное по почтовому индексу. Это может быть полезно для пользователей, чтобы понять, насколько легко будет поймать такси.
Ниже представлена схема архитектуры приложения данного подхода:

Динамическое решение для стилизации на основе данных
Теперь давайте рассмотрим шаги, необходимые для реализации динамической карты-карты стилей, управляемых данными, для вашего набора данных.
Это решение позволяет визуализировать гипотетический набор данных о плотности такси в реальном времени вокруг Нью-Йорка по почтовому индексу. Хотя это могут быть не реальные данные, они имеют реальные приложения и дают вам представление о силе и возможностях визуализации динамических данных на карте с помощью стилизации на основе данных.
Шаг 1: Выберите данные для визуализации и прикрепите их к границе Place ID
Первый шаг — определить данные, которые вы хотите отобразить, и убедиться, что они могут быть сопоставлены с границами Google. Вы можете выполнить это сопоставление на стороне клиента, вызвав метод обратного вызова findPlaceFromQuery для каждого postalCode. Обратите внимание, что почтовые индексы в США имеют отдельные названия, но на других административных уровнях их нет. Вам нужно будет убедиться, что вы выбрали правильный идентификатор места для своего запроса в случаях, когда могут быть неоднозначные результаты.
const request = {
query: postalCode,
fields: ['place_id'],
};
function findPlaceId() {
placesService.findPlaceFromQuery(request, function (results, status) {
if (status === google.maps.places.PlacesServiceStatus.OK) {
console.log(results[0]);
}
});
}
Если ваши данные содержат значения широты и долготы, вы также можете использовать API геокодирования с фильтрацией компонентов, чтобы преобразовать эти значения широты/долготы в значения Place ID для интересующего вас слоя объектов. В этом примере вы будете стилизовать слой объектов POSTAL_CODE.
Шаг 2: Подключитесь к данным в реальном времени
Существует множество способов подключения к источникам данных, и наилучшая реализация будет зависеть от ваших конкретных потребностей и технической инфраструктуры. В этом случае предположим, что ваши данные находятся в таблице BigQuery с двумя столбцами: «zip_code» и «taxi_count», и вы будете запрашивать их через Firebase Cloud Function .
async function queryNycTaxis() {
// Queries the NYC Taxis dataset.
// Create a client
const bigqueryClient = new BigQuery();
// The SQL query to run
const sqlQuery = 'SELECT zip_code, taxi_count
FROM \'YOUR_DATASET_ID.TABLE\' LIMIT 100';
const options = {
query: sqlQuery,
// Location must match that of the dataset(s)
// referenced in the query.
location: 'US',
};
// Run the query
const [rows] = await bigqueryClient.query(options);
rows.forEach(row => {
const postalCode = row['zip_code'];
const taxiCount = row['taxi_count'];
});
}
Далее вам нужно убедиться, что вы поддерживаете актуальность данных. Один из способов сделать это — вызвать указанный выше запрос с помощью веб-воркера и установить таймер для обновления данных с помощью функции setInterval . Вы можете установить интервал на соответствующее значение, например, обновлять карту каждые 15 секунд. Каждый раз, когда проходит интервал времени, веб-воркер будет запрашивать обновленные значения taxiCount для каждого postalCode.
Теперь, когда мы можем запрашивать и обновлять данные, давайте убедимся, что внешний вид полигонов карты отражает эти изменения.
Шаг 3: Оформите карту с помощью стилей на основе данных
Теперь, когда у вас есть динамические значения данных, необходимые для создания и применения визуального стиля к границам почтовых индексов в экземпляре JavaScript Карт в виде объекта JSON, пришло время придать ему некоторый стиль в виде картограммы .
В этом примере вы стилизуете карту на основе количества такси в каждом почтовом индексе, давая вашим пользователям ощущение плотности такси и доступности в их районе. Стиль будет меняться в зависимости от значений количества такси. К областям с наименьшим количеством такси будет применен фиолетовый стиль, а цветовой градиент будет проходить через красный, оранжевый и закончится на желтом такси NYC для областей с самой высокой плотностью. Для этой цветовой схемы вы примените эти цветовые значения к fillColor и strokeColor. Установка fillOpacity на 0,5 позволит вашим пользователям видеть базовую карту, а установка strokeOpacity на 1,0 позволит им различать границы многоугольников одного цвета:
const featureLayer = map.getFeatureLayer(
google.maps.FeatureType.POSTAL_CODE
);
featureLayer.style = (featureStyleFunctionOptions) => {
const placeFeature = featureStyleFunctionOptions.feature;
// taxiCount per (postal_code) PlaceID
const taxiCount = zips[placeFeature.placeId];
let fillColor;
let strokeColor;
// Apply colors to features based on taxiCount values
if (taxiCount < 8) {
fillColor = "#571845";
strokeColor = "#571845";
} else if (taxiCount < 13) {
fillColor = "#900c3e";
strokeColor = "#900c3e";
} else if (taxiCount < 21) {
fillColor = "#c60039";
strokeColor = "#c60039";
} else if (taxiCount < 34) {
fillColor = "#fe5733";
strokeColor = "#fe5733";
// keep else if or the whole map gets this style with else
} else if (taxiCount >= 34) {
fillColor = "#fec30f";
strokeColor = "#fec30f";
}
return {
fillColor,
strokeColor,
fillOpacity: 0.5,
strokeOpacity: 1.0,
};
Заключение
Управляемый данными стиль для границ Google открывает возможность использовать ваши данные для стилизации вашей карты для различных реализаций в различных отраслях и сегментах. Подключение к данным в реальном времени позволяет вам сообщать о том, что происходит, где это происходит и как это происходит. Эта возможность имеет потенциал раскрыть ценность ваших данных в реальном времени и помочь вашим пользователям лучше понимать их в реальном времени, в реальном мире.
Следующие действия
- Посмотрите вебинар «Как использовать стили на основе данных для стилизации границ карт Google» .
- Выведите визуализацию на новый уровень с помощью событий щелчка для стилизации на основе данных.
- Рассмотрите возможность добавления расширенных маркеров на вашу карту.
Участники
Основной автор:
Джим Лефлар | Инженер по решениям платформы Google Maps