2011-06-09 22 views
7

Estoy tratando de agregar múltiples marcadores en el mapa de google. Aquí está mi código secciónagregar marcador múltiple en el mapa de google en 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; 



     } 
} 

Tengo dos preguntas aquí. Cuando intenté agregar solo un marcador, funciona, pero el método de dibujo se invoca muchas veces. ¿Pero por qué? y cuando se invoca?

La segunda pregunta es cómo puedo agregar un marcador nuevo. Creé un segundo geoPoint llamado p2 y después de eso, ¿qué debo hacer? Muchas gracias.

Respuesta

0
  1. Para evitar el dibujo múltiple, necesita un caché. Esto es un error en el método de sorteo de MapOverlay
  2. Para agregar múltiples marcadores, debe usar ItemizedOverlay. This may help you.
0

Va a querer comenzar con un ItemizedOverlay que es una matriz de puntos. Puede encontrar la documentación aquí http://code.google.com/android/add-ons/google-apis/reference/index.html. Entonces vas a querer invocar el método ItemizedOverlay.draw() que dibujará todos los puntos dentro de él en función de su posición. Espero que esto ayude.

+1

Oh, y se dibuja varias veces para cada capa en el mapa. Primero dibuja la cuadrícula, luego dibuja el mapa, luego dibuja los puntos. Si está mostrando la pantalla actualizar varias veces, entonces no sé qué está pasando. – Shaun

14

Implementé múltiples marcadores en mi proyecto. Aquí está el código de ejemplo; algunas cosas que necesita cambiar es la imagen del marcador, la longitud (número de marcador que desea definir en el ciclo for). Espero que esto ayude!

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; 
    } 

} 

Detallado Clase para colocar el marcador de

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

si ya está agregando la superposición en el método addoverlay de la clase MyItemizedOverlay ... ¿por qué necesita agregar otro método llamado addOverlayItem ..? No veo cómo funciona eso? – user590849

+0

He simplificado las cosas para el usuario. Si alguien quiere proporcionar lat, long y la cadena directamente, puede utilizar el otro sabor del método addOverlay. Nada más está relacionado con eso. – Scorpion

Cuestiones relacionadas