本文主要是介绍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"));
这篇关于Mapbox Android学习笔记(9)地图查询的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!