Androidプログラマへの道 〜 Moonlight 明日香 〜 - 地図の縮尺を設定/取得する

Google Maps Android API v2

地図の縮尺を設定する方法は2通りある.
静的に決定しているものはXMLで定義して, 動的に決定するものはコードで定義するというのが一般的である.

XMLでの定義

「Googleマップを表示する」を参照し, Googleマップが表示できるようにする.
レイアウトXMLで, fragmentタグ内にmapから始まるプロパティを利用する.
  • res/layout/activity_main.xml
    • xmlns:mapを指定する.
    注) XMLファイル内のroot elementで指定する.
    • map:cameraZoomプロパティに, 縮尺を設定する.
    注) mapプロパティを設定した場合, "Unexpected namespace prefix "map" found for tag fragment"が発生する場合がある.
      そのときは, Project > Cleanを実行する.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  xmlns:map="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context=".MainActivity" >

  <fragment
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.google.android.gms.maps.SupportMapFragment"
    map:cameraTargetLat="35.41"
    map:cameraTargetLng="139.41"
    map:cameraZoom="10"
    />
</RelativeLayout>
  • 動作例
SHARP SH-03C / Andorid 2.2
1) 縮尺 10

コードでの実装

Googleマップを表示する」を参照し, Googleマップが表示できるようにする.
  • MainActivity.java
    • getSupportFragmentManagermメソッドで, FragmentManagerのインスタンスを取得する.
    • FragmentManager#findFragmentByIdメソッドで, SupportMapFragmentのインスタンスを取得する.
    • SupportMapFragment#getMapメソッドで, GoogleMapのインスタンスを取得する.
    • GoogleMap#moveCameraメソッドに, CameraUpdateFactory#zoomToメソッドで縮尺を指定することで, 拡大/縮小する.
     注) v1では縮尺はint型であったが, v2はfloat型となっており無段階で設定できる.
    • 縮尺は, GoogleMap#getCameraPosition().zoomに格納されている.
package com.moonlight_aska.android.googlemapv2;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.util.Log;

public class MainActivity extends FragmentActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FragmentManager manager = getSupportFragmentManager();
    SupportMapFragment fragment = (SupportMapFragment)manager.findFragmentById(R.id.map);
    GoogleMap map = fragment.getMap();
    if (map != null) {
      map.moveCamera(CameraUpdateFactory.zoomTo(10));
      Log.v("Map", "Zoom Level = " + map.getCameraPosition().zoom);
    }
  }
}

Google Maps Android v1 API

地図の縮尺を設定するには, MapControllerクラスを利用する.
また, 地図の現在の縮尺を取得するには, MapViewクラスを利用する.

縮尺の設定/取得

Googleマップを表示する」を参照し, Googleマップが表示できるようにする.

  • MainActivity.java
    • findViewByIdメソッドで, MapViewのインスタンスを取得する.
    • MapView#getControllerで, MapControllerのインスタンスを取得する.
    • MapController#setZoomメソッドで, 縮尺(最小 1 〜 21 最大)を設定する.
    注) 縮尺が1レベルアップするごとに, 地図上の距離が2倍に拡大される.
    • MapView#getZoomLevelメソッドで, 縮尺を取得する.
package com.moonlight_aska.android.web.googlemap01;

import android.os.Bundle;
import android.util.Log;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;

public class MainActivity extends MapActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    MapView mview = (MapView)findViewById(R.id.mapview);
    // 縮尺の設定
    MapController mapCtrl = mview.getController();
    mapCtrl.setZoom(5);
    // 縮尺の取得
    int zlevel = mview.getZoomLevel();
    Log.v("Map", "Zoom Level = " + zlevel);
  }

  @Override
  protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    return false;
  }
}
  • 動作例
SHARP SH-03C / Android 2.2
1) 縮尺 5

2) 縮尺 10