如何在 android 应用程序中使用 OSM 地图。?有啥教程可以学习在android中使用OSM吗?

Posted

技术标签:

【中文标题】如何在 android 应用程序中使用 OSM 地图。?有啥教程可以学习在android中使用OSM吗?【英文标题】:How to use OSM map in an android application.? Is there any tutorial to learn about using OSM in android.?如何在 android 应用程序中使用 OSM 地图。?有什么教程可以学习在android中使用OSM吗? 【发布时间】:2014-04-13 07:07:05 【问题描述】:

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

有没有合适的博客/网站或文档可供新手参考?

【问题讨论】:

由于您不是在谈论您想要包含 OSM 数据的方式/哪些方面,我可以指出这一点,这不是一个教程,而是一个总体概述:wiki.openstreetmap.org/wiki/Frameworks 【参考方案1】:

我不知道任何教程,但这是我为使用 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_
    android:layout_
    android:orientation="vertical" >
    <org.osmdroid.views.MapView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/mapview"
        android:layout_
        android:layout_
        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)
*/

请注意,您现在必须使用最新版本 (4.1) 以避免被阻止从 OSM 下载图块。

另请注意,他们正在将存储库移至 Github,并且该过程尚未完成。此页面downloads 包含罐子的链接

【讨论】:

当我执行应用程序时,我得到的只是一个空网格。有一个放大/缩小按钮,但它只是在网格上放大和缩小。会不会是 OpenStreetMaps.org 要求您将 API 密钥合并到应用程序中,以便它能够检索图块?【参考方案2】:

This OSMdroid sample project 绝对是我遇到的最简单的。启动和运行不超过 5 分钟。注意清单文件。

为了更复杂一点,this tutorial 显示带有当前地理点的地图。

Here are some snippets 来自各个项目。不过,还没有测试所有这些。

你应该下载OSMdroid和SLF4J,放在libs文件夹,Add as Libraryosmdroid,用适当的权限修复AndroidManifest.xml(见第一个教程)。如果您这样做,则无需按照第一个教程中的建议更改 gradle.build 文件。

对于初学者,我建议您在使用这些时使用旧版本的 osmdroid (3.x)。适应后,迁移到更新版本的 osmdroid(4.x 或 5.x)。

GeoPoint 和 MapController 类在较新版本中更改名称,因此请注意INCOMPATIBLE TYPES ERROR

IGeoPoint 无法转换为 GeoPoint

IMapController 无法转换为 MapController

【讨论】:

完美答案兄弟 ;)【参考方案3】:

我已经解释了HERE的步骤。 我还建议您查看他们的Sample Project,这非常有用。以及他们关于HOW 的文档;)

对于离线使用

1- 您必须使用MOBAC 下载地图。

2- 放入/mnt/sdcard/osmdroid/

在这些步骤之后,一切都与@Nick 解释的相同。

【讨论】:

使用MOBAC下载的离线地图应该是什么格式?【参考方案4】:

使用类似服务的 Google Maps 的人犯的一个错误是他们将 OpenStreetMap 视为只是地图图块提供者。您需要知道 OpenStreetMap 实际上是一个大型的免费可编辑 wiki 地理数据库,您可以通过三种不同的方式使用该数据库。

    您可以制作工具来写入此数据库。有 REST Api https://wiki.openstreetmap.org/wiki/API_v0.6 。如果您必须对数据库进行更改,这就是您使用的。这是最不常见的用例,但记录最完整。该 API 是 OSM 的主要 API,也可用于下载数据,但不推荐下载 OSM 数据。

    接下来您可以从此数据库中读取数据。最好的方法是下载行星提取物https://wiki.openstreetmap.org/wiki/Planet.osm 和geofabrik http://download.geofabrik.de/ 托管的更小的提取物。如果您想进行更具体的查询,最好的选择可能是 Overpass API https://wiki.openstreetmap.org/wiki/Overpass_API。

    最后,还有一系列基于 OSM 数据构建的服务,例如(地图图块、路由、POI 搜索、地理编码)。这很可能是您正在寻找的,有很多选择。对于 Android,一个很好的完整解决方案是 Mapbox https://www.mapbox.com/android-docs/map-sdk/overview/ 。 mapbox android sdk 的伟大之处在于,它们使用一项服务提供地图图块、路由、POI 搜索、地理编码、离线地图甚至实时流量等一切。您也可以按照上面的链接查看教程和示例代码。一件坏事是您将需要使用 mapbox 服务并且存在供应商锁定的风险,但大多数 mapbox 产品都是开源的。如果您努力工作,您也应该能够为自己拼凑出其他解决方案。

希望这会有所帮助。

【讨论】:

【参考方案5】:

OSM 确实很棒,但很难专门与它的 google api 一起使用,而且没有太多的教程和文档,最好的选择是使用像 mapbox 这样的服务 它具有出色的文档和大量资源,易于使用且价格合理。希望这会有所帮助。

【讨论】:

以上是关于如何在 android 应用程序中使用 OSM 地图。?有啥教程可以学习在android中使用OSM吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 android 中的 OSM 数据为单个城市实现离线地理编码器?

Android OSM 机器人 - 设置最大缩放级别

在 GeoServer 中使用 OSM 进行路由(最佳实践)

当我触摸地图android Osm时如何关闭infoWindow

如何使用 OSM 判断某个坐标是不是在街道上?

如何通过缓存制作离线地图(使用传单 OSM)?