首页 > 代码库 > PictureShare开发(二)地图Mark(标记)的处理(1)

PictureShare开发(二)地图Mark(标记)的处理(1)

问题一:采用哪种覆盖物

本来想用百度地图的图片覆盖物功能,图片覆盖物有一个很好的优点,就是图片的大小会随着MapView的ZoomLevel变化而变化,非常的方便,但是利用图片覆盖物的话有一个致命的缺点:就是很难获取到点击事件。

所以,我接下来想到用自定义View作为覆盖物。这样就可以很方便地获取触摸事件。可是问题又来了,自定义View的话效果很一般(移动地图的时候自定义View会出现严重的漂移,严重影响视觉效果)

最后,采用自定义图层的办法(ItemizdOverlay)

自定义图层的话,每次只需要往图层上面加入OverlayItem,当点击item时,可以获取item的标识,而overly可以通过标识获取相应的item

 

问题二:怎么防止mark过多

如果发布一张图片就在地图上插上一个mark,这样将会使得地图的mark变得密密麻麻。

所以采取以下策略:

1)判断ZOOMLevel。

2)ZoomLevel在某个范围内就显示该范围对应的mark(例如:14<ZoomLevel<16,显示最小的mark)

 

实现方法:给地图添加一个状态监听器,获取得到zoom,转换为zoomLevel,如果zoomLevel改变,就改变overlay上面的OverItem 核心代码如下:

 1 if(zoomLevel != NowZoomLevel || zoomLevel == 0){
 2             NowZoomLevel = zoomLevel;
 3             switch(zoomLevel){
 4             case 0:
 5                 Log.e("MapStatusListener","zoomLevel=0");
 6                 mMapController.setZoom(MapViewUtil.ZOOM_MIN_LEVEL);
 7                 mMapController.setCenter(GeoPointUtil.centerGeoPoint);
 8                 overlay.removeAll();
 9                 overlay.addItem(new SmallMarkItems(TestGeoPointSmall.getSmallGeoPointList()).createSmallMarkItemsList());
10                 break;
11             case 1:
12                 Log.e("MapStatusListener","zoomLevel=1");
13                 overlay.removeAll();
14                 overlay.addItem(new SmallMarkItems(TestGeoPointSmall.getSmallGeoPointList()).createSmallMarkItemsList());
15                 break;
16             case 2:
17                 Log.e("MapStatusListener","zoomLevel=2");
18                 overlay.removeAll();
19                 overlay.addItem(new MiddleMarkItems(TestGeoPointMiddle.getMiddleGeoPointList()).createMiddleMarkItemsList());
20                 break;
21             case 3:
22                 overlay.removeAll();
23                 overlay.addItem(new BigMarkItems(TestGeoPointMiddle.getMiddleGeoPointList()).createMiddleMarkItemsList());
24                 Log.e("MapStatusListener","zoomLevel=3");
25                 break;
26             default:
27                 Log.e("MapStatusListener","zoomLevelDefault");
28                 break;
29             }
30             mMapView.refresh();
31         }