- Android
- 2013-07-10
この記事は最終更新日から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