当前位置: 首页 > 面试题库 >

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

施自明
2023-03-14
问题内容

我想要的是使用OpenStreetMap显示一个简单的脱机地图。我在网络上找不到合适的工具来创建地图图块并使用它在Android中显示地图。我下载了不同的资源,但似乎我不知道从哪里开始。我想使用JOSM集成来自OpenStreetMap的图像,但是我不知道我是否可以在Android上使用它。

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


问题答案:

我目前正在使用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格式”。弹出时,选择“ 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,我的代码一直崩溃,直到我记得包括它。

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

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



 类似资料:
  • 问题内容: 我想从图像为JMapViewer创建离线地图图块。我怎么能做到呢?生成这些图块的工具是什么? 问题答案: 有多种方法可以实现该目标。它们全部利用外部工具链: 1.离线渲染器 这有点复杂,因为您需要使用渲染器,地图样式和OSM数据包在盒子上渲染自己的地图图块。第一种简单的方法是使用 Maperitive,因为它很容易配置并且带有样式。更高级的是,您可以设置整个OSM渲染堆栈(Mapnik

  • 我想从图像为JMapViewer创建离线地图瓷砖。我怎样才能做到?用来生成那些瓷砖的工具是什么?

  • 问题内容: 我没有找到这样的多图构造…当我想这样做时,我遍历了地图,并填充了多图。还有其他方法吗? 第一个结果是,但我希望 问题答案: 假设你有 那我相信这是最好的 或更佳,但更难阅读

  • 本文向大家介绍python在openstreetmap地图上绘制路线图的实现,包括了python在openstreetmap地图上绘制路线图的实现的使用技巧和注意事项,需要的朋友参考一下 利用python进行经纬度轨迹展示 嘿!各位好久不见,距离第一次发博客已经过去两年多了,本人也从本科生变成了研究生,好了书归正传,最近在做一个关于航班滑行路径轨迹的项目,目的是将航班的经纬度数据在地图上显现出来并

  • 我创建了一个包含一系列数据的图表。现在,我正在尝试向图表中添加一个滑块/线标记,如下所示。 我使用此处提供的MPAndroidChart库创建了图形/图表https://github.com/PhilJay/MPAndroidChart. 该图似乎运行良好,但我需要像下面这样的线滑块,以便当我触摸图形时,线滑动并提供与图形相交的线的值。有人能帮我解决这个问题吗,或者我必须使用不同的库来实现这一点。

  • 我想使用GeoJSON数据在Google地图上显示城市边界,我使用以下工具获得这些数据。 我去nominatim.openstreetmap.org寻找一个城市(例如丹佛) 使用检索到的OSM ID(在本例中为:253750),然后我使用在线工具(polygons.openstreetmap.fr)生成了GeoJSON文件-看起来像这样http://polygons.openstreetmap.f