#概要
先日、Yahoo!JapanのハッカソンでGoogleMapを使ったAndroidアプリを作ったので、そのとき調べたMapの使い方をまとめました。
#画面にMapを表示する
Mapを表示するだけだったら、AndroidStudioのNew Projectを選択したときに、Google Maps Activityを選べば表示できるので、一つ一つポイントだけ説明します。
GoogleMapのApiキーを取得する
Mapを使うにはApiキーが必要なので、ここでキーを作成して、res/values/google_maps_api.xml(別にgoogle_maps_api.xmlという名前である必要はない)に書いておく
<resources>
<string name="google_maps_key" templateMergeStrategy="preserve" translatable="false">取得したキー</string>
</resources>
AndroidManifestにPermissionとキーのmeta-dataを追加
AndroidManifest.xmlに下記のPermissionと先ほどのキーを追記して、Mapが利用できるようにしておく
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application (略)>
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/google_maps_key" />
<!-- 中略 -->
</application>
build.gradleにgmsへのdependencyを追加する
compile 'com.google.android.gms:play-services:10.0.1'
LayoutにMapを追加する
非常に簡単。SupportMapFragmentを追加するだけ。
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-au
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/map"
android="com.google.android.gms.maps.SupportMapFragment
android:layout_width="match_parent"
android:layout_height="match_parent"
map:cameraZoom="15"/>
ここまでやれば、画面にマップが表示されるはず。
ちなみにこんな感じで表示されるはず(map:cameraZoom="15"の場合)。
Mapの使い方
MapはGoogleMapインスタンス経由で操作できます。
GoogleMapのインスタンスは、SupportMapFragmentのgetMapAsyncからonMapReadyCallbackを通じて下記のように取得できます。
private void createMap() {
// Obtain the SupportMapFragment and get fied when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
Log.i(TAG, "Map created!");
mMap = googleMap;
(以下略)
}
細かな使い方は、オフィシャルのドキュメントを見てもらうとして、ここでは主な機能の使い方を紹介します。
自分の位置をMapに表示する
標準で用意されている方法と、マーカーを自分で設定する方法の2種類があります。
###標準で用意されている方法
一行下記を追記する。この方法の問題点は表示が標準の青丸で、アイコンのカスタマイズができないこと。
mMap.setMyLocationEnabled(true);
###自分でマーカーを置く
自分の位置にマーカーをおいて、それを随時更新することで表示します。この方法だと、マーカーのアイコンを自分で決めることができます。
@Override
public void onMapReady(GoogleMap googleMap) {
(中略)
mApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(mConnectionCal
.addOnConnectionFailedListener(mConnecedListener)
.build();
mApiClient.connect();
}
private GoogleApiClient.ConnectionCallbacks mConnectionCallback = new GoogleApiClient.ConnectionCallbacks() {
@Override
public void onConnected(@Nullable Bundle le) {
final long INTERVAL_MILLIS = 1000;//更新の頻度。ここでは1秒おきに更新する
LocationRequest request = new tionRequest();
request.setInterval(INTERVAL_MILLIS);
request.setPriority(LocationRequest.PRIORITY_HIGH_ACCU);
LocationServices.FusedLocationApi.requestLocationUpdatApiClient, request, mLocationListener);
}
@Override
public void onConnectionSuspended(int i) {
}
};
private LocationListener mLocationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
LatLng position = new LatLng(location.getLatitude(), location.getLongitude());
MarkerOptions markerOptions = new MarkerOptions();
//zoom to current position:
if (mCurrentLocationMarker == null) {
markerOptions.position(position);
markerOptions.title("タイトル");
markerOptions.icon(BitmapDescriptorFactory.fromResource(R.mipmap.好きなアイコン));
mCurrentLocationMarker = mMap.addMarker(markerOptions);
} else {
mCurrentLocationMarker.setPosition(position);
}
}
};
また、表示しているマーカーを消したくなったら、
mCurrentLocationMarker.remove();
で一発。MapにaddMarkerしたのを覚えておくのがポイント。
また、addMarkerは自分の位置だけじゃなく、座標(緯度経度)が分かればどこにでも設置可能なので、目的地にマーカーを設置したりするのも簡単。
Map上に線を引く
GoogleMapApiなどで検索した経路を地図上に表示したいとき、2点(もしくはそれ以上)の緯度経度が分かれば、簡単に線を引くことができます。
private void drawRoute(List<LatLng> route) {
PolylineOptions options = new lineOptions();
for (LatLng latLng : route) {
options.add(latLng);
}
options.color(色);
options.width(幅);
mMap.addPolyline(options);
}
こんな感じ
カメラの倍率、ポジションを変更する
表示の倍率、位置を変更するには、CameraPositionを設定しなおせばOK。
下記では、北緯50度、東経50度(カザフスタンの西あたり)、Zoomのレベルを10に移動しています
CameraPosition cameraPosition = new CameraPosition.Builder().target(new LatLng(50.0, 50.0)).zoom(10).build();
mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
さいごに
たくさん書いたので、補足があったら後日追記します