【问题标题】:How To Move Marker On Map To New Coordinates?如何将地图上的标记移动到新坐标?
【发布时间】:2019-12-03 23:00:58
【问题描述】:

我想做的事: 在这段代码中,我用相机位置实例化了一个符号。我想做的只是将地图上的符号动画到另一组我要硬编码的坐标,现在。我已经尝试了很多事情,但无法弄清楚如何让它发挥作用。

我的尝试:我已经看到了 Mapbox Android SDK 的两个示例,并尝试了这些示例的变体,只是为了让标记移动到另一个点,但我很迷茫:

此示例使用 Object Animator: https://docs.mapbox.com/android/maps/examples/animate-marker-position/

这个例子不使用任何动画器,只是根据坐标更新符号: https://docs.mapbox.com/android/maps/examples/api-response-icon-update/

我现在在哪里: 我最终决定只更新符号,文档指出我要使用它:

AnnotationManager.update(注解)。

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

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

我希望发生的事情的图片: Animate Symbol To Point

附: 我应该试试 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));

【问题讨论】:

    标签: android mapbox mapbox-android mapbox-marker


    【解决方案1】:

    解决了。需要来自 Android SDK 的 Animator。从我的原始代码中更改了太多内容,无法将其全部发布在这里。如果您遇到同样的问题,请告诉我,我会提供帮助。

    【讨论】:

    • 我遇到了同样的问题。我无法将 SymbolOptions 设置为新位置,我所能做的就是从 SymbolManager 中删除注释并使用新位置创建新的 SymbolOptions。您是否有机会提供您的解决方案?
    • 使用这个例子:docs.mapbox.com/android/maps/examples/animate-marker-position。而不是使用此代码的触摸侦听器,输入您想要标记的位置。请先尝试一下,如果需要,请回复我。
    【解决方案2】:

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

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

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

    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);
            }
    

    【讨论】:

      猜你喜欢
      • 2011-03-05
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      • 2017-12-29
      • 2020-05-11
      • 2017-10-20
      相关资源
      最近更新 更多