如何在Android应用程序中使用OSM地图?是否有关于在Android中使用OSM的教程?

17

我正在寻找一份教程/手册或步骤,以将Open street map包含到我的安卓应用程序中。我发现的要么是一个拥有更多功能的大项目,否则就是很多问题没有得出“如何”正确的结论..!

是否有任何适合新手参考的正确博客/网站或文档?


2
由于您没有提及您想要包含的OSM数据的如何/哪些方面,我可以给您指出这个链接,它不是一个教程,而是一个总体概述: http://wiki.openstreetmap.org/wiki/Frameworks - MaM
5个回答

18

我不知道是否有任何教程,但这是我为使用Osmdroid编写的最简示例代码。

// This is all you need to display an OSM map using osmdroid
package osmdemo.demo;

import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapController;
import org.osmdroid.views.MapView;
import android.app.Activity;
import android.os.Bundle;

public class OsmdroidDemoMap extends Activity {
    private MapView         mMapView;
    private MapController   mMapController;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.osm_main);
        mMapView = (MapView) findViewById(R.id.mapview);
        mMapView.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE);
        mMapView.setBuiltInZoomControls(true);
        mMapController = (MapController) mMapView.getController();
        mMapController.setZoom(13);
        GeoPoint gPt = new GeoPoint(51500000, -150000);
        mMapController.setCenter(gPt);
    }
}
/* HAVE THIS AS YOUR osm_main.xml
---------------------------------------------------------- XML START
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <org.osmdroid.views.MapView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/mapview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true" />
</LinearLayout>
---------------------------------------------------------- XML END
Include slf4j-android-1.5.8.jar and osmdroid-android-4.1.jar in the build path
(Google search for where to get them from)
*/

请注意,为避免无法从OSM下载图块,您现在必须使用最新版本(4.1)。

另外请注意,他们正在将其存储库迁移到Github,但该过程尚未完成。此页面下载包含jar文件的链接。


当我执行应用程序时,我只得到一个空的网格。有一个放大/缩小按钮,但它只是在网格上放大和缩小。难道OpenStreetMaps.org要求您将API密钥合并到应用程序中,以便能够检索瓷砖吗? - Red Knight

7

这个 OSMdroid 的示例项目 绝对是我找到的最简单的。只需要5分钟就可以使用,注意清单文件。

为了更复杂一些,这个教程显示带有当前地理点的地图。

这里有一些来自各种项目的代码片段,虽然没有测试所有的内容。

你应该下载OSMdroidSLF4J,将其放置在libs文件夹中,将 osmdroid 添加为库,使用适当的权限修复 AndroidManifest.xml(见第一个教程)。如果你这样做了,就没有必要像第一个教程中推荐的那样修改 gradle.build 文件。

我建议您在使用这些内容时,首先使用较旧版本的 osmdroid (3.x)。一旦您感到舒适,就迁移到较新版本的 osmdroid (4.x 或 5.x)。

在较新版本中 GeoPoint 和 MapController 类更改了名称,因此要注意不兼容类型错误

IGeoPoint 无法转换为 GeoPoint

IMapController 无法转换为 MapController


4
我已经在这里解释了步骤。我还建议您查看他们的示例项目,非常有用。以及他们关于如何使用osmdroid库的文档;)
对于离线使用 1-您必须使用MOBAC下载地图。
2-将其放入/mnt/sdcard/osmdroid/ 完成以上步骤后,一切都与@Nick解释的相同。

使用 MOBAC 下载离线地图时,应该选择什么格式? - TheRealChx101

4
人们在使用类似谷歌地图的服务时常犯的一个错误是将OpenStreetMap仅视为地图切片提供者。您需要知道,OpenStreetMap实际上是一个大型免费可编辑的维基地理数据库,您可以通过三种不同的方式使用此数据库。
  1. 您可以创建工具来写入此数据库。有REST Api https://wiki.openstreetmap.org/wiki/API_v0.6。如果您需要对数据库进行更改,则使用此选项。这是最不常见的用例,但文档最详尽。API是主要的OSM API,也可以用于下载数据,但不推荐使用它来下载OSM数据。
  2. 接下来,您可以从此数据库中读取数据。最好的方法是下载星球萃取物 https://wiki.openstreetmap.org/wiki/Planet.osm 和由geofabrik托管的较小的萃取物 http://download.geofabrik.de/。如果您想进行更具体的查询,最好的选择可能是Overpass API https://wiki.openstreetmap.org/wiki/Overpass_API
  3. 最后,还有一系列基于OSM数据构建的服务,如(地图切片、路径规划、POI搜索、地理编码)。这很可能是您正在寻找的,有很多选择。对于Android来说,一个很好的完整解决方案是Mapbox https://www.mapbox.com/android-docs/map-sdk/overview/。 Mapbox android sdk的最棒之处在于它们提供了所有东西,如地图切片、路径规划、POI搜索、地理编码、离线地图,甚至使用一个服务进行实时交通。此外,您可以访问上面的链接并查看教程和示例代码。一个不好的地方是您需要使用mapbox服务,并存在供应商锁定的风险,但大多数mapbox产品都是开源的。如果您努力一点,也应该能够为自己拼凑其他解决方案。
希望这可以帮助到您。

0

OSM 真的很棒,但是使用起来特别困难,尤其是它的 Google API,而且没有太多的教程和文档。最好的选择是使用像 mapbox 这样的服务,它们有很棒的文档和大量资源,易于使用且价格实惠。希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接