前言

OpenStreetMap社区是一个由地图制作爱好者组成的社区,这些爱好者提供并维护世界各地关于道路、小道、咖啡馆、铁路车站等各种各样的数据。
OpenStreetMap开源项目可以让程序开发更加灵活,图源更加丰富,例如可以使用谷歌地图,以解决国内无法使用谷歌服务的尴尬。
国内户外导航软件,例如:行者户外帮小狼信标都使用了OpenStreetMap。

Android版OpenStreetMap的github地址:osmdroid

5.2地图缓存的是瓦片,5.4之后地图缓存到数据库

一、环境配置

1、Gradle中添加依赖

compile 'org.osmdroid:osmdroid-android:5.2@aar'

2、权限配置

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

提示:编译版本为23或以上版本,要注意动态获取读写存储空间权限,否则地图可能不显示

二、基础MapView使用

1、使用内置地图源

(1)、在布局文件中添加MapView控件,在代码中找到控件并设置图源

<org.osmdroid.views.MapView
     android:id="@+id/mapView"android:layout_width="match_parent"android:layout_height="match_parent"/>
MapView mMapView= (MapView) findViewById(R.id.mapView);
mMapView.setTileSource(TileSourceFactory.CYCLEMAP);//(OCM等高)若不设置,则默认使用的是MAPNIK(OSM街道)

(2)、直接在代码中new MapView,然后设置图源,并将MapView添加到父布局中

MapView mMapView=new MapView(this);
mMapView.setTileSource(TileSourceFactory.MAPNIK);

2、设置其他地图源

(1)、谷歌图源

a、新建一个谷歌图源类,继承OnlineTileSourceBase

public class GoogleMapsTileSource extends OnlineTileSourceBase {/*** @param aName                a human-friendly name for this tile source  自定图源义名字,会在手机外部存储中新建以该名字命名的文件夹,瓦片存储在其中* @param aZoomMinLevel        the minimum zoom level this tile source can provide  最小缩放级别* @param aZoomMaxLevel        the maximum zoom level this tile source can provide  最大缩放级别* @param aTileSizePixels      the tile size in pixels this tile source provides  瓦片质量 (256)* @param aImageFilenameEnding the file name extension used when constructing the filename  瓦片格式(jpg[有损压缩率高、不透明]、png[无损、透明])* @param aBaseUrl             the base url(s) of the tile server used when constructing the url to download the tiles  下载瓦片的链接(前缀)*/public GoogleMapsTileSource(String aName, int aZoomMinLevel, int aZoomMaxLevel, int aTileSizePixels, String aImageFilenameEnding, String[] aBaseUrl) {super(aName, aZoomMinLevel, aZoomMaxLevel, aTileSizePixels, aImageFilenameEnding, aBaseUrl);}@Overridepublic String getTileURLString(MapTile aTile) {return getBaseUrl() + "&x=" + aTile.getX() + "&y=" + aTile.getY() + "&z=" + aTile.getZoomLevel();}
}

b、new一个谷歌图源对象,并设置MapView图源

String str1 = "http://mt0.google.cn/vt/lyrs=m&hl=zh-CN&gl=cn&scale=2";
String str2 = "http://mt1.google.cn/vt/lyrs=m&hl=zh-CN&gl=cn&scale=2";
String str3 = "http://mt2.google.cn/vt/lyrs=m&hl=zh-CN&gl=cn&scale=2";
String str4 = "http://mt3.google.cn/vt/lyrs=m&hl=zh-CN&gl=cn&scale=2";
GoogleMapsTileSource googleMapsTileSource = new GoogleMapsTileSource("GoogleNormal", 2, 19, 256, ".png", new String[]{str1, str2, str3, str4});
mMapView.setTileSource(googleMapsTileSource);

(2)、必应等图源,使用方法类似于谷歌图源

参考文档:http://blog.csdn.net/youngkingyj/article/details/23365849

3、让瓦片适应不同像素密度

默认地图显示的字体小,图片像素高,可设置以下代码,使地图适应不同像素密度,更美观

mMapView.setTilesScaledToDpi(true);

4、添加指南针

CompassOverlay mCompassOverlay = new CompassOverlay(MainActivity.this, new InternalCompassOrientationProvider(MainActivity.this), mMapView);
mMapView.getOverlays().add(mCompassOverlay);
mCompassOverlay.enableCompass();

按此方法添加指南针之后,部分手机仍不显示指南针,原因未知

5、添加比例尺

