C/C++プログラマの管理者が, Androidプログラムにチャレンジ. AndroidプログラミングのTipsをメモっていく予定です.

Google Maps Android API v2

Googleマップにマーカーを重ねて表示するには, MarkerOptionsクラスを利用する.

マーカー表示

Googleマップを表示する」を参照し, Googleマップが表示できるようにする.
  • MainActivity.java
    • GoogleMapのインスタンスを取得する.
    • マーカー設定位置を指定して, LatLngのインスタンスを生成する.
    • MakerOptionsのインスタンスを生成する.
    • MakerOptions#positionメソッドで, マーカーの位置を設定する.
    • GoogleMap#addMarkerメソッドで, マーカーを登録する.
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 com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

public class MainActivity extends FragmentActivity {
  // 六甲山:北緯34度46分41秒, 東経135度15分49秒}
  private double mLatitude = 34.0d + 46.0d/60 + 41.0d/(60*60);
  private double mLongitude = 135.0d + 15.0d/60 + 49.0d/(60*60);
  private GoogleMap mMap = null;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mMap = ( (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map) ).getMap();
    if (mMap != null) {
      LatLng location = new LatLng(mLatitude, mLongitude);
      CameraPosition cameraPos = new CameraPosition.Builder()
        .target(location).zoom(10.0f)
        .bearing(0).build();
      mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPos));
      // マーカー設定
      MarkerOptions options = new MarkerOptions();
      options.position(location);
      mMap.addMarker(options);
    }
  }
}
  • 動作例
SHARP SH-03C / Android 2.2

Google Maps Android v1 API

Googleマップにマーカーを重ねて表示するには, ItemizedOverlayクラスを利用する.

マーカー表示

  • MarkerItem.java
マーカーの情報を保持するクラスを実装する.
    • OverlayItemクラスを継承する.
package com.moonlight_aska.android.web.googlemap02;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.OverlayItem;

public class MarkerItem extends OverlayItem {
  public MarkerItem(GeoPoint point, String arg1, String arg2) {
    super(point, arg1, arg2);
    // TODO Auto-generated constructor stub
  }
}
  • MarkerOverlay.java
オーバーレイ表示を行うクラスを実装する.
    • ItemizedOverlayクラスを継承する.
    • コンストラクタ
      • ItemizedOverlay#boundCenterメソッドで, マーカーの(0,0)を中央に指定する.
    • createItemメソッドで, 指定した座標位置にマーカーを生成する.
    • sizeメソッドで, マーカーを表示する座標位置数を返す.
    • addMakerメソッドで, マーカーを表示する座標位置を追加する.
package com.moonlight_aska.android.web.googlemap02;

import java.util.ArrayList;
import java.util.List;
import android.graphics.drawable.Drawable;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.ItemizedOverlay;

public class MarkerOverlay extends ItemizedOverlay<MarkerItem> {
  private List<GeoPoint> mPoints = new ArrayList<GeoPoint>();

  public MarkerOverlay(Drawable defaultMarker) {
    super(boundCenter(defaultMarker));
    // TODO Auto-generated constructor stub
  }

  @Override
  protected MarkerItem createItem(int i) {
    // TODO Auto-generated method stub
    GeoPoint point = mPoints.get(i);
    return new MarkerItem(point, "", "");
  }

  @Override
  public int size() {
    // TODO Auto-generated method stub
    return mPoints.size();
  }

  public void addMarker(GeoPoint point) {
    mPoints.add(point);
    populate();
  }
}
  • MainActivity.java
Googleマップにマーカー用のオーバーレイを重ねて表示するには, MapViewにオーバーレイを追加する.
    • Drawableのインスタンスを取得する.
    • MarkerOverlayのインスタンスを生成する.
    • MapView#getOverlays#addメソッドで, オーバーレイを追加する.
    • MarkerOverlay#addMarkerで, マーカー位置を設定する.
package com.moonlight_aska.android.web.googlemap02;

import android.graphics.drawable.Drawable;
import android.os.Bundle;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;

public class MainActivity extends MapActivity {
  // 六甲山:北緯34度46分41秒, 東経135度15分49秒
  private int mLatitude = (int)( (34.0d + 46.0d/60 + 41.0d/(60*60) ) * 1E6);
  private int mLongitude = (int)( (135.0d + 15.0d/60 + 49.0d/(60*60) ) * 1E6);
  MarkerOverlay mOverlay;
  MapView mView;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mView = (MapView)findViewById(R.id.mapview);
    GeoPoint geoPo = new GeoPoint(mLatitude, mLongitude);
    mView.getController().animateTo(geoPo);
    // オーバーレイ表示
    Drawable marker = getResources().getDrawable(R.drawable.marker);
    mOverlay = new MarkerOverlay(marker);
    mView.getOverlays().add(mOverlay);
    // マーカー設定
    mOverlay.addMarker(geoPo);
  }

  @Override
  protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    return false;
  }
}
  • 動作例
SHARP SH03C / Android 2.2




このページへのコメント

説明下手ですみません。他のサイトである地点の座標を調べて、度分秒に変換してきたものに書き換えて動作させたのですが、そのときに表示させようとしていた場所とずれた場所に表示されていました。ですので、度分秒に変換させずに、そのままの座標の数値で表示をさせたくて質問しました。

ですが、「各マーカーに対応した処理をする」のページを見て解決することが出来ました。

Posted by 初心者 2015年02月03日(火) 10:57:05

askaです.

「ポイントをもう少し細かく指定する」とはどういう意味でしょうか?
もう少し具体的に何をどうしたいか記載願います.

Posted by aska 2015年02月02日(月) 23:22:34

先日は丁寧なアドバイスを頂き、ありがとうございました。
今回は「マーカーを表示させる」を参考にさせてもらったのですが、マーカーを表示させるポイントをもう少し細かく指定することは可能でしょうか?

Posted by 初心者 2015年02月02日(月) 10:03:31

コメントをかく


ユーザーIDでかく場合はこちら
「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu


逆引き(基礎編)

画面表示/操作(49)

フラグメント(1)

逆引き(応用編)

AD



管理人のみ編集できます