2011-06-09 145 views
7

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

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; 



     } 
} 

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

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

回答

0
  1. 要防止多个绘图,您需要缓存。这是MapOverlay的绘制方法中的一个错误
  2. 要添加多个标记,您必须使用ItemizedOverlay。 This may help you.
0

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

+1

并且是绘制多次为地图上的每个层。首先绘制网格,然后绘制地图,然后绘制点。如果它多次显示屏幕刷新,那么idk发生了什么事情。 – Shaun 2011-06-09 15:29:10

14

我在我的项目中实现了多个标记。这里是示例代码;有些事情你需要改变的是标记图像,长度(你想要在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; 
    } 

} 

分项类用于放置标记物

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

如果您已经在MyItemizedOverlay类的addoverlay方法中添加overlayitem ..为什么您需要添加另一个名为addOverlayItem的方法..?我不明白这是如何工作的? – user590849 2012-11-05 01:29:51

+0

我已经简化了用户的事情。如果任何人想直接提供lat,long和字符串,则可以使用addOverlay方法的其他风格。没有别的与此相关。 – Scorpion 2012-11-05 02:58:19