カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

グーグルマップに移動した軌跡を表示する [Android]

この記事は最終更新日から1年以上経過しています。

グーグルマップに現在地を表示し、移動した軌跡を線で描画してみたいと思います。
描画の度にオーバーレイを重ねていくと、当然のことながら重たくなっていくので、
表示するオーバーレイは常に1枚、ルート情報はpathRouteに記憶させるようにしました。
ルート情報が増える毎にオーバーレイを書き直しています。

まずは、LocationListenerを実装し、MapActivityクラス継承したクラスを作成します。

public class MyMap extends MapActivity implements LocationListener {

    private MapView mMapView;
    private MapController mMapController;
    private MyLocationOverlay mOverlay;
    private LocationManager mLocationManager;
    private LineOverlay lineOverlay = new LineOverlay(); //軌跡を描画するオーバーレイ

    public static List<GeoPoint> pathRoute; //ルート情報

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        mMapView = (MapView)findViewById(R.id.mapview);
        mMapView.setClickable(true);

        mMapController = mMapView.getController();
        mMapController.setZoom(16);

        //現在地を表示
        mOverlay = new MyLocationOverlay(this, mMapView);
        mOverlay.onProviderEnabled(LocationManager.GPS_PROVIDER);
        mOverlay.enableMyLocation();
        mOverlay.runOnFirstFix(new Runnable(){
            public void run(){
                GeoPoint mPoint = mOverlay.getMyLocation();
                mMapController.animateTo(mPoint);
            }
        });
        mMapView.getOverlays().add(mOverlay);

        mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    }

    @Override
    public void onResume(){
        super.onResume();

        mOverlay.enableMyLocation();

        if (mLocationManager != null) {
            mLocationManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER, // 精度は高いが遅い(誤差15m程度)
                //LocationManager.NETWORK_PROVIDER, // 精度は低いが速い(誤差100m程度)
                //LocationManager.PASSIVE_PROVIDER, //位置情報の修正を行わない特殊なプロバイダー(他アプリ等で測位された場合に、その位置情報を流用するらしい)
                5000, //通知する時間の間隔をミリ秒で指定します
                0, //通知する距離の間隔をメートルで指定します
                this);
        }
    }

    public void onPause(){
        super.onPause();

        mOverlay.disableMyLocation();

        if (mLocationManager != null) {
            mLocationManager.removeUpdates(this);
        }
    }

    //…以下省略
}

onLocationChangedイベントにてlineOverlayにポイントを追加します。

    @Override
    public void onLocationChanged(Location location) {

        //現在地座標をGeoPointに変換
        GeoPoint p = new GeoPoint((int)(location.getLatitude()*1E6), (int)(location.getLongitude()*1E6));

        //ルート情報に追加
        pathRoute.add(p);

        //一旦オーバーレイを削除
        mMapView.getOverlays().remove(lineOverlay);

        //オーバーレイを初期化
        lineOverlay = new LineOverlay();

        //再びオーバーレイを表示
        mMapView.getOverlays().add(lineOverlay);
    }

線を描画するためのOverlayクラスを継承したLineOverlayクラスを作成します。

class LineOverlay extends Overlay {

    @Override
    public void draw(Canvas canvas, MapView mapView, boolean shadow) {
        super.draw(canvas, mapView, shadow);

        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setStyle(Paint.Style.STROKE);
        paint.setAntiAlias(true);
        paint.setStrokeWidth(3);
        paint.setColor(Color.RED);

        Path path = new Path();
        Projection projection = mapView.getProjection();

        if(MyMap.pathRoute.size() >= 2) { //軌跡を表示するので、ルート情報が2点以上ある場合に処理
            for(int i = 1; i < MyMap.pathRoute.size(); i++) { //2点目から処理を開始
                Point pxSrc = projection.toPixels(MyMap.pathRoute.get(i - 1), null); //1つ前が始点
                Point pxDst = projection.toPixels(MyMap.pathRoute.get(i), null);
                path.moveTo(pxSrc.x, pxSrc.y);
                path.lineTo(pxDst.x, pxDst.y);
            }
        }

        canvas.drawPath(path, paint);
    }

}

参考URL:
http://wikiwiki.jp/android/?Google%20Map%A4%CBDrawable%A4%F2%C7%DB%C3%D6%A4%B9%A4%EB

この記事がお役に立ちましたらシェアお願いします
11,505 views

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です