среда, 28 ноября 2012 г.

Android. Как поставить маркер (пин, булавку) на карте MapView

Допустим мы хотим поставить маркеры или булавки (или как они называются) на карте, зная широту и долготу.

1. После создания проекта Android вы должны создать класс MyItemizedOverlay, наследуемый от ItemizedOverlay и переопределить некоторые методы. Код показан ниже:


package com.example;
import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;
import java.util.ArrayList;
/**
 * Description
 *
 * @author : awacs
 * @since: 28/11/12
 */
public class PinOverlay extends ItemizedOverlay {
    private ArrayList mOverlays = new ArrayList();
    Context mContext;
    public PinOverlay(Drawable marker) {
        // центром каплевидного маркера считаем его нижнюю центральную часть.
        super(boundCenterBottom(marker));
    }
    public MyItemizedOverlay(Drawable marker, Context context) {
        super(boundCenterBottom(marker));
        mContext = context;
    }
    public void addOverlay(OverlayItem overlay) {
        mOverlays.add(overlay);
        populate();
    }
    @Override
    protected OverlayItem createItem(int i) {
        return mOverlays.get(i);
    }
    @Override
    public int size() {
        return mOverlays.size();
    }
    @Override
    protected boolean onTap(int i) {
        //Когда мы тапаем по маркеру, вызывается этот Алерт
        OverlayItem item = mOverlays.get(i);
        AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
        dialog.setTitle(item.getTitle());
        dialog.setMessage(item.getSnippet());
        dialog.show();
        return true;
    }
}
2. Находим на просторах интернета какой-нибудь маркер и копируем его в папку drawable проекта. Называем его marker.png
3. А в главной Activity, которая у нас наследуется от MapActivity пишем следующее:
package com.example;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import com.google.android.maps.*;
import java.util.List;
public class MyActivity extends MapActivity {
    private MapView mapView;
    private MapController mapController;
    private GeoPoint geoPoint;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mapView = (MapView) findViewById(R.id.mapview);
        //Устанавливаем масштаб
        mapView.getController().setZoom(12);
        //разрешаем пользоваться зумом
        mapView.setBuiltInZoomControls(true);
        // список слоев
        List mapOverlays = mapView.getOverlays();
        // наш маркер
        Drawable drawable = this.getResources().getDrawable(R.drawable.marker);
         
                // слой с маркером
        PinOverlay itemizedoverlay = new PinOverlay(drawable, this);
       // координаты где будем ставить маркер (46.06, 23.57) 
       GeoPoint point = new GeoPoint(46066940, 23570000);
       
       // центрируем карту на нашей точке  
       mapView.getController().setCenter(point);
       
       // создаем пин, назначаем его заголовок и текст для алерта
       OverlayItem overlayitem = new OverlayItem(point, "Title for dialog", "Alba Iulia City From Romania");
               
                // еще один пин
        GeoPoint point2 = new GeoPoint(35410000, 139460000);
        OverlayItem overlayitem2 = new OverlayItem(point2, "Title for dialog", "Japan");
                
                // добавляем пин на слой
        itemizedoverlay.addOverlay(overlayitem);
        itemizedoverlay.addOverlay(overlayitem2);
        
        // добавляем слой     
        mapOverlays.add(itemizedoverlay);
    }
    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }
}

Комментариев нет: