web-dev-qa-db-ja.com

OpenStreetMapからオフラインでマップタイルを作成し、Androidで表示するにはどうすればよいですか?

私が欲しいのは、OpenStreetMapを使用して簡単なオフラインマップを表示することです。マップタイルを作成し、それを使用してAndroidでマップを表示するための適切なツールがWebで見つかりません。さまざまなリソースをダウンロードしましたが、どこから始めればよいかわからないようです。 JOSMを使用してOpenStreetMapの画像を統合したいのですが、Androidで使用できるかどうかわかりません。

Mapnikを使用できますか?あなたの助けは大いに感謝します。

19
rahstame

私は現在、OpenStreetMap(OSM)APIを使用して(私の最初の)Androidアプリケーションを開発しているので、JSOMについてはお手伝いできませんが、OSMの部分についてはお手伝いできます。

AndroidアプリケーションでOSMマップを表示するだけの新しいアクティビティを作成したい場合は、次のようなものから始めることができます。

package example.stackoverflow.osmdroid;

import Android.app.Activity;
import Android.os.Bundle;

import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;

public class YourMap extends Activity {
    // The MapView variable:
    private MapView m_mapView;

    // Default map zoom level:
    private int MAP_DEFAULT_ZOOM = 15;

    // Default map Latitude:
    private double MAP_DEFAULT_LATITUDE = 38.535350;

    // Default map Longitude:
    private double MAP_DEFAULT_LONGITUDE = -121.753807;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Specify the XML layout to use:
        setContentView(R.layout.osm_map);

        // Find the MapView controller in that layout:
        m_mapView = (MapView) findViewById(R.id.mapview);

        // Setup the mapView controller:
        m_mapView.setBuiltInZoomControls(true);
        m_mapView.setMultiTouchControls(true);
        m_mapView.setClickable(true);
        m_mapView.setUseDataConnection(false);
        m_mapView.getController().setZoom(MAP_DEFAULT_ZOOM);
        m_mapView.getController().setCenter(
            new GeoPoint(MAP_DEFAULT_LATITUDE, MAP_DEFAULT_LONGITUDE));
        m_mapView.setTileSource(TileSourceFactory.MAPNIK);
    } // end onCreate()
} // end class YourMap

Osm_map.xmlレイアウトは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

        <org.osmdroid.views.MapView
            Android:id="@+id/mapview"
            Android:layout_width="match_parent" 
            Android:layout_height="match_parent"
            Android:enabled="true"      
            Android:clickable="true"
        />  
</RelativeLayout>

実際のマップタイルに関しては、Mobile Atlas Creatorと呼ばれる非常に優れたプログラムがあり、オフラインで必要なマップタイルを生成できますAndroid上記で実装されたマップ。

アプリケーションをインストールし、新しいアトラスを作成する場合は、「目的のアルタス形式」を選択するように求められます。これがポップアップしたら、「OsmdroidZip」を選択します。

すべてが読み込まれたら、タイルを作成するマップ上の領域を選択し、タイルを作成するズームレベルを選択して、左側の列の[選択範囲を追加]ボタンをクリックしてから、[アトラスの作成]をクリックします。

ああ、ソースによっては、[マップタイルの作成/調整]チェックボックスをオンにして、タイルをPNGとしてエクスポートする必要がある場合があります。OSMでJPGを使用できるかどうか誰か知っていますか?

Zipが生成されたら、名前を「Mapnik.Zip」に変更し、Eclipse Androidプロジェクトワークスペースに新しく作成された「tiles」というフォルダーに移動しました。それを機能させるには、Zipファイルを開き、最上位のフォルダーの名前を「Google Earth」(使用したマップソースに応じて)から「Mapnik」に変更して、タイルを次のようにする必要がありました。 Androidアプリケーションに表示します。

ただし、実際にタイルを携帯電話にロードするには、端末からADBツールを使用する必要があります。 ADBツールディレクトリで、次のようなものを実行する必要があります(各行は新しいコマンドです)。

./adb Shell rm -r /sdcard/osmdroid/
./adb Shell mkdir /sdcard/osmdroi/
./adb Push ~/path/to/your/mapnik.Zip /sdcard/osmdroid

マップのサイズと電話のメモリバスの速度によっては、この最後の手順が完了するまでに数分から1時間かかる場合があります。完了すると、マップは機能するはずです-私は願っています!

先ほど申し上げたように、OSM APIを使用するのはこれが初めてなので、私はOSM APIの専門家ではなく、自分にとって何がうまくいったかについてコメントすることしかできません。

これがあなたが始めるのに役立つことを願っています!

編集:

昨日書いたコードを実際に実行する機会がなかったので、いくつかのエラーをキャッチできませんでした。 Eclipseで新しいプロジェクトを作成し、そこにコードをダンプし、いくつか修正して、稼働させました。私が行ったすべての変更は、上記のコードに反映されています!基本的なインポートステートメントのいくつかを忘れ、manifest.xmlファイルにパーミッションを追加するのを忘れました。

マニフェスト.xmlの最後の数行は次のようになります。

    <uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION"/> 
    <uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE" />
    <uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission Android:name="Android.permission.INTERNET" />
    <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>

また、これをマニフェストに追加することもできますが、確かに重要ではありません。

<supports-screens 
    Android:anyDensity="true"
    Android:resizeable="false"
    Android:largeScreens="true"
    Android:normalScreens="true"
/>

<uses-sdk ... />部分の直後にこれを追加します。

さらに、必ず次の2つのJARライブラリをインポートしてください。

osmdroid-Android-3.0.3.jar // Or whatever version you're using...

そして

slf4j-Android-1.5.8.jar // Or whatever the latest version is...

この最後のJARがないと、コードを含めることを思い出すまで、コードがクラッシュし続けました。

デフォルトの座標を変更して、実際にマップタイルがある場所を指すようにしてください。そうしないと、白いキャンバス以外はほとんど表示されません。

最初に私の側でコードを実行しなかったことをお詫びします!

26
Tim Severeijns

ステップバイステップのソリューションは次のとおりです。

簡単に言うと:

1- Mobile Atlas Creator を使用してマップタイルをダウンロードする必要があります。手順を説明しました [〜#〜] here [〜#〜]

2-結果のZipファイルをデバイスの/mnt/sdcard/osmdroid/に移動します。

3-プロジェクトのビルドパスに osmdroid-Android-XXX.jar および slf4j-Android-1.5.8.jar を追加します

4- MapViewの追加:MapViewをxmlレイアウトに追加できます

<org.osmdroid.views.MapView
    Android:id="@+id/mapview"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tilesource="Mapnik"
    />

または、プログラムでMapViewを作成します。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    mResourceProxy = new ResourceProxyImpl(inflater.getContext().getApplicationContext());
    mMapView = new MapView(inflater.getContext(), 256, mResourceProxy);
    return mMapView;
}

マニフェストに次の権限を追加することを忘れないでください。

<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION"/> 
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE" />
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
<uses-permission Android:name="Android.permission.INTERNET" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />

これは良いです サンプルプロジェクト 。それが役に立てば幸い ;)

重要

@Scaiが述べたように:最近、Open Street Mapは このツールは良くありません と発表し、いくつかの問題がありました:

このツールを使用すると、OSMタイルサーバーのトラフィックが多くなり、ブロックされる可能性があります。使用しないでください。

6
Milad Faridnia

タイルをマップする代わりに、オフラインマップにベクターデータを使用することもできます。たとえば、mapsforgeやMapbox Android SDK 。詳細については、OSM wikiで オフラインOSM および Androidライブラリ を参照してください。

1
scai