Android调用跳转百度地图、高德地图、腾讯地图进行目的地导航
Android App跳转百度地图、高德地图、腾讯地图进行目的地导航。
先放上百度、高德、腾讯地图调起API文档地址,有些参数不懂可以参考。
百度地图:http://lbsyun.baidu.com/index.php?title=uri/api/android
高德地图:https://lbs.amap.com/api/amap-mobile/guide/android/navigation
腾讯地图:http://lbs.qq.com/uri_v1/guide-mobile-navAndRoute.html
1、坐标系
1.1 坐标系的种类
目前坐标系有三种,分别是WGS84、GCJ02、BD09,国内基本用的是后两种。
WGS84:国际坐标系,为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系。
GCJ02:火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。高德、腾讯都是用的这种。
BD09:为百度坐标系,在GCJ02坐标系基础上再次加密。其中BD09ll表示百度经纬度坐标,BD09mc表示百度墨卡托米制坐标。百度地图sdk默认输出的是BD09ll,定位sdk默认输出的是GCJ02。
1.2 坐标系转换
调用高德地图喝腾讯地图需要传入GCJ02坐标系坐标,调用百度地图需要传入BD09坐标系坐标。因为我的项目中用的是百度地图sdk,所以调用高德和腾讯地图需要将坐标转换格式。
这两种坐标系相互转换的方法如下
/*** BD-09 坐标转换成 GCJ-02 坐标*/public static LatLng BD2GCJ(LatLng bd) {double x = bd.longitude - 0.0065, y = bd.latitude - 0.006;double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * Math.PI);double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * Math.PI);double lng = z * Math.cos(theta);//lngdouble lat = z * Math.sin(theta);//latreturn new LatLng(lat, lng);}/*** GCJ-02 坐标转换成 BD-09 坐标*/public static LatLng GCJ2BD(LatLng bd) {double x = bd.longitude, y = bd.latitude;double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * Math.PI);double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * Math.PI);double tempLon = z * Math.cos(theta) + 0.0065;double tempLat = z * Math.sin(theta) + 0.006;return new LatLng(tempLat, tempLon);}
2、调用跳转第三方地图进行导航
2.1 检测是否安装第三方地图
在调用跳转第三方地图进行导航前需要检查手机是否安装有要跳转的第三方地图,检测方法如下,有安装返回true,否则返回false。
/*** 检测程序是否安装** @param packageName* @return*/private boolean isInstalled(String packageName) {PackageManager manager = mContext.getPackageManager();//获取所有已安装程序的包信息List<PackageInfo> installedPackages = manager.getInstalledPackages(0);if (installedPackages != null) {for (PackageInfo info : installedPackages) {if (info.packageName.equals(packageName))return true;}}return false;}
2.2 跳转第三方地图并传参
2.2.1 百度地图
跳转百度地图导航的URL接口为
URL接口:baidumap://map/navi
需要传递的参数有
参数名称 | 描述 | 是否必选 | 格式(示例) |
---|---|---|---|
location | 坐标点,location与query二者必须有一个,当有location时,忽略query;坐标类型参考通用参数:coord_type。 | 可选 | 经纬度:39.9761,116.3282 |
query | 搜索key,location与query二者必须有一个,当有location时,忽略query;坐标类型参考通用参数:coord_type。 | 可选 | 故宫 |
type | 路线规划类型,BLK:躲避拥堵(自驾);TIME:高速优先(自驾);DIS:不走高速(自驾);FEE:少收费(自驾); DEFAULT:不选择偏好;空或者无此字段:使用地图中已保存的路线偏好(缺省值)。 | 可选 | |
src | 统计来源 | 必选 |
参数格式为:andr.companyName.appName 不传此参数,不保证服务 |
官方文档代码使用示例
Intent i1 = new Intent();// 驾车导航i1.setData(Uri.parse("baidumap://map/navi?query=故宫&src=andr.baidu.openAPIdemo"));startActivity(i1);
上面是百度文档的描述,但是我查看网上的代码,有些没有规定的参数也可以传。我使用跳转百度地图的方法如下
/*** 跳转百度地图*/private void goToBaiduMap() {if (!isInstalled("com.baidu.BaiduMap")) {T.show(mContext, "请先安装百度地图客户端");return;}Intent intent = new Intent();intent.setData(Uri.parse("baidumap://map/direction?destination=latlng:"+ mLat + ","+ mLng + "|name:" + mAddressStr + // 终点"&mode=driving" + // 导航路线方式"&src=" + getPackageName()));startActivity(intent); // 启动调用}
2.2.2 高德地图
官方文档代码使用示例
cat=android.intent.category.DEFAULT
dat=androidamap://navi?sourceApplication=appname&poiname=fangheng&lat=36.547901&lon=104.258354&dev=1&style=2
pkg=com.autonavi.minimap
参数说明
参数 | 说明 | 是否必填 |
---|---|---|
navi | 服务类型 | 是 |
sourceApplication | 第三方调用应用名称。如 amap | 是 |
poiname | POI 名称 | 否 |
lat | 纬度 | 是 |
lon | 经度 | 是 |
dev | 是否偏移(0:lat 和 lon 是已经加密后的,不需要国测加密; 1:需要国测加密) | 是 |
style | 导航方式(0 速度快; 1 费用少; 2 路程短; 3 不走高速;4 躲避拥堵;5 不走高速且避免收费;6 不走高速且躲避拥堵;7 躲避收费和拥堵;8 不走高速躲避收费和拥堵) | 是 |
我使用的跳转高德地图导航方法
/*** 跳转高德地图*/private void goToGaodeMap() {if (!isInstalled("com.autonavi.minimap")) {T.show(mContext, "请先安装高德地图客户端");return;}LatLng endPoint = BD2GCJ(new LatLng(mLat, mLng));//坐标转换StringBuffer stringBuffer = new StringBuffer("androidamap://navi?sourceApplication=").append("amap");stringBuffer.append("&lat=").append(endPoint.latitude).append("&lon=").append(endPoint.longitude).append("&keywords=" + mAddressStr).append("&dev=").append(0).append("&style=").append(2);Intent intent = new Intent("android.intent.action.VIEW", Uri.parse(stringBuffer.toString()));intent.setPackage("com.autonavi.minimap");startActivity(intent);}
但是我这边跳转过去有一个问题,就是一直在显示定位中,如果有知道原因的朋友,可以私信我一下。
2.2.3 腾讯地图
Android 和 iOS 调用地址:
qqmap://map/routeplan
官方文档代码使用示例
//调起腾讯地图APP,显示由清华大学到怡和世家小区的驾车路线
qqmap://map/routeplan?type=drive&from=清华&fromcoord=39.994745,116.247282&to=怡和世家&tocoord=39.867192,116.493187&referer=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77
参数说明
参数 | 必填 | 说明 | 示例 |
---|---|---|---|
type | 是 |
路线规划方式参数: 公交:bus 驾车:drive 步行:walk 骑行:bike |
type=bus 或 type=drive 或 type=walk 或 type=bike |
from | 否 | 起点名称 | from=鼓楼 |
fromcoord | 是 |
起点坐标,格式:lat,lng (纬度在前,经度在后,逗号分隔) 功能参数值:CurrentLocation :使用定位点作为起点坐标 |
fromcoord=39.907380,116.388501 fromcoord=CurrentLocation |
to | 否 | 终点名称 | to=奥林匹克森林公园 |
tocoord | 是 | 终点坐标 | tocoord=40.010024,116.392239 |
referer | 是 | 请填写开发者key, [点此申请] | referer=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77 |
经过我多次尝试,发现只传type和tocoord就可以,它会默认定位起点为你当前位置
/*** 跳转腾讯地图*/private void goToTencentMap() {if (!isInstalled("com.tencent.map")) {T.show(mContext, "请先安装腾讯地图客户端");return;}LatLng endPoint = BD2GCJ(new LatLng(mLat, mLng));//坐标转换StringBuffer stringBuffer = new StringBuffer("qqmap://map/routeplan?type=drive").append("&tocoord=").append(endPoint.latitude).append(",").append(endPoint.longitude).append("&to=" + mAddressStr);Intent intent = new Intent("android.intent.action.VIEW", Uri.parse(stringBuffer.toString()));startActivity(intent);}
3、总结
调用第三方地图导航,要先搞清楚自己使用的是那种坐标系,如果坐标系不正确,位置导航会有偏差。百度和腾讯调起使用都比较简单,结合文档和网上示例很容易实现,但是高德这个我在用的时候就比较麻烦了,比如现在还不知道为什么会一直在定位中,不能导航。希望有知道的朋友可以告诉我一下吧。
2018-09-14更新
1、加入了跳转第三方导航显示目的地地址
2、高德地图一直显示定位不知道是不是手机问题,在别的测试机上可以正常使用。
Android调用跳转百度地图、高德地图、腾讯地图进行目的地导航相关推荐
- android 通过scheme唤起百度、高德、腾讯地图路线规划功能,唤起滴滴出行打车功能
import android.content.Context; import android.content.Intent; import android.net.Uri;import java.ut ...
- 安卓APP跳转百度、高德、腾讯地图
一:国内主流坐标系类型 来自百度地图的介绍: https://lbsyun.baidu.com/index.php?title=androidsdk/guide/coordtrans 主要有以下三种 ...
- APP跳转百度、高德、腾讯地图导航
这个本来是一个很简单的需求,奈何我遇到了很奇葩的问题.最开始我用的是百度sdk中的跳转api,自己用小米和联想测试跳转没有问题,然而用户的魅蓝note5点击跳转没有任何响应,后来又陆续出现了华为met ...
- [html] 如何使用H5唤起原生地图APP(百度、高德、腾讯地图等)
[html] 如何使用H5唤起原生地图APP(百度.高德.腾讯地图等) <iframe src="sinaweibo://qrcode"> 或 <a href=& ...
- android 跳转腾讯地图导航,Android 跳转到百度、高德、腾讯地图导航
项目中遇到的一个需求,跳转外部App进行步行导航.分别是百度.高德.腾讯. 东西不难但是每次都要去官方文档找(有时候会更新一些字段). 所以在此做下记录和分享. 腾讯地图 try { LatLng l ...
- 高德地图怎么搜索marker_百度、高德、腾讯地图坐标认证怎么弄,3分钟轻松自助认证...
各位头条的朋友,各位长期关注我的无人店运营情况的朋友,大家好.上次跟大家分享了一些无人店引流的办法,有一些已经开店的朋友就很感兴趣,纷纷私信问我,具体怎么操作.这次有机会就跟大家讲一下,百度.高德地图 ...
- android app调用第三方地图路线规划导航(百度,高德,腾讯)
android app调用第三方地图路线规划导航(百度,高德,腾讯) 因为直接使用高德的sdk提供的导航被投诉说不准,所以需要接第三方. 把BAT系的地图都接上了,有兄弟找到其他的地图调用方法告诉下小 ...
- android 跳转腾讯地图导航,Android 地图跳转到百度、高德、腾讯导航
项目中遇到的一个需求,跳转外部App进行步行导航.分别是百度.高德.腾讯. 东西不难但是每次都要去官方文档找(有时候会更新一些字段). 所以在此做下记录和分享. 腾讯地图 try { LatLng l ...
- BIGEMAP(百度、高德、谷歌)离线地图二次开发
(百度.高德.谷歌)离线地图二次开发 发布时间:2019-04-10 版权: 1.如何搭建离线地图开发环境 2.下载离线地图数据(金字塔瓦片数据 ...
最新文章
- R语言ggplot2可视化抑制(部分)图例(legend)输出实战:抑制颜色图例输出、保留数据点形状图例输出
- 帅爆了!3个月0基础转型头条数据分析师,他做对了什么?
- 南通大学python期末考试试卷答案_南通大学试卷A(答案及评分标准)
- strstr的应用---Hd 2054 A == B ?
- Java基础笔记 – 增强的for循环For each循环 自动装箱拆箱 可变参数
- HttpHandler(ashx)中获取Session状态
- Google Chrome 53 Beta 引入影子 DOM V1
- Jupyter Notebook导入自定义模块
- 《弗洛伊德及其后继者》读书笔记(part4)--梅兰妮·克莱因与当代克莱因学派理论
- H.265:网络视频的高清时代
- Linux CAN通信
- 如何用python“优雅的”调用有道翻译?
- 实战系列-被面试官问到Feign原理
- 【Spring笔记】使用注解开发
- 案例研究 路由器到路由器EOMPLS---基于端口
- 电大考的是职称英语同计算机,最新电大统考计算机应用基础真题选择题详细分析小抄.doc...
- 秋名山直播php源码,【斗鱼直播源】浏览器抓取真实直播源地址(纯前端JS PHP解析源码)...
- 赢在微点答案专区英语_学乐必赢练习册30册免费领,15年级数学、语法、写作、阅读、词汇一网打尽!...
- C语言中将数字形式的字符串转换为数字的方法
- 移动互联网创业组织可持续发展模型