Поверните и измените положение маркеров в последнем MapBox SDK 6.7 - PullRequest
0 голосов
/ 28 ноября 2018

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 голосов
/ 10 января 2019

Этого можно добиться с помощью слоя символов в последнем 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
        }
    });
...