ScaleBarOverlay mScaleBarOverlay = new ScaleBarOverlay(mMapView);
mMapView.getOverlays().add(mScaleBarOverlay);

添加上面代码后,比例尺显示在左上角,而且不美观,可以继续添加下面代码,使比例尺显示在左下角

mScaleBarOverlay.setAlignBottom(true);
mScaleBarOverlay.setLineWidth(1 * (getResources().getDisplayMetrics()).density);
mScaleBarOverlay.setMaxLength(0.85f);

6、设置地图中心

GeoPoint geopoint = new GeoPoint(39.986250, 116.400025);
MapController mMapController= (MapController) mMapView.getController();//获取MapView控制器
mMapController.setCenter(geopoint);//设置地图中心

7、其他设置

(1)、设置缩放界别

mMapController.setZoom(15);//设置缩放级别

(2)、设置缩放按钮可见

mMapView.setBuiltInZoomControls(true);//设置缩放按钮可见

(3)、设置多指触控可用

mMapView.setMultiTouchControls(true);//设置多指触控可用

(4)、关闭硬件加速

mMapView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);//关闭硬件加速(绘制轨迹时需要)

(5)、地图可旋转

RotationGestureOverlay mRotationGestureOverlay = new RotationGestureOverlay(this, mMapView);
mRotationGestureOverlay.setEnabled(true);
mMapView.getOverlays().add(mRotationGestureOverlay);

三、进阶使用

1、自定义瓦片缓存位置

默认会在外部存储中新建名为somdroid的文件夹,瓦片就存储在其中。

自定义缓存位置就是在外部存储中创建一个文件夹,然后设置为瓦片的缓存位置,放在MapView初始化之前
例如:

File dir = new File(Environment.getExternalStorageDirectory(), "AAA");//新建文件夹
if (dir.exists()) {File nomedia = new File(dir.getAbsoluteFile() + "/.nomedia");if (!nomedia.exists()) {try {nomedia.createNewFile();} catch (IOException e) {e.printStackTrace();}}
} else {dir.mkdirs();File file = dir.getAbsoluteFile();try {new File(file + "/.nomedia").createNewFile();} catch (Exception ex) {android.util.Log.e(IMapView.LOGTAG, "unable to create a nomedia file. downloaded tiles may be visible to the gallery.", ex);}
}
OpenStreetMapTileProviderConstants.setCachePath(dir + "");//设置MapView的缓存路径

2、添加Marker

Marker marker = new Marker(mMapView);
marker.setIcon(getResources().getDrawable(R.mipmap.ic_launcher));//设置图标
marker.setPosition(geopoint);//设置位置
marker.setAnchor(0.5f, 0.5f);//设置偏移量
marker.setTitle("我是Titile");//设置标题
marker.setSubDescription("我是SubDescription");//设置说明
mMapView.getOverlays().add(marker);//添加marker到MapView

点击Marker之后会出现气泡,显示title和subDescription

3、连线

PathOverlay pathOverlay = new PathOverlay(Color.BLUE, 10, this);
pathOverlay.addPoint(new GeoPoint(39.986250, 116.400025));
pathOverlay.addPoint(new GeoPoint(39.886250, 116.300025));
mMapView.getOverlays().add(pathOverlay);

连线时务必关闭硬件加速,否则可能显示不出来连的线

4、离线地图下载

CacheManager cacheManager = new CacheManager(mMapView);//获取下载器BoundingBoxE6 boundingBoxE6 = mMapView.getBoundingBox();//获取当前区域int tileNum = cacheManager.possibleTilesInArea(boundingBoxE6, 8, 16);//计算当前区域8-16级的瓦片数量cacheManager.downloadAreaAsync(this, boundingBoxE6, 8, 16, new CacheManager.CacheManagerCallback() {//下载@Overridepublic void onTaskComplete() {//下载完成后的回调}});

下载时会有进度框,若点击进度框以外的区域会取消下载,若想修改逻辑可参考CacheManager,自定义一个CacheManage

