Home > android > Android Maps上の特定の位置に画像を配置する方法

Android Maps上の特定の位置に画像を配置する方法

本エントリは以前の「Androidで地図に画像を配置する方法」をAndroid 1.0へ対応するものです。

設計概要

Overlayを使って、画像を地図の特定のロケーション(緯度経度)に配置します。

MapViewにOverlayを追加する

MapへはOverlayを重ねる事ができます。

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  MapView map = new MapView(this, "[Android Maps API Key]");
  map.setEnabled(true);
  map.setClickable(true);
  setContentView(map);
 
  // 画像を地図上に配置するオーバーレイ
  Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
  MyOverlay overlay = new MyOverlay(bmp, new GeoPoint(35656000, 139700000));
  List<Overlay> list = map.getOverlays();
  list.add(overlay);
}

#[Android Maps API Key]に関しては「AndroidでGoogle Mapsを使う最も簡単なサンプル」をご参照下さい。

MyOverlayクラスは画像(Bitmap)を特定のロケーション(GeoPoint)へ配置するOverlayです。
MapViewから取得したOverlay用のリストへ、このMyOverlayオブジェクトを追加する事で、
地図にOverlayを重ねる事ができます。

今回の位置は緯度が35656000で、経度が139700000です。

MyOverlayの定義

画像を特定のロケーションへ配置するOverlayを自分で定義します。
ソースコードは以下のようになります。

package com.adamrocker.android.sample.map;
 
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Point;
import com.google.android.maps.*;
 
public class MyOverlay extends Overlay {
  private final Bitmap bmp;
  private final GeoPoint gpoint;
 
  public MyOverlay(Bitmap bmp, GeoPoint gp) {
    this.bmp = bmp;
    this.gpoint = gp;
  }
 
  public void draw(Canvas canvas, MapView mapView, boolean shadow) {
    Projection pro = mapView.getProjection();//Mapと画面の位置を計算するオブジェクト
    Point p = pro.toPixels(gpoint, null);    //ロケーションから、表示する位置を計算する
    canvas.drawBitmap(bmp, p.x, p.y, null);  //表示する場所へ画像を配置する。
  }
}
スクリーンショット

このサンプルのスクリーンショットです。

ちゃんと画像が指定のロケーションの位置へ配置されています。
この位置は固定であり、地図をドラッグしても変わりません。


ちゃんとロケーション上に画像が配置されています。

おわりに

Androidアプリ作成に、このblogを参考にして下さっている方が意外と多いそうです。
コミュニティ活動をしていると、そういう言葉をよく頂きます。
とても嬉しい事で、感謝しています。これからも精進いたします。

また、Androidに興味のある方は情報が集中する日本Androidの会へ是非ご参加下さい。

ソースコード

全ソースコードを公開します。

MapSample.java

package com.adamrocker.android.sample.map;
 
import java.util.List;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import com.google.android.maps.*;
 
public class MapSample extends MapActivity {
 
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MapView map = new MapView(this, "[Android Maps API Key]");
    map.setEnabled(true);
    map.setClickable(true);
    setContentView(map);
 
    // 画像を地図上に配置するオーバーレイ
    Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
    MyOverlay overlay = new MyOverlay(bmp, new GeoPoint(35656000, 139700000));
    List<Overlay> list = map.getOverlays();
    list.add(overlay);
  }
 
  @Override
  protected boolean isRouteDisplayed() {
    return false;
  }
}

MyOverlay.java

package com.adamrocker.android.sample.map;
 
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Point;
import com.google.android.maps.*;
 
public class MyOverlay extends Overlay {
  private final Bitmap bmp;
  private final GeoPoint gpoint;
 
  public MyOverlay(Bitmap bmp, GeoPoint gp) {
    this.bmp = bmp;
    this.gpoint = gp;
  }
 
  public void draw(Canvas canvas, MapView mapView, boolean shadow) {
    Projection pro = mapView.getProjection();//Mapと画面の位置を計算するオブジェクト
    Point p = pro.toPixels(gpoint, null);    //ロケーションから、表示する位置を計算する
    canvas.drawBitmap(bmp, p.x, p.y, null);  //表示する場所へ画像を配置する。
  }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="com.adamrocker.android.sample.map" android:versionCode="1"
	android:versionName="1.0.0">
  <application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".MapSample" android:label="@string/app_name">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <uses-library android:name="com.google.android.maps" />
  </application>
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
関連のありそうなエントリ

Comments:0

Comment Form
Remember personal info

*
To prove that you're not a bot, enter this code
Anti-Spam Image

Trackbacks:0

Trackback URL for this entry
http://www.adamrocker.com/blog/231/android1r1_overlay_on_map.html/trackback/
Listed below are links to weblogs that reference
Android Maps上の特定の位置に画像を配置する方法 from throw Life

Home > android > Android Maps上の特定の位置に画像を配置する方法

Twitter
Search
Feeds
Meta

Return to page top