osmdroid を使って OpenStreetMap の地図を Android に表示する


Open Street Map(OSM)

自由な地図をみんなで作るプロジェクトです。
「地図のWikipedia」とも言われる。
GoogleMap との違いは、宗教論争になるので、割愛。

 osmdroid

OpenStreetMap を Android に表示するためのライブラリ。

Google Play にデモアプリが公開されている。

簡単なアプリを作る

Android Studio で、空のプロジェクトを作る

osmdroid ライブラリを取り込む。

build.gradle

allprojects {
    repositories {
        jcenter()
      mavenCentral() // 追加する
    }

app/build.gradle

dependencies {

    compile 'org.osmdroid:osmdroid-android:6.0.3' // 追加する

AndroidManifestに permission を追加する

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"  />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

activity_main.xml に MapView を追加する

      <org.osmdroid.views.MapView android:id="@+id/mapView"
                android:layout_width="fill_parent" 
                android:layout_height="fill_parent" />

MainAvtivity

public class MainActivity extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

       // 注意 setContentView より前に置く
       Configuration.getInstance().load(getApplicationContext(),               PreferenceManager.getDefaultSharedPreferences(getApplicationContext()));

         setContentView(R.layout.activity_main);

以上で地図を表示するが、ズームの初期値が0なので、
小さな世界地図が表示される。

中心の緯度経度とズームを設定する。

    mMapView = (MapView) findViewById(R.id.mapView);

       IMapController mapController =  mMapView.getController();
         mapController.setZoom( ズームレベル );
          GeoPoint centerPoint = new GeoPoint( 緯度, 経度 );
          mapController.setCenter(centerPoint);

タッチでズームできるようにする

     mMapView.setBuiltInZoomControls(true);
     mMapView.setMultiTouchControls(true);

以上で地図を表示する

onResume と onPause の処理を追加

なくとも動くようだが、流儀のようなので。

    public void onResume(){
        super.onResume();
        if (mMapView!=null) {
            mMapView.onResume();
        }
    }

    public void onPause(){
        super.onPause();
        if (mMapView!=null) {
            mMapView.onPause();
        }
    }

サンプルコードを github に公開した。

osmdroid を使った感想

  • GoogleMap API と似た API であり、違和感なく使えた。

  • GoogleMap API と異なり、API Key が不要なので、
    気軽に試せて、嬉しい。

  • 新しいライブラリなので、解説記事が少ないのが、難点。

関連記事