【问题标题】:How to remove Markers from Osmdroid Map如何从 Osmdroid 地图中删除标记
【发布时间】:2019-07-01 14:49:43
【问题描述】:

我正在创建一个需要在地图上设置标记的 Android 应用程序。由于我的应用程序需要离线功能,我需要使用 Osmdroid 来解决这个问题。现在我的问题是地图上的标记,我可以使用标记或 ItemizedOverlay 轻松添加它们,但我遇到的问题是我无法从地图中删除标记。

我用来添加标记的代码是这个:

    Marker marker = new Marker(mapView);
    marker.setPosition(new GeoPoint(41.3746312,19.7710733));
    marker.setIcon(getResources().getDrawable(R.drawable.marker));
    marker.setImage(getResources().getDrawable(R.drawable.marker));
    marker.setTitle("Marker");
    marker.setInfoWindow(null);
    marker.showInfoWindow();
    mapView.getOverlays().add(marker);
    mapView.invalidate();

但我在删除它们时遇到了问题,因为删除它的唯一方法是:

    mapView.getOverlays().clear();

我需要同时删除一个特定的标记而不是全部。

【问题讨论】:

    标签: java android dictionary osmdroid


    【解决方案1】:

    Kotlin 版本:

    val gPt = GeoPoint(location.latitude, location.longitude)
    val marker = Marker(map)
    marker.position = gPt
    marker.icon = getDrawable(R.drawable.ic_baseline_location_on_24)
    marker.id = "String"
    map.overlays.add(marker)
    map.invalidate()
    

    删除(改编自 Dren Pirraku 的回答):

    map.overlays.forEach {
      if (it is Marker && it.id == "String") {
        map.overlays.remove(it)
      }
    }
    

    【讨论】:

      【解决方案2】:
      1. 当您添加标记时,将 ID 设置为您喜欢的任何内容。

         MapView mapview = (MapView) findViewById(R.id.mapview);
         Marker marker = new Marker(mapview);
         marker.setId("String");
         mapview.getOverlays().add(marker);
        
      2. 由于标记将作为叠加对象添加到地图视图叠加列表中,因此您可以循环遍历它,直到根据 Id 找到您的特定标记。

         for(int i=0;i<mapview.getOverlays().size();i++){
            Overlay overlay=mapview.getOverlays().get(i);
            if(overlay instanceof Marker&&((Marker) overlay).getId().equals("String")){
               mapview.getOverlays().remove(overlay);
          }
        }
        

      【讨论】:

      • 根据bonus pack 的版本,您可能需要使用setTitlegetTitle 方法。
      【解决方案3】:

      还有另一种添加和删除项目的方法。

      首先,你需要这个 sn-p :

      ArrayList<OverlayItem> items = items = new ArrayList<OverlayItem>();
      ItemizedOverlayWithFocus<OverlayItem> mOverlay = mOverlay = new ItemizedOverlayWithFocus<OverlayItem>(items,
                  new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
                      @Override
                      public boolean onItemSingleTapUp(final int position, final OverlayItem item) {
                          //do something
                          return true;
                      }
                      @Override
                      public boolean onItemLongPress(final int position, final OverlayItem item) {
                          return false;
                      }
                  }, getApplicationContext());
       mOverlay.setFocusItemsOnTap(true);
      

      要在应用启动之前添加项目,请使用以下代码:

      mOverlay.addItem(new OverlayItem("Title", "Description", new 
      GeoPoint(31.7359474,55.4384632))); 
      
      map.getOverlays().add(mOverlay);
      

      在运行应用程序时,您可以使用以下代码添加更多项目

      mOverlay.addItem(new OverlayItem("new Title", "new Description", new GeoPoint(Latitude,Longitude)));
      

      在应用程序运行时使用以下代码删除项目:

      mOverlay.removeItem(int position);
      

      position 是您添加到列表中的第 n 个项目。您可以将删除代码放入我们在此答案中使用的 onItemSingleTapUp,这意味着当您点击项目时,它将从屏幕上删除。

      【讨论】:

        【解决方案4】:

        要删除特定标记,您应该使用:

            mapView.getOverlays().remove(overlay);
            mapView.invalidate();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-24
          • 2016-01-13
          • 1970-01-01
          • 2020-11-22
          • 2013-12-04
          相关资源
          最近更新 更多