关于Mapbox Android v10 RenderedQueryOptions的使用咨询及示例需求
Mapbox Android v10 RenderedQueryOptions 用法详解
核心参数说明
RenderedQueryOptions 是约束 queryRenderedFeatures 查询范围的配置类,核心控制参数为 layerIds 和 filters,以下是具体用法及示例:
1. layerIds:指定查询的目标图层
该参数用于限定只查询指定ID的图层要素,避免返回无关图层结果,提升查询效率。若不设置,默认返回当前地图所有可见图层的渲染要素。
示例代码:
仅查询名为 poi-label(POI标签图层)和 road-primary(主干道图层)的要素:
// 构建目标图层ID列表 val targetLayers = listOf("poi-label", "road-primary") // 创建RenderedQueryOptions实例 val queryOptions = RenderedQueryOptions.builder() .layerIds(targetLayers) .build()
2. filters:基于要素属性的精确过滤
过滤器采用Mapbox表达式语法(与地图样式中的图层过滤器语法完全一致),可根据要素的自定义属性(如类型、名称、等级等)进行精准筛选。常见操作符包括 eq(等于)、gt(大于)、contains(包含)、all(多条件与)等。
常见过滤场景示例
场景1:等值过滤(仅获取类型为餐厅的POI)
假设POI图层要素包含 type 属性,值为 restaurant 代表餐厅:
// 构建过滤器:要素type属性等于"restaurant" val restaurantFilter = eq(get("type"), literal("restaurant")) val queryOptions = RenderedQueryOptions.builder() .layerIds(listOf("poi-label")) .filters(restaurantFilter) .build()
场景2:范围过滤(仅获取道路等级≥3的主干道)
假设道路图层要素包含 class 属性,值越大代表道路等级越高:
// 构建过滤器:道路class属性大于等于3 val roadFilter = gte(get("class"), literal(3)) val queryOptions = RenderedQueryOptions.builder() .layerIds(listOf("road-primary")) .filters(roadFilter) .build()
场景3:多条件组合过滤(获取名称含"超市"的商铺)
同时满足要素类型为 shop 且名称包含"超市":
// 多条件与:类型为shop 并且 名称包含"超市" val shopFilter = all( eq(get("type"), literal("shop")), contains(get("name"), literal("超市")) ) val queryOptions = RenderedQueryOptions.builder() .layerIds(listOf("poi-label")) .filters(shopFilter) .build()
完整查询示例(结合ScreenBox)
将上述配置与 ScreenBox 结合完成区域查询:
// 定义屏幕查询区域(示例为屏幕中心附近的矩形) val screenBox = ScreenBox( ScreenCoordinate(500f, 500f), // 左上角坐标 ScreenCoordinate(1000f, 1000f) // 右下角坐标 ) // 执行查询并处理结果 mapboxMap.queryRenderedFeatures(screenBox, queryOptions) .addOnSuccessListener { renderedFeatures -> renderedFeatures.forEach { feature -> val featureName = feature.getStringProperty("name") ?: "无名称" val featureType = feature.getStringProperty("type") ?: "无类型" Log.d("QueryResult", "找到要素:$featureName,类型:$featureType") } } .addOnFailureListener { e -> Log.e("QueryError", "查询失败:${e.message}") }
注意事项
- 过滤器中使用的属性名必须与目标图层要素的实际属性一致,可通过地图样式编辑器查看图层的属性字段
- 表达式语法需遵循Mapbox规范,所有常量值需用
literal()包裹,属性获取用get() - 同时设置
layerIds和filters时,会先按图层过滤,再按属性过滤,进一步缩小结果集范围
内容的提问来源于stack exchange,提问作者robot
相关产品推荐
相关产品推荐

