如何在 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 Library
osmdroid,用适当的权限修复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 数据为单个城市实现离线地理编码器?
在 GeoServer 中使用 OSM 进行路由(最佳实践)