googleMap第2回 表示形式 衛星、地図、地形図 | Satellite photograph Topographical map | Android

スポンサーリンク

AndroidでGoogleMapアプリ作成

第1回 表示
第2回 表示形式 衛星、地図、地形図
第3回 マーカーと直線
第4回 googleMapのエラー
第5回 PlaceAPIとマーカーのセット
第6回 現在地 GPSの実装
第7回 トラッキング
第8回 様々な技法

第1回で使用したプロジェクトをそのまま使います。今回は地図の表示を切り替えます。

スポンサーリンク

衛星画像モードで表示

MAP_TYPE_SATELLITEの指定を行います。

    mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);

他のタイプをまとめますと

GoogleMapタイプ  
MAP_TYPE_NORMAL 通常マップ
MAP_TYPE_SATELLITE 衛星画像
MAP_TYPE_HYBRID ハイブリッド
MAP_TYPE_TERRAIN 地形図
MAP_TYPE_NONE なし

切り替えButtonの設置

切り替えボタンをレイアウトに追加しましょう。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="net.honeybread.directionthat.MainActivity">
    <fragment
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:layout_marginTop="20dp"
        android:text="Map Type Button"
        android:id="@+id/mapTypeButton"/>
</RelativeLayout>

※RelativeLayoutに変更しています。Buttonタグはfragmentタグの後に。そうしなければ隠れてしまいます。(回避策がないわけではないですが)

Buttonリスナーを実装

コードに以下を追加します

Button mapTypeButton;
int mapTypeFlagInt;

としたうえで、onMapReadyに以下を追加し、setMapTypeメソッドも追加します。

ボタンをタップするごとにカウントアップし、5の時に0に戻します。

mapTypeButton = (Button)findViewById(R.id.mapTypeButton);
mapTypeButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        mapTypeFlagInt++;
        if(mapTypeFlagInt==5)mapTypeFlagInt=0;
        setMapType(mapTypeFlagInt);
    }
});

メソッドの追加。各数値に応じてマップを表示します。

public void setMapType(int mapType){
    switch (mapType) {
       case 0:
           mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
           break;
       case 1:
           mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
           break;
       case 2:
           mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
           break;
       case 3:
           mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
           break;
       case 4:
           mMap.setMapType(GoogleMap.MAP_TYPE_NONE);
           break;
    }
}

まとめソースコード

AndroidStudioでのMap作成ではデフォルトでextends FragmentActivityとなっています。このままではレイアウトXMLで指定したvectorDrawableは表示されません。レイアウトで指定したvectorDrawableを表示する際はAppCompatActivityとします。

少し書き方を修正します。

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {
    GoogleMap mMap;
    double mtFujiLatDouble = 35.360556;
    double mtFujiLngDouble = 138.727778;
    LatLng targetLatLng= new LatLng(mtFujiLatDouble ,mtFujiLngDouble );
    CameraPosition cameraPosition;
    Button mapTypeButton;
    int mapTypeFlagInt;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mapTypeButton = (Button) findViewById(R.id.mapTypeButton);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        cameraPosition = new CameraPosition.Builder()
                .target(targetLatLng).zoom(mMap.getMaxZoomLevel()-3)
                .bearing(90)
                .build();
        mMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
        //   mMap.moveCamera(CameraUpdateFactory.newLatLng(targetLatLng));
        //   mMap.moveCamera(CameraUpdateFactory.zoomTo(mMap.getMaxZoomLevel()-3));
        mapTypeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mapTypeFlagInt++;
                if (mapTypeFlagInt == 4) mapTypeFlagInt = 0;
                setMapType(mapTypeFlagInt);
            }
        });
    }
    public void setMapType(int mapType){
        switch (mapType) {
            case 0:
                mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
                break;
            case 1:
                mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
                break;
            case 2:
                mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
                break;
            case 3:
                mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
                break;
        }
    }
}

実行して左上Buttonをタップしてみましょう。地図が切り替わります。

ハイブリッドは以下のように。

では次回はマップにマーカーや、直線を描く方法を説明します。

おまけ

こんな書き方も。

int[] mapTypeArray= {
        GoogleMap.MAP_TYPE_NORMAL,
        GoogleMap.MAP_TYPE_SATELLITE,
        GoogleMap.MAP_TYPE_HYBRID,
        GoogleMap.MAP_TYPE_TERRAIN};

として、

mMap.setMapType(mapTypeArray[mapTypeFlagInt]);

とします。