добавление нескольких маркеров на карту Google в Android - PullRequest
7 голосов
/ 09 июня 2011

Я хочу добавить несколько маркеров на карту Google.Вот мой раздел кода

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;



         }
}

У меня есть два вопроса здесь.Когда я пытался добавить только один маркер, он работает, но метод рисования вызывается много раз.Но почему?и когда это вызывается?

Второй вопрос: как я могу добавить новый маркер.Я создал второй GeoPoint с именем p2, и после этого, что мне делать?Большое спасибо.

Ответы [ 4 ]

14 голосов
/ 09 марта 2012

Я реализовал несколько маркеров в моем проекте. Вот пример кода; некоторые вещи, которые вам нужно изменить, это изображение маркера, длина (номер маркера, который вы хотите определить в цикле 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 голосов
/ 09 июня 2011

Вы должны следовать учебному пособию по Android Map View на сайте разработчиков.

Часть 2 имеет раздел для создания наложения.

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

Минимальная работа должна выполняться в методе Draw; он вызывается часто, в том числе каждый раз, когда карта перемещается / масштабируется / «становится недействительной»

0 голосов
/ 09 июня 2011

Вы хотите начать с ItemizedOverlay, который представляет собой массив точек.Вы можете найти документацию здесь http://code.google.com/android/add-ons/google-apis/reference/index.html.Затем вы захотите вызвать метод ItemizedOverlay.draw (), который будет рисовать все точки внутри него в зависимости от их положения.Надеюсь это поможет.

0 голосов
/ 09 июня 2011
  1. Для предотвращения многократного рисования вам необходим кеш. Это ошибка в методе рисования MapOverlay
  2. Чтобы добавить несколько маркеров, вы должны использовать ItemizedOverlay. Это может вам помочь.
...