Adding multiple markers on google map in android

I am trying to add some markers to a google map. Here is my code section

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

I have two questions. When I tried to add only one marker, it works, but the draw method is called many times. But why? and when is it called?

Second question: how to add a new marker. I created a second geoPoint called p2, and after that, what should I do? Thank you very much.

+7
source share
4 answers

I implemented several markers in my project. Here is a sample code; some things you need to change are the marker image, the length (the number of markers you want to determine in the for loop). Hope this helps !!!

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

Subject class for marker placement

 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); } } 
+14
source
  • To prevent multiple drawing, you need a cache. This is a mistake in the MapOverlay drawing method.
  • To add multiple markers, you must use ItemizedOverlay. This can help you.
0
source

You should follow the Android Map View tutorial on the developer site.

Part 2 has a section for creating Overlay.

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

Minimal work should be done in the Draw method; this is called a lot, including every time the map is moved / scaled / "invalid"

0
source

Your desire to start with ItemizedOverlay, which is an array of points. Here you can find the documentation http://code.google.com/android/add-ons/google-apis/reference/index.html . Then you want to call the ItemizedOverlay.draw () method, which will draw all the points inside it depending on their position. Hope this helps.

0
source

All Articles