Чтобы применить стили контура и заливки к многоугольникам границ на слое объектов, выполните следующие действия:
Создайте функцию фабрики стилей, которая реализует интерфейс
FeatureLayer.StyleFactory. Эта функция определяет логику применения стиля к слою объектов.Вызовите метод
FeatureLayer.setFeatureStyle(), чтобы применить функцию фабрики стилей к слою объектов.
Ниже показан пример карты, на которой выделен многоугольник границы одного региона на слое объектов населенного пункта.
Как создать функцию стиля
Функция фабрики стилей применяется к каждому многоугольнику на указанном слое объектов в тот момент, когда вы задаете функцию для слоя объектов. Эта функция должна возвращать объект FeatureStyle, который определяет стиль многоугольника.
Maps SDK для Android передает экземпляр Feature в функцию фабрики стилей. Экземпляр Feature представляет метаданные объекта, предоставляя вам доступ к метаданным в функции фабрики стилей.
Каждое применение функции стиля должно приводить к одинаковым результатам. Например, если вы хотите покрасить набор объектов случайными цветами, часть кода, с помощью которой они выбираются, должна находиться за пределами функции стиля объектов, поскольку иначе результат будет отличаться от предполагаемого.
Эта функция обрабатывает все объекты на слое, поэтому важную роль играет оптимизация. Чтобы время отрисовки не увеличивалось:
Включите только нужные слои объектов.
Если слой объектов больше не используется, вызовите
FeatureLayer.setFeatureStyle(null).
Как настроить контур и заливку многоугольника
Применяя стиль к многоугольнику границы в функции фабрики стилей, вы можете задать:
Цвет и прозрачность контура границы многоугольника в формате ARGB, как определено классом
Color. Значение по умолчанию – прозрачный (0x00000000).Толщина контура границы многоугольника в пикселях экрана. Значение по умолчанию – 2.
Цвет заливки и прозрачность многоугольника в формате ARGB, как определено классом
Color. Значение по умолчанию – прозрачный (0x00000000).
Как найти идентификаторы места для целевых объектов
Во многих приложениях стили применяются к объекту в зависимости от его местоположения. Например, вы можете применить стили к разным странам, территориям или регионам. Местоположение объекта задается идентификатором места.
Идентификатор места однозначно идентифицирует его в базе данных Google Places и на Google Картах. Чтобы получить идентификатор места:
- Используйте Places API и геокодирование, чтобы искать регионы по названию и получать идентификаторы мест для регионов в определенных границах.
- Получайте данные из событий кликов. Результатом будет объект, соответствующий региону, на который нажал пользователь, и содержащий идентификатор места и категорию типа объекта.
Покрытие зависит от региона. Подробнее об административных границах…
Географические названия доступны из множества разных источников, например из данных Совета США по географическим названиям и географических справочников США.
Как получить идентификатор места с помощью PlaceFeature
Класс PlaceFeature является подклассом класса Feature.
Он представляет собой объект места (объект с идентификатором места), который включает объекты типов ADMINISTRATIVE_AREA_LEVEL_1, ADMINISTRATIVE_AREA_LEVEL_2, COUNTRY, LOCALITY, POSTAL_CODE и SCHOOL_DISTRICT.
Если идентификатор места доступен, Maps SDK для Android передает экземпляр PlaceFeature в функцию фабрики стилей, чтобы вы могли определить местоположение объекта.
Пример фабрики стилей
В этом примере функция стиля применяется к многоугольнику в слое объектов "Населенный пункт". Функция стиля определяет идентификатор места объекта с помощью экземпляра PlaceFeature. Если идентификатор места соответствует городу Хана на Гавайях, функция применяет к многоугольнику собственный стиль заливки и контура:
Если вы этого ещё не сделали, создайте новый идентификатор карты и стиль карты, следуя инструкциям в статье Начало работы. Обязательно включите слой объектов Населенный пункт.
Получите ссылку на слой объектов населенного пункта после инициализации карты.
Java
private FeatureLayer localityLayer;
@Override public void onMapReady(GoogleMap map) { // Get the LOCALITY feature layer. localityLayer = map.getFeatureLayer(new FeatureLayerOptions.Builder() .featureType(FeatureType.LOCALITY) .build());
// Apply style factory function to LOCALITY layer. styleLocalityLayer(); }Kotlin
private var localityLayer: FeatureLayer? = null
override fun onMapReady(googleMap: GoogleMap) { // Get the LOCALITY feature layer. localityLayer = googleMap.getFeatureLayer(FeatureLayerOptions.Builder() .featureType(FeatureType.LOCALITY) .build())
// Apply style factory function to LOCALITY layer. styleLocalityLayer() }Создайте функцию фабрики стилей и примените ее к слою объектов "Населенный пункт".
В примере ниже функция применяется, только если идентификатор места объекта соответствует городу Хана на Гавайях ("ChIJ0zQtYiWsVHkRk8lRoB1RNPo"). Если указанный идентификатор места не относится к Хане (Гавайи), стиль не применяется.
Java
private void styleLocalityLayer() {
// Create the style factory function. FeatureLayer.StyleFactory styleFactory = (Feature feature) -> {
// Check if the feature is an instance of PlaceFeature, // which contains a place ID. if (feature instanceof PlaceFeature) { PlaceFeature placeFeature = (PlaceFeature) feature;
// Determine if the place ID is for Hana, HI. if (placeFeature.getPlaceId().equals("ChIJ0zQtYiWsVHkRk8lRoB1RNPo")) {
// Use FeatureStyle.Builder to configure the FeatureStyle object // returned by the style factory function. return new FeatureStyle.Builder() // Define a style with purple fill at 50% opacity and solid purple border. .fillColor(0x80810FCB) .strokeColor(0xFF810FCB) .build(); } } return null; };
// Apply the style factory function to the feature layer. localityLayer.setFeatureStyle(styleFactory); }Kotlin
private fun styleLocalityLayer() {
// Create the style factory function. val styleFactory = FeatureLayer.StyleFactory { feature: Feature ->
// Check if the feature is an instance of PlaceFeature, // which contains a place ID. if (feature is PlaceFeature) { val placeFeature: PlaceFeature = feature as PlaceFeature
// Determine if the place ID is for Hana, HI. if (placeFeature.getPlaceId().equals("ChIJ0zQtYiWsVHkRk8lRoB1RNPo")) {
// Use FeatureStyle.Builder to configure the FeatureStyle object // returned by the style factory function. return@StyleFactory FeatureStyle.Builder() // Define a style with purple fill at 50% opacity and // solid purple border. .fillColor(0x80810FCB.toInt()) .strokeColor(0xFF810FCB.toInt()) .build() } } return@StyleFactory null }
// Apply the style factory function to the feature layer. localityLayer?.setFeatureStyle(styleFactory) }
Как удалить стиль из слоя
Чтобы удалить стиль из слоя, вызовите FeatureLayer.setFeatureStyle(null).