Androidで動く携帯Javaアプリ作成入門
連載インデックスへ
Androidで動く携帯Javaアプリ作成入門(16)

地図/位置情報/GPSを使うAndroidアプリを作るには


株式会社イーフロー
緒方聡
2010/4/7

マーカーで特定の位置を指定・表示するには

 緯度経度を基に、地図上にマーカーを設置してみます。

図7 東京タワーにマーカーを設置
図7 東京タワーにマーカーを設置
- PR -

 中央付近に表示されている東京タワーに気球のマーカーを設置しました。影が付いたりしてなかなか気が利いています。

マーカーを設置する際のポイント

 地図上に何かを描画したい場合は、Android Mapsで提供されている「Overlay」というクラスを使用します。

 地図上に直接描画できないので、透明のレイヤを用意して、その上に描画します。Overlayを使用する場合、描画はすべて自前で行い、描画制御する必要がありますが、何でも描画できます。

図8 オーバーレイのイメージ図
図8 オーバーレイのイメージ図

 今回使用したのは、OverlayのサブクラスであるItemizedOverlayというクラスです。このクラスはOverlayItemに基付きレイヤ上に描画を行うクラスで、OverlayItemを適切に作成することで、描画は自動で行われます。OverlayItemには、マーカー画像、緯度、経度、そのほかの情報が保持されます。

 OverlayItemを作成する際に必要なGeoPointクラスには、緯度と経度を渡しますが、このGeoPointクラスのコンストラクタに渡すlatitudeE6とlongitudeE6というのは、通常の緯度・経度の精度を1000000倍してintに直したものです。

 例えば、東京駅の座標は以下のように作成します。

private static final GeoPoint TOKYO = new GeoPoint(
new Double(35.68198003744061 * 1E6).intValue(),
new Double(139.76609230041504 * 1E6).intValue());

ItemizedOverlayクラスの重要なメソッドのポイント

 コンストラクタには、デフォルトのマーカー画像を設定する必要があります。マーカー画像を差し替えたい場合はOverlayItem#setMarker(Drawable)で個別に行います。マーカーとして渡すDrawableは、あらかじめsetBounds()を呼び出しておく必要があります。これを行わないと、レイヤ上に表示されません。

 ItemizedOverlayは、polulate()メソッドを呼び出す必要があります。これが呼び出されると、size()メソッドが返すサイズ分だけcreateItem()が呼び出されOverlayItemがキャッシュされます。マーカーのどの位置にアンカーを置くかは、boundCenter()またはboundCenterBottom()で指定します。

表4 マーカーのアンカー指定
メソッド アンカーの位置
指定なし 左上
boundCenter(Drawable) 画像の中央
boundCenterBottom(Drawable) 画像の下部中央

 マーカーを作成する際には制限があることに注意する必要があります。

ロケーションサービスと連携して現在位置を表示

 Android Mapsは、GPSなどのロケーションサービスと連動させると、とても便利です。Android Mapsには、「MyLocationOverlay」というOverlayのサブクラスが用意されており、これを使用することで現在位置を簡単に表示できます。

package com.example.android.maps;
 
import android.location.LocationManager;
import android.os.Bundle;
 
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.MyLocationOverlay;
 
public class Tracking extends MapActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final MapView mapView = new MapView(this, getResources().getString(R.string.map_key));
        mapView.setEnabled(true);
        mapView.setClickable(true);
        mapView.setBuiltInZoomControls(true);
        final MyLocationOverlay overlay =
            new MyLocationOverlay(getApplicationContext(), mapView);
        overlay.onProviderEnabled(LocationManager.GPS_PROVIDER); // GPS を使用する
        overlay.enableMyLocation();
        overlay.runOnFirstFix(new Runnable() {
            @Override
            public void run() {
                mapView.getController().animateTo(
                    overlay.getMyLocation()); // 現在位置を自動追尾する
            }
        });
        mapView.getOverlays().add(overlay);
        mapView.invalidate();
        setContentView(mapView);
    }
 
    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }
}

 たったこれだけのソースコードで、最初に紹介した動画のように動作します。

コラム 「エミュレータでの位置情報発信」

エミュレータで位置情報を発信するには、ADTから位置情報を設定する必要があります。

図9 ADTの位置情報送信(マニュアル)
図9 ADTの位置情報送信(マニュアル)

ここでは緯度と経度を入力する必要があります。手軽な方法として、FirefoxまたはGoogle ChromeのブックマークレットとGoogleマップの組み合わせを紹介します。