OpenStreetMap开发文档相关推荐

  1. DotNet 项目开发文档的自动生成和相关工具的使用

    在 VS.Net 的 IDE 中对C#提供了一些可以自动生成的 XML 注释,使用这些注释可以对代码中定义的对象进行说明.注解:通过设置项目属性,在生成项目时,可以让VS.Net自动的将这些注释信息输 ...

  2. 【IT基础】常见的开发文档

    Perface 随着技术的进步,小作坊式的软件开发年代已经过去.目前的软件开发能力在不断提升,用户对软件的功能和性能要求也越来越高,软件开发质量受到关注. 在软件开发过程中,各种数据和代码的管理需要经 ...

  3. 开源轻量级办公系统Sandbox介绍以及配套开发文档连载

    1.Sandbox介绍 Sandbox是一个基于django框架开发的轻量级办公平台,主要模块有:权限控制.资产(库存)管理.设备管理.客户信息管理和工单流程管理,其目的在于建立一套规范化.统一化和清 ...

  4. python软件开发-如何编写Python软件开发文档(7个技巧)

    开发文档是经常被程序员忽略的工作,有时也会被管理者忽略.这往往是由于在项目生命周期结束的后期缺乏时间,以及人们认为自己不擅长写作,其中一些人确实写不好,但他们中的大多数能够完成一个良好的文档. 在任何 ...

  5. 开发文档之 概要设计说明书 详细设计说明书 数据库设计说明书

      软件工程是一门技术含量高设计极其复杂的学科.为了控制好软件产品质量和规范,就必须用大量的文档约束软件工程的进度和状态.浩大的软件工程对于缺少工作和项目经验的人来说,必然是摸不着头脑不知从何开始.[ ...

  6. Android 界面滑动实现---Scroller类 从源码和开发文档中学习(让你的布局动起来)...

    在android学习中,动作交互是软件中重要的一部分,其中的Scroller就是提供了拖动效果的类,在网上,比如说一些Launcher实现滑屏都可以通过这个类去实现..   例子相关博文:Androi ...

  7. Autodesk Infrastructure Map Server 2014的开发文档在哪里?

    Autodesk Infrastructure Map Server(AIMS) 2014已经发布,请看一下产品主页来了解产品的最新特性,然后下载个试用版亲自试一下吧.那么AIMS 2014的开发文档 ...

  8. java skype 类库_Skype4Java 用 实现的 ,内附具体的开发文档和使用说明 Develop 238万源代码下载- www.pudn.com...

    文件名称: Skype4Java下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 516 KB 上传时间: 2014-08-06 下载次数: 0 提 供 者: 褚慧 ...

  9. CRMEB开发文档及目录结构

    CRMEB 开发文档及目录结构 官网 CRMEB v2.6开源地址:http://link.crmeb.net/u/lingting 完整帮助文档:http://help.crmeb.net QQ群: ...

最新文章

  1. 第十三课.随机近似初步:蒙特卡洛方法
  2. 矩阵的特征值和特征向量的雅克比算法C/C++实现
  3. jQuery源码分析系列 : 整体架构
  4. Codeforces 864E Fire(背包DP)
  5. oracle 磁盘响应慢,磁盘故障引起的系统变慢定位
  6. iphone如何信任软件_苹果iPhone手机安装两个微信教程
  7. 快速向表中插入大量数据Oracle中append与Nologgin的作用
  8. windows系统bat批处 注册一个exe执行文件变成服务
  9. eclipse C/C++开发环境配置全过程
  10. 43张图还原煤厂各工段的全工艺流程,构建数字孪生体
  11. matlab求均值、方差
  12. 如何将视频生成M3U8文件格式?
  13. SMT操作手册V1.0 模板
  14. U3D特效笔记——沼泽技能
  15. python中赋值语句和判断语句结合_Python 3 学习的第二小节——判断赋值语句与简单循环...
  16. 抖音电子画册教程html,抖音爆火文字视频制作教程
  17. 快速批量把jpg转换成pdf的方法
  18. matlab 脉冲密度调制,脉冲压缩技术研究指导.doc
  19. Java应用_模拟微信抢红包
  20. 变分推断中的ELBO(证据下界)

热门文章

  1. WordNet、FrameNet 同义词及相关词汇查询
  2. 淘宝天猫运营,天天特价活动规则、要求,商家攻略
  3. 电信客户流失数据分析
  4. nao机器人c语言编程教程,NAO机器人编程学习.pdf
  5. 128g固态硬盘服务器,买美光就后悔 浦科特M5S 128G/SSD评测
  6. [转]张伯伟:在南京大学文学院2009级研究生开学典礼的讲话
  7. ios服务器需要开启ipv6的支持,关于ios苹果APP审核 支持IPv6的问题解答
  8. 赵小楼《天道》《遥远的救世主》深度解析(110)不神之神是谓真神
  9. ArcGIS Pro添加在线底图
  10. 等产量曲线中r_西方经济学(1)阶段性作业2