在最新的MapBox SDK 6.7中旋转和更改标记的位置

时间:2018-11-28 10:33:10

标签: mapbox mapbox-android

Mapbox Android SDK: 6.7.0

我们正在开发的应用程序中的要求是,我们必须在不同的LatLng位置添加多个标记,并以一定的方位旋转它们。在旧的mapbox版本(4.2.1)中,我们可以做到这一点而没有任何问题。

////Working code with MapBox SDK 4.2.1////
MarkerViewOptions markerViewOptions = new MarkerViewOptions();
        IconFactory iconFactory = IconFactory.getInstance(this);
        Icon arrowIcon = iconFactory.fromResource(R.drawable.compass_needle);
        markerViewOptions.icon(arrowIcon);
        markerViewOptions.position(new LatLng(position)).rotation((float) headDirection);
        marker = mapboxMap.addMarker(markerViewOptions);

    ////For updating////

        marker.setPosition(new LatLng(aircraftLocation));
        marker.setRotation((float) headDirection);
        mapboxMap.updateMarker(marker);

在最新的Mapbox更新中,不推荐使用MarkerView和MarkerViewOptions。我们正在尝试使用Marker和MarkerOptions实现相同的功能。但是我们无法旋转标记。

我们还尝试使用SymbolLayer。旋转功能可在此处使用,但我们无法设置标记的LatLng位置。

如何使用最新的SDK来实现这一目标?

1 个答案:

答案 0 :(得分:0)

这可以通过最新的SDK 6.7.0中的符号层来实现。

添加标记:

       Bitmap compassNeedleSymbolLayerIcon = BitmapFactory.decodeResource(
                getResources(), R.drawable.compass_needle);
        mapboxMap.addImage(AIRCRAFT_MARKER_ICON_ID, compassNeedleSymbolLayerIcon);

       GeoJsonSource geoJsonSource = new GeoJsonSource(GEOJSON_SOURCE_ID, Feature.fromGeometry(
                Point.fromLngLat(longitude, latitude)));
        mapboxMap.addSource(geoJsonSource);

        SymbolLayer Layer = new SymbolLayer(AIRCRAFT_LAYER_ID, GEOJSON_SOURCE_ID)
                .withProperties(
                        PropertyFactory.iconImage(AIRCRAFT_MARKER_ICON_ID),
                        PropertyFactory.iconRotate((float) headDirection),
                        PropertyFactory.iconIgnorePlacement(true),
                        PropertyFactory.iconAllowOverlap(true)
                );
        mapboxMap.addLayer(layer);

要旋转或更改标记的位置,请执行以下操作:

GeoJsonSource source = mapboxMap.getSourceAs(GEOJSON_SOURCE_ID);
            if (source != null) {
                source.setGeoJson(Feature.
                        fromGeometry(Point.fromLngLat(longitude, latitude)));
                layer.setProperties(
                        PropertyFactory.iconRotate((float) headDirection)
                );
            }

当您在 onMapReady()回调中添加标记时,上述这段代码有时可能无法工作。因为 onMapReady()是在加载所有样式之前调用的。因此,将标记添加到 addOnDidFinishLoadingStyleListener()回调中。

mapView.addOnDidFinishLoadingStyleListener(new MapView.OnDidFinishLoadingStyleListener() {
        @Override
        public void onDidFinishLoadingStyle() {
            //add marker here
        }
    });
相关问题