Mapbox Android学习笔记(9)地图查询

Query map features

Maps SDK 允许您查询地图图层并返回一个 GeoJSON 特征列表,其中包含关于该特性的几何形状和属性的信息。例如,用户可以通过点击地图查询地图特性,并返回当时作为 GeoJSON 特征存在的任何 POIs。然后,您可以访问特征中的属性,包括作为字符串的 POI 名称。查询地图并不总是返回您正在寻找的信息。可以接收包含0个特征的列表。

查询工作原理

您可以在地图中查询某个点 Point 或边界框 BoundingBox 中存在的特征。除了层之外,还可以查询源以获取与查询匹配的特定信息,无论这些项是否显示在地图上。

由于特征来自 vector tile(或内部转换为 tiles 的 GeoJSON 数据),查询可能会分割特征几何图形,或者跨平铺边界复制它们。因此,特征可能会在查询结果中出现多次。

例如,当通过边界框在包含跨多个tile的高速公路的区域中进行查询时,查询将为高速公路跨的每个tile返回一个单独的特性。每个特征的几何形状将被限制在存在于该块上的高速公路部分。类似地,由于平铺缓冲,靠近平铺边界的点特征可能出现在多个平铺中。

查询显示功能

使用 queryRenderedFeatures 返回当前在设备上呈现的所有地图特性。功能必须在设备的视图中可见,并在访问之前完全呈现。

查询一个点
queryRenderedFeatures 只接受屏幕像素值,而不接受 LatLng ,因此在许多情况下,您需要将屏幕位置转换为地理位置。在下面的示例中,当单击地图时,它提供了一个LatLng,用于获取地图上该点的特性:

@Override
public void onMapClick(@NonNull LatLng point) {
  // 将LatLng坐标转换为屏幕像素,只查询呈现的特性。
  final PointF pixel = mapboxMap.getProjection().toScreenLocation(point);

  List<Feature> features = mapboxMap.queryRenderedFeatures(pixel);

  // 获取列表中的第一个特征(如果存在)
  if (features.size() > 0) {
    Feature feature = features.get(0);

    // 确保特征feature具有已定义的属性
    if (feature.properties() != null) {
      for (Map.Entry<String, JsonElement> entry : feature.properties().entrySet()) {
        // 打印所有属性
        Log.d(TAG, String.format("%s = %s", entry.getKey(), entry.getValue()));
      }
    }
  }
}

查询呈现的所有层的特征:

List<Feature> features = mapboxMap.queryRenderedFeatures(pixel);

查询在特定层中呈现的特性:

// 您可以传入一个单层id或一组层id
List<Feature> features = mapboxMap.queryRenderedFeatures(pixel, "LAYER-ID");

在边界框中查询
要查询某个区域的地图特性,请使用 RectF 对象传入一个包围框。这可以来自地图顶部显示给用户的Android视图,也可以来自视图端口中显示的四个坐标。

下面的示例展示了如何使用四个坐标创建 RectF。 RectF 对象被传递到 queryRenderedFeatures() 中。

RectF rectF = new RectF(
	mapView.getLeft(),
	mapView.getTop(),
	mapView.getRight(),
	mapView.getBottom()
);
mapboxMap.queryRenderedFeatures(rectF);
查询源特征

querySourceFeatures() 返回与查询参数匹配的所有特征,而不管该特征当前是否在地图上呈现。查询的域包括当前加载的所有向量块和GeoJSON源块。此函数不检查可见视图端口外的tile。

要查询源,必须将查询参数作为一组过滤器传入,并且只有满足语句的特征才会添加到返回的特征列表中。在下面的示例中,map样式包含一个名为 population-source 的GeoJSON源,它为每个特征包含一个 population 属性。下面的查询将返回的特征限制为人口大于100,000的特征:

GeoJsonSource source = mapboxMap.getSourceAs("population-source");
List<Feature> features = source.querySourceFeatures(Expression.get("population"));
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值