如何将地图上的标记移动到新坐标?

时间:2019-12-03 23:00:58

标签: android mapbox mapbox-android mapbox-marker

我想做什么: 在这段代码中,我实例化了一个具有摄像机位置的符号。我要做的只是将地图上的符号设置为动画,暂时设置为另一组坐标。我已经尝试了很多事情,但不知道如何使它工作。

我尝试过的事情:我已经看到了两个Mapbox Android SDK示例,并尝试了这些示例的变体,只是为了使标记移动到另一个点,但我很失落:< / p>

此示例使用对象动画制作器: https://docs.mapbox.com/android/maps/examples/animate-marker-position/

此示例不使用任何动画器,仅基于坐标更新符号: https://docs.mapbox.com/android/maps/examples/api-response-icon-update/

我现在所在的位置: 我最终决定只更新符号,文档指出我可以使用此符号:

  

AnnotationManager.update(Annotation)。

但是我不确定如何。请帮助我已经困扰了很长时间,我感到迷路了。谢谢。

符号参考说要使用此功能: https://docs.mapbox.com/android/api/plugins/annotation/0.4.0/com/mapbox/mapboxsdk/plugins/annotation/Symbol.html#setLatLng-LatLng-

我要发生的事情的图像: Animate Symbol To Point

P.S。 我应该尝试使用Object Animator吗?

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Mapbox.getInstance(this, getString(R.string.access_token));

        setContentView(R.layout.activity_main);

        mapView = findViewById(R.id.mapView);
        mapView.onCreate(savedInstanceState);
        mapView.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(@NonNull final MapboxMap mapboxMap) {
                mapboxMap.setStyle(Style.LIGHT, new Style.OnStyleLoaded(){
                    @Override
                    public void onStyleLoaded(@NonNull Style style){

                        //Import Icon
                        Bitmap icon = BitmapFactory.decodeResource(getResources(),
                                R.drawable.blue_icon);

                        style.addImage(ID_IMAGE_SOURCE, icon);
                        style.addSource(new GeoJsonSource("source-id"));

                        //Create Symbol
                        SymbolManager symbolManager = new SymbolManager(mapView, mapboxMap, style);

                        symbolManager.setIconAllowOverlap(true);
                        symbolManager.setIconIgnorePlacement(true);


                        Symbol symbol = symbolManager.create(new SymbolOptions()
                                .withLatLng(new LatLng(33.718492, -117.796390))
                                .withIconImage(ID_IMAGE_SOURCE)
                                .withIconSize(.25f));

                        //Camera Position and Bounds
                        LatLngBounds latLngBounds = new LatLngBounds.Builder()
                                .include(new LatLng(33.717872, -117.796296))
                                .include(new LatLng(33.718342, -117.797975))
                                .build();

                        mapboxMap.animateCamera(CameraUpdateFactory.newLatLngBounds(latLngBounds,
                                        30));

2 个答案:

答案 0 :(得分:0)

我发现使用符号管理器很容易更新标记的位置

 //ADD VARIABLES 
 private SymbolManager symbolManager;
 private Symbol originIcon;
 

设置地图框样式时初始化图像和符号管理器

mapboxMap.setStyle(
            new Style.Builder()
                    .fromUri(styleUrl)
                    
                    // Add the SymbolLayer icon image to the map style
                    .withImage(ICON_ORIGIN, BitmapFactory.decodeResource(
                            this.getResources(), R.drawable.searchorigin)),
            style -> {


                // create symbol manager object
                symbolManager = new SymbolManager(mapView, mapboxMap, style);
                // set non-data-driven properties, such as:
                symbolManager.setIconAllowOverlap(true);
                symbolManager.setIconTranslate(new Float[]{-4f, 5f});
                symbolManager.setIconRotationAlignment(ICON_ROTATION_ALIGNMENT_VIEWPORT);

            });

然后使用符号管理器创建图标并更新位置

//CHECK IF THE MARKER IS INITIALIZE
        if (originIcon == null) {
            // Add symbol at specified lat/lon
            originIcon = symbolManager.create(new SymbolOptions()
                    .withLatLng(new LatLng(location.latitude(), location.longitude()))
                    .withIconImage(ICON_ORIGIN)
                    .withIconSize(0.5f));
        }else{
            //UPDATE THE ICON BY USING SYMBOLMANAGER
            originIcon.setLatLng(new LatLng(location.latitude(), location.longitude()));
            symbolManager.update(originIcon);
        }

答案 1 :(得分:-1)

此问题已解决。需要Android SDK中的Animator。我的原始代码已更改太多,无法全部发布到此处。如果您遇到相同的问题,请告诉我,我会帮忙。