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

rah*_*ame 19 java android map openstreetmap

我想要的是使用OpenStreetMap显示一个简单的离线地图.我无法在网络上找到正确的工具来创建地图图块并使用它来在Android中显示地图.我已经下载了不同的资源,但似乎我不知道从哪里开始.我想使用JOSM整合来自OpenStreetMap的图像,但我不知道我是否可以在Android上使用它.

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

Tim*_*jns 27

我目前正在使用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
Run Code Online (Sandbox Code Playgroud)

您的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>
Run Code Online (Sandbox Code Playgroud)

至于实际的地图图块,有一个非常酷的程序叫做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
Run Code Online (Sandbox Code Playgroud)

根据地图的大小和手机内存总线的速度,最后一步可能需要几分钟到一个小时才能完成.完成后,你的地图应该有效 - 我希望!

正如我所提到的,这是我第一次使用OSM API,所以我绝不是它的专家,我只能评论对我有用的东西.

希望这会帮助您入门!

编辑:

我没有机会实际运行我昨天写的代码,所以我没有发现一些错误.我刚刚在Eclipse中创建了一个新项目,将我的代码转储到那里,修复了一些事情并将其启动并运行.我所做的所有更改都反映在上面的代码中!我忘了几个基本的import语句,我忘了添加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>
Run Code Online (Sandbox Code Playgroud)

而且您也可能希望将其添加到清单中,尽管当然不是关键:

<supports-screens 
    android:anyDensity="true"
    android:resizeable="false"
    android:largeScreens="true"
    android:normalScreens="true"
/>
Run Code Online (Sandbox Code Playgroud)

<uses-sdk ... />零件之后添加此项.

此外,请务必导入以下两个JAR库:

osmdroid-android-3.0.3.jar // Or whatever version you're using...
Run Code Online (Sandbox Code Playgroud)

slf4j-android-1.5.8.jar // Or whatever the latest version is...
Run Code Online (Sandbox Code Playgroud)

没有这个最后的JAR,我的代码一直在崩溃,直到我记得包含它.

确保修改默认坐标,使它们指向您实际拥有地图图块的位置,否则除了白色画布外,您不会看到任何东西.

很抱歉没有先运行我的代码!

  • http://stackoverflow.com/questions/9747765/how-can-download-map-in-osmdroid/9749861#9749861 (2认同)

Mil*_*nia 6

这是一步一步的解决方案:

简单来说:

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"
    />
Run Code Online (Sandbox Code Playgroud)

或者以编程方式创建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;
}
Run Code Online (Sandbox Code Playgroud)

不要忘记将这些权限添加到您的Manifest:

<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" />
Run Code Online (Sandbox Code Playgroud)

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

重要

正如@Scai所说:最近Open Street Map宣布这个工具不好并且有一些问题:

此工具会导致OSM磁贴服务器的流量过大,并且可能会被阻止.请不要使用它.