Google Maps Android API v2 で指定した場所を表示する方法

この資料では Google Map Android API v2 で任意の場所を表示する方法を示します。

地図上の任意の場所を表示するには緯度経度をしていするのですが、これを指定しないと緯度経度が共に0の場所を指し示すことになります。

ちなみに緯度経度共に0度は、ギニア湾沖の海上を指し示しています。

というわけで、前回の記事ではアフリカが表示されていたわけです。

Google Maps Android API v2

今回はこれを任意の場所に移動しようというわけです。

例として札幌駅(北緯 43.0675 度、東経 141.350784 度は既知とします)を表示してみましょう。

Google Maps Android API v2 で指定した場所を表示する方法

この場合のステップは次の通りです。

  1. GoogleMap の参照を取得する
  2. MapsInitializer で初期化
  3. CameraUpdateFactory で CameraUpdate を作成
  4. 地図の表示を移動

GoogleMap はここでは SupportMapFragment (com.google.android.gms.maps.SupportMapFragment) を利用しているので、 次のようにサポートライブラリの SupportFragmentManager を経由して参照を取得します。

package com.example.googlemap1;

import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;

public class MainActivity extends FragmentActivity {

  public static final String TAG = "TEST";
  GoogleMap map;
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    map = ((SupportMapFragment) 
      getSupportFragmentManager().findFragmentById(R.id.map))
      .getMap();
    ...
        

次に Google Maps Android API を初期化します。

特に BitmapDescriptorFactory や CameraUpdateFactory はそれらを利用する前の初期化が必要とされるので、 MapsInitializer の initialize メソッドを呼び出しておきます。

それを実行する端末の Google Play Services のライブラリのバージョンが古いなどして、Google Maps v2 が使えない場合などは、 例外が送られますので、そこでユーザーに Google Maps のアップグレードを促すなどすると良いでしょう。 (GooglePlayServicesNotAvailableException 例外)

それから CameraUpdateFactory を用いて CameraUpdate オブジェクトを作成します。

このとき、LatLng オブジェクトを作成することで場所を指定しています。

ちなみに、緯度は Latitude、経度は Longitude なので緯度経度の順番で LatLng です。

ではこれを実行してみましょう。

package com.example.googlemap1;

import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;

public class MainActivity extends FragmentActivity {

  public static final String TAG = "TEST";
  GoogleMap map;
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    map = ((SupportMapFragment) 
      getSupportFragmentManager().findFragmentById(R.id.map))
      .getMap();
    
    try {
      MapsInitializer.initialize(this);
    } catch (GooglePlayServicesNotAvailableException e) {
      Log.d(TAG, "You must update Google Maps.");
      finish();
    }
    
    moveToSapporoStation();
  }
  
  protected void moveToSapporoStation(){
    CameraUpdate cu = 
      CameraUpdateFactory.newLatLng(
        new LatLng(43.0675, 141.350784));
    map.moveCamera(cu);
  }
}

この結果は次の通りです。

Google Maps Android API v2

確かにアフリカではなく、日本にはなりましたが、まだまだ世界地図ですね。これをもっとズームしてみましょう。

これは簡単です。上の CameraUpdateFactory の newLatLng メソッドを利用した箇所を、ズームレベルのパラメータも受け取る newLatLngZoom メソッドに置き換えれば良いです。

  ...  
  protected void moveToSapporoStation(){
    CameraUpdate cu = 
      CameraUpdateFactory.newLatLngZoom(
        new LatLng(43.0675,141.350784), 15);
    map.moveCamera(cu);
  }
}

この結果次のように街中の道路案内図くらいのズームになります。

Google Maps Android API v2

だいたいこのくらいでズームレベルが 15 です。

ズームレベルは 2 から 21 までで数字が大きいほどズームアップしています。つまり、数字が小さいと (ズームレベルが小さく) 地図を引いてみることになります。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Android 開発入門