如何从OpenStreetMap离线创build地图图块,在Android上显示?

我想要的是使用OpenStreetMap显示一个简单的离线地图。 我无法在networking中find正确的工具来创build地图切片,并使用它在Android中显示地图。 我已经下载了不同的资源,但似乎我不知道从哪里开始。 我想使用JOSM集成来自OpenStreetMap的图像,但我不知道是否可以在Android上使用它。

我可以使用Mapnik吗? 你的帮助将非常感谢你。

Solutions Collecting From Web of "如何从OpenStreetMap离线创build地图图块,在Android上显示?"

我目前正在使用OpenStreetMap(OSM)API开发(我的第一个)Android应用程序,所以虽然我不能帮助您使用JSOM,但我可以尝试帮助OSM部分:

假设你想在你的android应用程序中创build一个新的活动,它只是显示一个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> 

至于实际的地图瓦片,有一个非常酷的程序称为移动阿特拉斯造物主 ,它可以让你生成上面实现的脱机Android地图必要的地图瓦片。

一旦你安装了应用程序,并且你想创build一个新的地图集,你会被要求select你的“所需的altas格式”。 当这个popup时,select“Osmdroid zip”。

一切加载完成后,在地图上select要创build拼贴的区域,select要拼贴的缩放级别,然后点击左侧栏中的“添加select”button,然后点击“创build图集”。

哦,根据来源,你可能需要检查“创build/调整地图瓷砖”checkbox,强制瓷砖导出为PNG – 有谁知道是否有可能使用JPG与OSM?

一旦生成ZIP,我将其重命名为“Mapnik.zip”,并将其移动到我的Eclipse Android项目工作区中名为“tiles”的新创build的文件夹中。 为了得到它的工作,我还必须打开zip文件,并从“Google地球”(取决于您使用的地图源)等的顶级文件夹重命名为“Mapnik”,以便瓦片显示在我的Android应用程序中。

但是,为了实际将拼贴加载到手机上,您需要使用terminal上的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中创build了一个新项目,把我的代码放在那里,修正了一些东西,并启动并运行。 我所做的所有更改都反映在上面的代码中! 我忘记了几个基本的导入语句,并且我忘了给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> 

而且你也可能想把这个添加到清单中,尽pipe当然不是关键的:

 <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,我的代码一直在崩溃,直到我想起来包含它。

确保修改默认的坐标,使它们指向一个你实际上有地图图块的位置,否则除了白色的canvas外,你不会看到任何东西。

对不起,我没有先运行我的代码!

inheritance人一步一步的解决scheme:

简单来说:

1-您必须使用Mobile Atlas Creator下载地图图块。 我已经解释了这里的步骤

2-将生成的zip文件移动到设备上的/mnt/sdcard/osmdroid/

3-将osmdroid-android-XXX.jar和slf4j-android-1.5.8.jar添加到您的项目的构buildpath

4-添加MapView:你可以添加一个MapView到你的xml布局

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

或以编程方式创buildMapView:

 @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" /> 

这是一个很好的示例项目 。 希望能帮助到你 ;)

您也可以使用vector数据来绘制贴图,例如mapsforge或Mapbox Android SDK。 有关更多信息,请参阅OSM维基有关脱机OSM和Android库的信息 。