簡體   English   中英

如何從 OpenStreetMap 離線創建地圖圖塊,並在 Android 上顯示?

[英]How to create map tiles from OpenStreetMap offline, display it on Android?

我想要的是使用 OpenStreetMap 顯示一個簡單的離線地圖。 我在網絡上找不到創建地圖圖塊並使用它在 Android 中顯示地圖的正確工具。 我下載了不同的資源,但似乎我不知道從哪里開始。 我想使用 JOSM 集成來自 OpenStreetMap 的圖像,但我不知道我是否可以在 Android 上使用它。

我可以使用 Mapnik 嗎? 您的幫助將不勝感激。

我目前正在使用 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 地圖生成必要的地圖圖塊。

安裝應用程序后,如果您想創建新的地圖集,系統會要求您選擇“所需的 Altas 格式”。 當它彈出時,選擇“Osmdroid zip”。

加載完所有內容后,在地圖上選擇要為其創建圖塊的區域,選擇要為其創建圖塊的縮放級別,然后點擊左側列中的“添加選擇”按鈕,然后點擊“創建圖集”。

哦,根據來源,您可能需要選中“創建/調整地圖圖塊”復選框以強制將圖塊導出為 PNG - 有誰知道是否可以將 JPG 與 OSM 一起使用?

生成 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

根據地圖的大小和手機內存總線的速度,這最后一步可能需要幾分鍾到一個小時才能完成。 完成后,您的地圖應該可以工作了——我希望!

正如我所提到的,這是我第一次使用 OSM API,所以我絕不是這方面的專家,我只能評論對我有用的東西。

希望這能幫助您入門!

編輯:

我沒有機會實際運行我昨天編寫的代碼,所以我沒有發現一些錯誤。 我剛剛在 Eclipse 中創建了一個新項目,將我的代碼轉儲到其中,修復了一些問題並使其啟動並運行。 我所做的所有更改都反映在上面的代碼中! 我忘記了幾個基本的導入語句,也忘記向 manifest.xml 文件添加權限。

我的 manifest.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 ... />部分之后添加它。

此外,請務必導入以下兩個 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,我的代碼一直崩潰,直到我記得要包含它。

確保修改默認坐標,使它們指向您實際擁有地圖圖塊的位置,否則除了白色畫布之外,您將看不到任何東西。

抱歉沒有先在我這邊運行代碼!

這是一個分步解決方案:

簡單來說:

1- 您必須使用Mobile Atlas Creator下載地圖圖塊。 我已經解釋了這里的步驟

2- 將生成的 zip 文件移動到設備上的/mnt/sdcard/osmdroid/

3- 將osmdroid-android-XXX.jarslf4j-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 磁貼服務器的大量流量,並且可能會被阻止。 請不要使用它。

除了地圖圖塊,您還可以為離線地圖使用矢量數據,例如 mapsforge 或 Mapbox Android SDK。 有關更多信息,請參閱 OSM wiki 關於離線 OSMAndroid 庫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM