【问题标题】:OSMDroid Overlays Multiple Static and one DynamicOSMDroid 覆盖多个静态和一个动态
【发布时间】:2012-02-23 16:48:55
【问题描述】:

在我的应用程序中,我已经在地图上有了一些静态叠加层,还有一个动态叠加层会在 GPS 坐标发生变化时改变它的位置。

我的问题是,当 GPS 坐标发生变化时,我必须清除动态叠加层并创建一个新叠加层,但是当我这样做时,它会清除所有叠加层,使用:

mapView.getOverlays().clear();

所以,我正在努力寻找更好的方法。

清除所有叠加层,然后将它们重新放置在地图上(消耗内存)或者我可以清除特定的叠加层吗?

谢谢

编辑:

这是动态标记:

@Override
public void onLocationChanged(Location location) {
    Log.d("Location", "onLocationChanged with location " + location.toString());

    mLatitude = (int) (location.getLatitude() * 1E6);
    mLongitude = (int) (location.getLongitude() * 1E6);

    GeoPoint gpt = new GeoPoint(mLatitude,mLongitude);

    markerYou.clear();
    markerYou.add(new OverlayItem(getString(R.string.markerYou), getString(R.string.markerYouDescription), gpt));

    mMyLocationOverlay = new ItemizedIconOverlay<OverlayItem>(markerYou, new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
        @Override
        public boolean onItemSingleTapUp(final int index, final OverlayItem item) {
            Toast.makeText(ShowMap.this, getString(R.string.markerYouDescription), Toast.LENGTH_SHORT).show();
            return true;
        }
        @Override
        public boolean onItemLongPress(final int index, final OverlayItem item) {
            Toast.makeText(ShowMap.this, getString(R.string.markerYouDescription),Toast.LENGTH_SHORT).show();
            return true;
        }
    }, mResourceProxy);

    mapView.getOverlays().clear();
    mapView.getOverlays().add(mMyLocationOverlay);
    mapView.invalidate();

    mapController.setCenter(gpt);
}

这是放置静态标记的函数:

public void putPlacesOfInterest(){
    this.dh = new DataHelper(ShowMap.this);
    List<Pontos> list = this.dh.selectAll();
    for(Pontos p : list){
        markerPlaces.add(new OverlayItem(p.getName().toString(), p.getName().toString(), new GeoPoint(p.getLat(), p.getLng())));
    }
    mMyLocationOverlay = new ItemizedIconOverlay<OverlayItem>(markerPlaces, new OnItemGestureListener<OverlayItem>() {

        @Override
        public boolean onItemLongPress(int index, OverlayItem item) {
            Toast.makeText(ShowMap.this, "Item " + item.mTitle, Toast.LENGTH_LONG).show();
            return true;
        }

        @Override
        public boolean onItemSingleTapUp(int index, OverlayItem item) {
            Toast.makeText(ShowMap.this, "Item " + item.mTitle, Toast.LENGTH_LONG).show();
            return true;
        }

    }, mResourceProxy);

    mapView.getOverlays().add(mMyLocationOverlay);
    mapView.invalidate();
}

【问题讨论】:

  • markerYou的声明是什么样的?

标签: android osmdroid


【解决方案1】:

真正的问题是你添加 mMyLocationOverlay 有很多次你调用 mapView.getOverlays().add(mMyLocationOverlay); 因此,实际上当您尝试清除 mMyLocationOverlay 时,您只清除了 1 个实例。这意味着您可能有 20 个 mMyLocationOverlay 实例。

只是想指出问题的真正原因,如果将来有人需要它。

【讨论】:

  • 感谢您指出这一点,从那以后我就再也没有从事过这方面的工作,但是很高兴为其他人提供有用的信息来更新问题。再次感谢! ;)
【解决方案2】:

如果您在添加动态覆盖之前使用覆盖列表的 .size() 方法 例如

int dynamicOverlayIndex = mapView.getOverlays().size()

然后您可以使用 :

删除那个
mapView.getOverlays().remove(dynamicOverlayIndex);

【讨论】:

  • 我无法让它工作,因为mapView.getOverlays().size() 总是返回 1,而不是叠加层的数量...是的,我在将叠加层放在地图上之后做到了。 ..
  • 在这种情况下,您必须只使用一个覆盖多个项目的叠加层,例如 ArrayList mItems。您还可以在此列表中使用方法 .add()、.remove(idx) 和 .size()(例如 mItems.remove(3))。因此,您应该能够在添加新项目之前找到您的“动态”项目并将其删除
  • 抱歉耽搁了,我已经用代码更新了第一篇文章,也许这样你可以更好地帮助我:)
【解决方案3】:

我用这个解决方案解决了这个问题:

Android MapView Can't Remove Marker

感谢尼克的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多