位置情報を知りたい場所をGoogle Mapsで中央に表示します。その後、アドレスバーに以下のように入力すると、緯度と経度がプロンプトで表示されます。

javascript:void(prompt('',gApplication.getMap().getCenter()));

上記方法は、Googleマップで簡単に位置情報を知る方法とブックマークレットで紹介されていた記事を参考にさせてもらいました。

また、連続して位置情報を送信したい場合は、GPXかKML形式のファイルを読み込ませると可能です。


10 ADTの位置情報送信(KML)
10 ADTの位置情報送信(KML)

今回使用したデータは、実際にGPSで計測したデータからKMLを作成しました。KMLはADTが読み込めるように加工しなければなりませんが、それを行ってくれるのが「Google Earth to Android ADT」です。

しかし、Google EarthからエクスポートしたKMLは「Google Earth to Android ADT」でADTが読み込める形式に変換できますが、例えばルートラボからダウンロードしたKMLは変換に失敗します。

ADTで必要になるKMLのフォーマットは非常に簡単なので、自分で加工した方が早いかもしれません。

AndroidMapsSample.kmlを公開するので、これを参考にしてみてください。

Android Mapsの強力さと簡単さが分かりましたか?

 Android Mapsの強力さと簡単さを知ると、使用してみたくなりませんか。サンプルアプリの中には、今回紹介していない機能も含まれていますので、ダウンロードして動作させてみてください。

 また、Android Mapsは機能が豊富なので、クラスやメソッドの詳細は、APIを参照してください。

@IT関連記事


本当はすごい、知られざるGoogle Maps APIたち!!
インタビュー特集:Google直伝!(3) 数多く存在するGoogle MapsのAPIや機能のうち、あまり知られていないものや新しいもの、とっておきをGoogle担当者に聞いた
リッチクライアント & 帳票」フ ォーラム 2009/5/21
商業利用もOK! Google Mapsについて知りたいこと
インタビュー特集:Google直伝!(2) Google Mapsライセンス担当者インタビュー。問い合わせの多い質問から順に、意外と知らない利用規約を分かりやすくお伝えする
リッチクライアント & 帳票」フ ォーラム 2009/5/11
位置情報を取得する仕組み
連載:位置情報を使ってみよう(1)
 可能性の広がる位置推定技術。ケータイやカーナビ、モバイル端末での位置推定の仕組みを、具体的な製品や実装方法を交えて説明
Master of IP Network」フ ォーラム 2009/2/12
ブラウザで位置情報を取得してみよう
連載:位置情報を使ってみよう(2)
 PCのブラウザで位置情報を取得しよう。IPアドレスやWi-Fiの電波強度、Google MapsやJSONPの外部サービスとの連携方法も説明
Master of IP Network」フ ォーラム 2009/6/19
ケー タイアプリ事情−iPhoneからAndroidへの移植も
ESEC2009イベントレポート
 今回のテーマは“ケータイ”。話題のAndroidやiPhone向けアプリケーションの展示・デモンストレーションを行っていたブースを中心に紹介する
HTML+JavaScriptでiPhone/Androidアプリを作る
Web技術でネイティブアプリを作れるTitanium(1) 
iPad/iPhone VS Androidに戸惑っているWebデザイナ/開発者のためにオープンソースの開発ツールを紹介します

ケータイ分野以外の組み込みデバイス開発の現場でも注目を集めている「Android」。組み込みデバイスへの適用からアプリケーション開発、イベントレポート、ニュースなどAndroidに関するさまざまな技術情報・最新動向をお届けします!

1-2-3

 Index
第16回 地図/位置情報/GPSを使うAndroidアプリを作るには
  Page1
Androidケータイの本命「Xperia」発売開始!
ケータイの醍醐味! 地図/位置情報を使うアプリ
Android Maps API Keyを取得するには
コラム 「Androidアプリの署名方法」
  Page2
Android Mapsを使った地図の表示
地図のさまざまな設定/表示と操作
コラム 「Androidベースのカーナビは、すでにある」
Page3
マーカーで特定の位置を指定・表示するには
ロケーションサービスと連携して現在位置を表示
コラム 「エミュレータでの位置情報発信」
Android Mapsの強力さと簡単さが分かりましたか?

Androidで動く携帯Javaアプリ作成入門 バックナンバー 連載インデックスへ»


ご意見、ご感想は Smart&Social 会議室へどうぞ


 Smart&Social フォーラム トップページへ


TechTargetジャパン

Smart & Social フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH