如何更新MapBox中的现有线层

时间:2019-11-07 09:31:58

标签: android dictionary line mapbox

Here是用于绘制线几何的mapBox示例。

    private void onStyleLoaded(Style style) {

        initRouteCoordinates();

        style.addSource(new GeoJsonSource("line-source",
                FeatureCollection.fromFeatures(new Feature[]{
                        Feature.fromGeometry(LineString.fromLngLats(routeCoordinates))})));

        style.addLayer(new LineLayer("lineLayer", "line-source")
        .withProperties(PropertyFactory.lineDasharray(new Float[] {0.01f, 2f}),
                PropertyFactory.lineCap(Property.LINE_CAP_ROUND),
                PropertyFactory.lineJoin(Property.LINE_JOIN_ROUND),
                PropertyFactory.lineWidth(5f),
                PropertyFactory.lineColor(Color.parseColor("#e55e5e"))));

        Point point = routeCoordinates.get(0);
        mapboxMap.animateCamera(CameraUpdateFactory.newLatLngZoom(
                new LatLng(point.latitude(), point.longitude()), 17));
    }

我需要添加更多点并更新线。如您在示例中所见,在构建时将线几何指定给源层。我以后找不到任何将点添加到当前行的api。
我应该删除这一行并重画一条新线吗?有没有更好的方法?

1 个答案:

答案 0 :(得分:3)

您可以添加一次"line-source"和相应的"lineLayer"图层,并且每次要添加更多点以更新该线时,设置该来源包含的数据 。即,每次您要更新LineLayer呈现的数据:

  1. 将新获取的坐标添加到您现有的GeoJSON源中,并存储在名为data的变量中。 (我建议将new GeoJsonSource("line-source", ...存储在data变量中,而不是在对style#addSource的调用中内联创建它,以便以后可以访问它进行更新。)
  2. 执行style.getSourceAs("line-source").setGeoJson(data)

或者,您可以使用geoJsonSource.setGeoJson(Feature.fromGeometry(LineString.fromLngLats(updatedRouteCoordinates)))而不是setGeoJson(data),这可能更方便,具体取决于您的用例。

您可以根据自己的特定需求修改实现,但是总体思路是,每次要更新该行时,只需要更新现有源的数据,而无需更新其相应的层。 modify properties documentation中介绍了适用于Android的Mapbox Maps SDK的概念。引用文档:

源和图层不是一成不变的,因此可以在地图渲染期间随时对其进行修改