在Android的谷歌地图添加多个标记

我triyng在谷歌地图上添加多个标记。 这是我的代码部分

public class GoogleMap extends MapView { MapController mc; MapView mapView; GeoPoint p; @Override public void onCreate(Bundle savedInstanceState) { .... double lat = Double.parseDouble(bundle.getString("paramLat")); double lng = Double.parseDouble(bundle.getString("paramLong")); mc = mapView.getController(); p = new GeoPoint( (int) (lat * 1E6), (int) (lng * 1E6)); mc.animateTo(p); mc.setZoom(17); //---Add a location marker--- MapOverlay mapOverlay = new MapOverlay(); List<Overlay> listOfOverlays = mapView.getOverlays(); listOfOverlays.clear(); listOfOverlays.add(mapOverlay); mapView.invalidate(); } class MapOverlay extends com.google.android.maps.Overlay { @Override public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) { super.draw(canvas, mapView, shadow); //---translate the GeoPoint to screen pixels--- Point screenPts = new Point(); mapView.getProjection().toPixels(p, screenPts); //---add the marker--- Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pushpin); canvas.drawBitmap(bmp, screenPts.x, screenPts.y-50, null); return true; } } 

我在这里有两个问题。 当我试图添加只有一个标记,它的作品,但绘制方法被调用多次。 但为什么? 什么时候被调用?

第二个问题是我如何添加新的标记。 我创build了名为p2的第二个geoPoint,之后应该怎么做? 非常感谢你。

Solutions Collecting From Web of "在Android的谷歌地图添加多个标记"

我在我的项目中实现了多个标记。 这里是示例代码; 有些东西,你需要改变的是标记图像,长度(你想要在for循环中定义的标记的数量)。 希望这会有所帮助!

 public class ShowMapActivity extends MapActivity{ private MapController mapControll; private GeoPoint geoPoint=null; private MapView mapview; private MyItemizedOverlay userPicOverlay; private MyItemizedOverlay nearPicOverlay; private Drawable userPic,atmPic; private OverlayItem nearatms[] = new OverlayItem[50]; public static Context context; @Override protected void onCreate(Bundle icicle) { // TODO Auto-generated method stub super.onCreate(icicle); context = getApplicationContext(); setContentView(R.layout.your layout xml); showMap(); } public void showMap() { // TODO Auto-generated method stub try { geoPoint = new GeoPoint((int)(latitude * 1E6),(int)(longitude * 1E6)); mapview = (MapView)findViewById(R.id.mapview); mapControll= mapview.getController(); mapview.setBuiltInZoomControls(true); mapview.setStreetView(true); mapControll.setZoom(16); mapControll.animateTo(geoPoint); userPic = this.getResources().getDrawable(R.drawable.your pic); userPicOverlay = new MyItemizedOverlay(userPic); OverlayItem overlayItem = new OverlayItem(geoPoint, "I'm Here!!!", null); userPicOverlay.addOverlay(overlayItem); mapview.getOverlays().add(userPicOverlay); atmPic = this.getResources().getDrawable(R.drawable.your pic); nearPicOverlay = new MyItemizedOverlay(atmPic); for (int i = 0; i < define your length here; i++) { nearatms[i] = new OverlayItem(new GeoPoint((int)((latitude) * 1E6)),(int)(longitude) * 1E6)),"Name", null);//just check the brackets i just made change here so.... nearPicOverlay.addOverlay(nearatms[i]); } mapview.getOverlays().add(nearPicOverlay); //Added symbols will be displayed when map is redrawn so force redraw now mapview.postInvalidate(); } catch (Exception e) { e.printStackTrace(); } } @Override protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return false; } } 

用于放置标记的Itemized类

 public class MyItemizedOverlay extends ItemizedOverlay<OverlayItem> { private ArrayList<OverlayItem> myOverlays ; public MyItemizedOverlay(Drawable defaultMarker) { super(boundCenterBottom(defaultMarker)); myOverlays = new ArrayList<OverlayItem>(); populate(); } public void addOverlay(OverlayItem overlay){ myOverlays.add(overlay); populate(); } @Override protected OverlayItem createItem(int i) { return myOverlays.get(i); } // Removes overlay item i public void removeItem(int i){ myOverlays.remove(i); populate(); } // Returns present number of items in list @Override public int size() { return myOverlays.size(); } public void addOverlayItem(OverlayItem overlayItem) { myOverlays.add(overlayItem); populate(); } public void addOverlayItem(int lat, int lon, String title) { try { GeoPoint point = new GeoPoint(lat, lon); OverlayItem overlayItem = new OverlayItem(point, title, null); addOverlayItem(overlayItem); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } @Override protected boolean onTap(int index) { // TODO Auto-generated method stub String title = myOverlays.get(index).getTitle(); Toast.makeText(ShowMapActivity.context, title, Toast.LENGTH_LONG).show(); return super.onTap(index); } } 
  1. 要防止多个绘图,你需要一个caching。 这是MapOverlay的绘制方法中的一个错误
  2. 要添加多个标记,你必须使用ItemizedOverlay。 这可能会帮助你。

您应该遵循开发者网站上的Android Map View教程。

第2部分有构build覆盖的部分。

http://developer.android.com/resources/tutorials/views/hello-mapview.html

最小的工作应该在Draw方法中完成; 它被称为很多,包括每次地图被移动/缩放/“无效”

你将要开始一个ItemizedOverlay这是一个点数组。 您可以在http://code.google.com/android/add-ons/google-apis/reference/index.htmlfind相关文档&#x3002; 然后你将要调用ItemizedOverlay.draw()方法,它将根据它们的位置来绘制其中的所有点。 希望这可以帮助。