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

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

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

我目前正在使用OpenStreetMap(OSM)API开发(我的第一个)Android应用程序,因此尽管我无法帮助您使用JSOM,但是我可以尝试帮助OSM部分:

假设您要在仅显示OSM映射的android应用程序中创建一个新活动,则可以从以下内容开始:

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格式”。d出时,选择“ Osmdroid zip”。

加载完所有内容后,在地图上选择要为其创建图块的区域,选择要为其创建图块的缩放级别,然后单击左侧列中的“添加选择”按钮,然后单击“创建图集”。

哦,根据来源,您可能需要选中“创建/调整地图图块”复选框,以强制将图块导出为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

根据地图的大小和手机内存总线的速度,最后一步可能需要几分钟到一个小时才能完成。完成后,您的地图应该可以工作了-希望如此!

如前所述,这是我第一次使用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,我的代码一直崩溃,直到我记得包括它。

确保修改默认坐标,以便它们指向您实际具有地图图块的位置,否则,除了白色画布之外,您不会看到很多东西。

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



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5615531.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-15
下一篇2022-12-15

发表评论

登录后才能评论

评论列表(0条)

    保存