Android 地图导航调用百度地图、高德地图、腾讯地图
效果图
前言
为什么调用第三方呢?集成在App里面不行吗?
- 接入导航SDK,以百度为例,apk包体积能增加小几十兆之多,上一版本还是几兆的apk,迭代一版本直接几十兆了,落差之大,难以接受。
- 虽说当下流量不值钱了,但是下载时长越久,客户丢失率越高。
- 最关键的是,当下地图并非一家独大,客户应该有自主选择的权利,你集成了百度,但用户却钟爱于高德,这极为尴尬。
- 且当下包括微信等一众主流App都是通过调用第三方地图来做的,这显然有一定道理,也是大势所趋。
- 坑多,显然是干不过别人一个团队专门来做地图的,不如站在巨人的肩上。
综上所诉,优点显而易见。
坐标系
有地图就有经纬度,有经纬度就扯到坐标系,简单介绍一下坐标系。
主要有以下三种:
- WGS84:一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系。
- GCJ02:由中国国家测绘局制订的地理信息系统的坐标系统,是由WGS84坐标系经过加密后的坐标系。
- BD09:百度坐标系,在GCJ02坐标系基础上再次加密。其中BD09LL表示百度经纬度坐标,BD09MC表示百度墨卡托米制坐标。
更多的坐标知识介绍
百度使用的自家BD09LL坐标系,高德和腾讯都是GCJ02即火星坐标系,所以相互之间是需要转换的,不然会有位置偏移。
转换方法:
/*** 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);double lat = z * Math.sin(theta);return 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);}
业务需求
还是简单描述一下业务需求,点击一个地址或者按钮或者地图上的一个点,弹窗选择第三方地图导航,点击选择后调用第三方地图进行导航。
1,点击按钮弹窗选择
@OnClick({R.id.tv_navigation})public void onViewClicked(View view) {switch (view.getId()) {...case R.id.tv_navigation:showMapList();break;}}
2,弹窗
private void showMapList() {final String[] mapNames = {"百度地图", "高德地图", "腾讯地图"};final String[] packageNames = {"com.baidu.BaiduMap", "com.autonavi.minimap", "com.tencent.map"};AlertDialog.Builder builder = new AlertDialog.Builder(this).setTitle("请选择地图").setItems(mapNames, (dialogInterface, i) -> {boolean installed = isInstalled(packageNames[i]);if (installed) {switch (i) {case 0:gotoBaiDuMap();break;case 1:gotoGaoDeMap();break;case 2:gotoTencentMap();break;}} else {ToastUtil.showCenterToast(mapNames[i] + "未安装");}});builder.create().show();}
调用之前判断一下是否安装:
/*** 检测所选地图是否安装*/private boolean isInstalled(String packageName) {PackageManager manager = this.getPackageManager();List<PackageInfo> installedPackages = manager.getInstalledPackages(0);if (installedPackages != null) {for (PackageInfo info : installedPackages) {if (info.packageName.equals(packageName))return true;}}return false;}
3,调用地图
别忘了 申请权限。
百度地图
- 参数说明:
参数以字符串拼接的方式即可,这里用StringBuffer拼接,比String易读些。
- 调用示例:
private void gotoBaiDuMap() {// 驾车导航StringBuffer sb = new StringBuffer("baidumap://map/navi").append("?coord_type=gcj02").append("&query=").append("长宁图书馆").append("&src=").append(this.getPackageName());Intent intent = new Intent();intent.setData(Uri.parse(sb.toString()));startActivity(intent);}
高德地图
- 参数说明:
- 调用示例:
private void gotoGaoDeMap() {LatLng endPoint = BD2GCJ(new LatLng(31.220567, 121.395174));//转换坐标系StringBuffer sb = new StringBuffer("androidamap://navi").append("?sourceApplication=").append(getString(R.string.app_name)).append("&lat=").append(endPoint.latitude).append("&lon=").append(endPoint.longitude).append("&dev=0");Intent intent = new Intent();intent.addCategory(Intent.CATEGORY_DEFAULT);intent.setPackage("com.autonavi.minimap");intent.setData(Uri.parse(sb.toString()));startActivity(intent);}
腾讯地图
- 参数说明:
- 调用示例:
private void gotoTencentMap() {LatLng startPoint = BD2GCJ(new LatLng(mLatitude, mLongitude));//坐标转换LatLng endPoint = BD2GCJ(new LatLng(31.220567, 121.395174));//坐标转换StringBuffer sb = new StringBuffer("qqmap://map/routeplan").append("?type=drive").append("&from=我的位置").append("&fromcoord=").append(startPoint.latitude).append(",").append(startPoint.longitude).append("&to=长宁图书馆").append("&tocoord=").append(endPoint.latitude).append(",").append(endPoint.longitude).append("&referer=你的key");Intent intent = new Intent();intent.setAction(Intent.ACTION_VIEW);intent.setData(Uri.parse(sb.toString()));startActivity(intent);}
注意,腾讯地图这里的from和to参数虽然可以省略,但是地图上就不显示地址了,默认是 地图上的点,而且referer参数需要申请开发者key。
文档
- 百度地图
- 高德地图
- 腾讯地图
https://blog.csdn.net/Ever69/article/details/82427085
Android 地图导航调用百度地图、高德地图、腾讯地图相关推荐
- [html] 如何使用H5唤起原生地图APP(百度、高德、腾讯地图等)
[html] 如何使用H5唤起原生地图APP(百度.高德.腾讯地图等) <iframe src="sinaweibo://qrcode"> 或 <a href=& ...
- android 跳转腾讯地图导航,Android 跳转到百度、高德、腾讯地图导航
项目中遇到的一个需求,跳转外部App进行步行导航.分别是百度.高德.腾讯. 东西不难但是每次都要去官方文档找(有时候会更新一些字段). 所以在此做下记录和分享. 腾讯地图 try { LatLng l ...
- android 通过scheme唤起百度、高德、腾讯地图路线规划功能,唤起滴滴出行打车功能
import android.content.Context; import android.content.Intent; import android.net.Uri;import java.ut ...
- android app调用第三方地图路线规划导航(百度,高德,腾讯)
android app调用第三方地图路线规划导航(百度,高德,腾讯) 因为直接使用高德的sdk提供的导航被投诉说不准,所以需要接第三方. 把BAT系的地图都接上了,有兄弟找到其他的地图调用方法告诉下小 ...
- Android 地图导航调用百度地图、高德地图、腾讯地图,腾讯T3团队整理
前言 ============================================================= 为什么调用第三方呢?集成在App里面不行吗? 接入导航SDK,以百度为 ...
- Android 地图导航调用百度地图、高德地图、腾讯地图,ffmpeg音视频开发实战5
switch (view.getId()) { - case R.id.tv_navigation: showMapList(); break; } } 2,弹窗 ================== ...
- Flutter 跳转地图软件调起导航:百度、高德、腾讯、苹果
一.说明 我们在应用开发中经常需要用到地图定位或导航的功能,而集成该功能的方式总的来说分为两类: 第 1 类:App 集成导航功能 这种方式的优点是可以进行深度地图定制,比如出行或外卖软件会有自己的定 ...
- APP跳转百度、高德、腾讯地图导航
这个本来是一个很简单的需求,奈何我遇到了很奇葩的问题.最开始我用的是百度sdk中的跳转api,自己用小米和联想测试跳转没有问题,然而用户的魅蓝note5点击跳转没有任何响应,后来又陆续出现了华为met ...
- 分享一个关于Java调用百度、高德API、ArcGIS地图获取逆地理的代码
百度地图和高德地图用户获取国内地址, 区别在于高德地图的精确度比百度地图要高一点, 百度经纬度和高德地图经纬度位置相反, 高德地图不支持国外地址, ArcGIS地图获取国外地址 1.首先需要到高德开发 ...
最新文章
- 高老师的架构设计_隽语集(CC_1201)
- 深度学习实现NBA球星颜值打分完整案例(二)
- java构造函数调用其他程序的顺序_java初始化构造函数调用顺序
- ThreadPoolExcutor 线程池 异常处理 (上篇)
- flutter在2019年会有怎样的表现?
- ae运动模糊怎么调整_如何快速成长为一名AE高手?
- MTK 驱动开发(39 )---待机流程
- Spring Cloud与微服务学习总结(3)——认证鉴权与API权限控制在微服务架构中的设计与实现(一)
- 【关键词排名点击软件】网站关键词挖掘常用的五个工具
- java j2ee j2se_j2ee与j2se对比
- 德阳计算机办公培训,德阳2017计算机办公软件培训
- PL/SQL Developer 9.0.1.1613
- magicbook的linux是哪个版本,荣耀MagicBook 2019预装Linux 影响使用吗
- 嵌入式linux备份flash,嵌入式Linux裸机开发(十一)——Nandflash
- 重庆航天职业技术学院计算机宿舍,2019年重庆航天职业技术学院寝室宿舍条件与学校食堂环境图片...
- Android 11源码 Framework修改默认usb连接模式为MTP模式
- 智慧车行预约小程序,汽车保养、维修、美容、检测预测小程序,前后端完整代码包括车行动态,养车常识,保养预约,维修预约,洗车美容预约
- windows设置显示隐藏文件
- 2022-2028全球丁二磺酸腺苷蛋氨酸行业调研及趋势分析报告
- 29. Compose实现瀑布流 StaggeredGrid
热门文章
- 小猿圈分享免费自学编程的10个网站
- 《HelloGitHub》第 81 期
- MATLAB 三维立体绘图
- deep learning编程作业总结1---喵咪识别
- Qt--3D中制作坐标系(5.12)
- 判断二维字符数组是否存在回文字符串例如:char a[] [10]={“asd“,“asa“,“werew“,“yuyu“}; 提示存在回文字符串,回文字符串对称
- 浙江电信网速测试皮肤软件,浙江电信网速测试(进入中国电信官方测速网站)
- MATLAB中实现特定像素区域处理
- JavaEE 企业级分布式高级架构师(十七)ElasticSearch全文检索(1)
- 计算机查看流量记录,教你用路由器查看电脑数据流量使用情况的方法