如需为地图项图层中的边界多边形应用描边和填充样式,请执行以下操作:
创建一个实现
FeatureLayer.StyleFactory
接口的样式工厂函数。此函数用于定义地图项图层的样式设置逻辑。调用
FeatureLayer.setFeatureStyle()
以将样式工厂函数应用于地图项图层。
以下示例地图演示了如何突出显示市行政区地图项图层中单个区域的边界多边形。
创建样式工厂函数
在您在地图项图层上设置样式工厂函数时,系统会将该函数应用于受影响地图项图层中的每个多边形。此函数必须返回一个 FeatureStyle
对象,用于指定如何设置多边形的样式。
Maps SDK for Android 会将 Feature
实例传递给样式工厂函数。Feature
实例表示地图项的元数据,可让您访问样式工厂函数中的元数据。
应用样式工厂函数时,样式工厂函数应始终返回一致的结果。例如,如果要随机为一组地图项着色,不应针对随机部分应用地图项样式函数,否则会导致意外结果。
由于此函数会针对图层中的每个地图项运行,因此优化至关重要。为避免影响渲染次数,请执行以下操作:
仅启用所需的地图项图层。
如果不再使用某个地图项图层,请调用
FeatureLayer.setFeatureStyle(null)
。
设置多边形描边和填充
在样式工厂函数中为边界多边形设置样式时,您可以设置以下内容:
多边形边框的 ARGB 颜色格式描边颜色和不透明度,如
Color
类所定义。默认值为透明 (0x00000000)。多边形边框的描边宽度(以屏幕像素为单位)。默认值为 2。
多边形的 ARGB 颜色格式的填充颜色和不透明度,由
Color
类定义。默认值为透明 (0x00000000)。
查找地点 ID 以定位地图项
许多应用都会根据地图项的位置信息为地图项应用样式。例如,您可能希望对不同的国家/地区应用样式。地图项位置由地点 ID 表示。
地点 ID 可唯一标识 Google Places 数据库中和 Google 地图上的地点。如需获取地点 ID,请执行以下操作:
- 使用 Places API 和地理编码服务,按名称搜索区域,并获取指定边界内区域的地点 ID。
- 从点击事件中获取数据。 这会返回与所点击区域相对应的地图项,从而提供对该区域的地点 ID 和地图项类型类别的访问权限。
覆盖范围因区域而异。如需了解详情,请参阅 Google 边界覆盖范围。
您可以从许多来源获取地理位置名称,例如 USGS Board on Geographic Names(美国地名委员会)和 U.S. Gazetteer Files(美国地名档案)。
使用 PlaceFeature 获取地点 ID
PlaceFeature
类是 Feature
类的一个子类。它表示地点地图项(具有地点 ID 的地图项),其中包括类型为 ADMINISTRATIVE_AREA_LEVEL_1
、ADMINISTRATIVE_AREA_LEVEL_2
、COUNTRY
、LOCALITY
、POSTAL_CODE
和 SCHOOL_DISTRICT
的地图项。
当地点 ID 可用时,Maps SDK for Android 会将 PlaceFeature
的实例传递给样式工厂函数,以便您确定地图项的位置。
样式工厂示例
以下示例将样式工厂函数应用于“Locality”地图项图层中的多边形。样式工厂函数使用 PlaceFeature
实例确定地图项的地点 ID。如果地点 ID 是夏威夷州哈纳市,则该函数会对多边形应用自定义填充和描边样式:
按照开始使用中的步骤创建新的地图 ID 和地图样式(如果您尚未执行此操作)。请务必启用 Locality(市行政区)地图项图层。
在地图初始化时获取对市行政区地图项图层的引用。
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() }创建一个样式工厂函数,并将其应用于“Locality”地图项图层。
以下示例仅在地图项的地点 ID 为夏威夷州哈纳 (“ChIJ0zQtYiWsVHkRk8lRoB1RNPo”) 时才会应用该函数。如果指定的地点 ID 不是夏威夷州的 Hana,则系统不会应用该样式。
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)
。