想要使用导航功能可以使用各个地图的开放平台集成导航模块,如果不想集成也可以调起相关app导航

调起其他app首先得使用到该app包名,先贴出来

  

  1. public final static String BAIDU_PACKAGENAME = "com.baidu.BaiduMap";
  2. public final static String GAODE_PACKAGENAME = "com.autonavi.minimap";
  3. public final static String TENCENT_PACKAGENAME = "com.tencent.map";

  1.高德地图

  1.   /**
  2. * 高德导航
  3. * @param context
  4. * @param location
  5. */
  6. public static void gaodeGuide(Context context, double[] location) {
  7. if (isAvilible(context, GAODE_PACKAGENAME)) {
  8. try {
  9. Intent intent = Intent.getIntent("androidamap://navi?sourceApplication=" +
  10. context.getResources().getString(R.string.app_name) +
  11. "&poiname=我的目的地" +
  12. "&lat=" + location[0] +
  13. "&lon=" + location[1] +
  14. "&dev=0");
  15. context.startActivity(intent);
  16. } catch (URISyntaxException e) {
  17. e.printStackTrace();
  18. }
  19. } else {
  20. Toast.makeText(context, "您尚未安装高德地图", Toast.LENGTH_LONG).show();
  21. Uri uri = Uri.parse("market://details?id=com.autonavi.minimap");
  22. Intent intent = new Intent(Intent.ACTION_VIEW, uri);
  23. context.startActivity(intent);
  24. }
  25. }

  2.百度地图

  1. /**
  2. * 百度导航
  3. * @param context
  4. * @param location location[0]纬度lat,location[1]经度lon
  5. */
  6. public static void baiduGuide(Context context, double[] location) {
  7. double[] baiduLoc = GpsUtils.gcj02_To_Bd09(location[0], location[1]);
  8.  
  9. if (isAvilible(context, "com.baidu.BaiduMap")) {//传入指定应用包名
  10. try {
  11.           //intent = Intent.getIntent("intent://map/direction?origin=latlng:34.264642646862,108.95108518068|name:我家&destination=大雁塔&mode=driving®ion=西安&src=yourCompanyName|yourAppName#Intent;scheme=bdapp;package=com.baidu.BaiduMap;end");
  12. Intent intent = Intent.getIntent("intent://map/direction?" +
  13. //"origin=latlng:"+"34.264642646862,108.95108518068&" + //起点 此处不传值默认选择当前位置
  14. "destination=latlng:" + baiduLoc[0] + "," + baiduLoc[1] + "|name:我的目的地" + //终点
  15. "&mode=driving" + //导航路线方式
  16. "&region=" + //
  17. "&src=" +
  18. context.getResources().getString(R.string.app_name) +
  19. "#Intent;scheme=bdapp;package=com.baidu.BaiduMap;end");
  20. context.startActivity(intent); //启动调用
  21. } catch (URISyntaxException e) {
  22. e.printStackTrace();
  23. }
  24. } else {//未安装
  25. //market为路径,id为包名
  26. //显示手机上所有的market商店
  27. Toast.makeText(context, "您尚未安装百度地图", Toast.LENGTH_LONG).show();
  28. Uri uri = Uri.parse("market://details?id=com.baidu.BaiduMap");
  29. Intent intent = new Intent(Intent.ACTION_VIEW, uri);
  30. context.startActivity(intent);
  31. }
  32. }

  3.腾讯地图

  1. /**
  2. * 腾讯导航
  3. * @param context
  4. * @param location
  5. */
  6. public static void tencentGuide(Context context, double[] location) {
  7. String downloadUri = "http://softroute.map.qq.com/downloadfile?cid=00001";
  8. String baseUrl = "qqmap://map/";
  9. String searchPlace = "search?keyword=酒店&bound=39.907293,116.368935,39.914996,116.379321";
  10. String searchAround = "search?keyword=肯德基&center=39.908491,116.374328&radius=1000";
  11. String busPlan = "routeplan?type=bus&from=我的家&fromcoord=39.980683,116.302&to=柳巷&tocoord=39.9836,116.3164&policy=2";
  12. String drivePlan = "routeplan?type=drive&from=&fromcoord=&to=&tocoord=" + location[0] + "," + location[1] + "&policy=1";
  13.  
  14. String tencnetUri = baseUrl + drivePlan + "&referer=" + context.getResources().getString(R.string.app_name);
  15.  
  16. if (isAvilible(context, TENCENT_PACKAGENAME)) {
  17. Intent intent;
  18. try {
  19. intent = Intent.parseUri(tencnetUri, 0);
  20. context.startActivity(intent);
  21. } catch (URISyntaxException e) {
  22. e.printStackTrace();
  23. }
  24. } else {
  25. //直接下载
  26. // Intent intent;
  27. // try {
  28. // intent = Intent.parseUri(downloadUri, 0);
  29. // context.startActivity(intent);
  30. // } catch (URISyntaxException e) {
  31. // e.printStackTrace();
  32. // }
  33. //市场下载
  34. Toast.makeText(context, "您尚未安装腾讯地图", Toast.LENGTH_LONG).show();
  35. Uri uri = Uri.parse("market://details?id=" + TENCENT_PACKAGENAME);
  36. Intent intent = new Intent(Intent.ACTION_VIEW, uri);
  37. context.startActivity(intent);
  38. }
  39. }

在使用的时候需要先检查是否安装了该app

  1. /**
  2. * 检查手机上是否安装了指定的软件
  3. *
  4. * @param context
  5. * @param packageName:应用包名
  6. * @return
  7. */
  8. public static boolean isAvilible(Context context, String packageName) {
  9. //获取packagemanager
  10. final PackageManager packageManager = context.getPackageManager();
  11. //获取所有已安装程序的包信息
  12. List<PackageInfo> packageInfos = packageManager.getInstalledPackages(0);
  13. //用于存储所有已安装程序的包名
  14. List<String> packageNames = new ArrayList<String>();
  15. //从pinfo中将包名字逐一取出,压入pName list中
  16. if (packageInfos != null) {
  17. for (int i = 0; i < packageInfos.size(); i++) {
  18. String packName = packageInfos.get(i).packageName;
  19. packageNames.add(packName);
  20. }
  21. }
  22. //判断packageNames中是否有目标程序的包名,有TRUE,没有FALSE
  23. return packageNames.contains(packageName);
  24. }

调起导航的方法是较为固定的,没啥要说的,这里尤其是想说一下坐标系的问题。

在实际使用过程中发现了百度和其他地图的经纬度使用的时候有偏差的问题,这里是因为百度和其他地图使用了不同的坐标系:

    1. WGS84原始坐标系,一般用国际GPS纪录仪记录下来的经纬度,通过GPS定位拿到的原始经纬度,Google和高德地图定位的的经纬度(国外)都是基于WGS84坐标系的;
      但是在国内是不允许直接用WGS84坐标系标注的,必须经过加密后才能使用;
    1. GCJ02坐标系,又名“火星坐标系”,是我国国测局独创的坐标体系,由WGS84加密而成,在国内,必须至少使用GCJ02坐标系,
      或者使用在GCJ02加密后再进行加密的坐标系,如百度坐标系。高德和Google在国内都是使用GCJ02坐标系,可以说,GCJ02是国内最广泛使用的坐标系;
    1. 百度坐标系:bd-09,百度坐标系是在GCJ02坐标系的基础上再次加密偏移后形成的坐标系,只适用于百度地图。

由于存在火星坐标差异,我们只能把坐标转换成统一的坐标才能够正确使用,转换方法也是有现成的工具方法的:

  1. public class GpsUtils {
  2. public static double pi = 3.1415926535897932384626;
  3. public static double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
  4. public static double a = 6378245.0;
  5. public static double ee = 0.00669342162296594323;
  6.  
  7. public static double transformLat(double x, double y) {
  8. double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y
  9. + 0.2 * Math.sqrt(Math.abs(x));
  10. ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
  11. ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;
  12. ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;
  13. return ret;
  14. }
  15.  
  16. public static double transformLon(double x, double y) {
  17. double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1
  18. * Math.sqrt(Math.abs(x));
  19. ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
  20. ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;
  21. ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0
  22. * pi)) * 2.0 / 3.0;
  23. return ret;
  24. }
  25.  
  26. public static double[] transform(double lat, double lon) {
  27. if (outOfChina(lat, lon)) {
  28. return new double[]{lat, lon};
  29. }
  30. double dLat = transformLat(lon - 105.0, lat - 35.0);
  31. double dLon = transformLon(lon - 105.0, lat - 35.0);
  32. double radLat = lat / 180.0 * pi;
  33. double magic = Math.sin(radLat);
  34. magic = 1 - ee * magic * magic;
  35. double sqrtMagic = Math.sqrt(magic);
  36. dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
  37. dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
  38. double mgLat = lat + dLat;
  39. double mgLon = lon + dLon;
  40. return new double[]{mgLat, mgLon};
  41. }
  42.  
  43. public static boolean outOfChina(double lat, double lon) {
  44. if (lon < 72.004 || lon > 137.8347)
  45. return true;
  46. if (lat < 0.8293 || lat > 55.8271)
  47. return true;
  48. return false;
  49. }
  50.  
  51. /**
  52. * 84 to 火星坐标系 (GCJ-02) World Geodetic System ==> Mars Geodetic System
  53. *
  54. * @param lat
  55. * @param lon
  56. * @return
  57. */
  58. public static double[] gps84_To_Gcj02(double lat, double lon) {
  59. if (outOfChina(lat, lon)) {
  60. return new double[]{lat, lon};
  61. }
  62. double dLat = transformLat(lon - 105.0, lat - 35.0);
  63. double dLon = transformLon(lon - 105.0, lat - 35.0);
  64. double radLat = lat / 180.0 * pi;
  65. double magic = Math.sin(radLat);
  66. magic = 1 - ee * magic * magic;
  67. double sqrtMagic = Math.sqrt(magic);
  68. dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
  69. dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
  70. double mgLat = lat + dLat;
  71. double mgLon = lon + dLon;
  72. return new double[]{mgLat, mgLon};
  73. }
  74.  
  75. /**
  76. * * 火星坐标系 (GCJ-02) to 84 * * @param lon * @param lat * @return
  77. */
  78. public static double[] gcj02_To_Gps84(double lat, double lon) {
  79. double[] gps = transform(lat, lon);
  80. double lontitude = lon * 2 - gps[1];
  81. double latitude = lat * 2 - gps[0];
  82. return new double[]{latitude, lontitude};
  83. }
  84.  
  85. /**
  86. * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 将 GCJ-02 坐标转换成 BD-09 坐标
  87. *
  88. * @param lat
  89. * @param lon
  90. */
  91. public static double[] gcj02_To_Bd09(double lat, double lon) {
  92. double x = lon, y = lat;
  93. double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
  94. double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
  95. double tempLon = z * Math.cos(theta) + 0.0065;
  96. double tempLat = z * Math.sin(theta) + 0.006;
  97. double[] gps = {tempLat, tempLon};
  98. return gps;
  99. }
  100.  
  101. /**
  102. * * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 * * 将 BD-09 坐标转换成GCJ-02 坐标
  103. * @param lat
  104. * @param lon
  105. * @return
  106. */
  107. public static double[] bd09_To_Gcj02(double lat, double lon) {
  108. double x = lon - 0.0065, y = lat - 0.006;
  109. double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
  110. double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
  111. double tempLon = z * Math.cos(theta);
  112. double tempLat = z * Math.sin(theta);
  113. double[] gps = {tempLat, tempLon};
  114. return gps;
  115. }
  116.  
  117. /**
  118. * 将gps84转为bd09
  119. *
  120. * @param lat
  121. * @param lon
  122. * @return
  123. */
  124. public static double[] gps84_To_bd09(double lat, double lon) {
  125. double[] gcj02 = gps84_To_Gcj02(lat, lon);
  126. double[] bd09 = gcj02_To_Bd09(gcj02[0], gcj02[1]);
  127. return bd09;
  128. }
  129.  
  130. public static double[] bd09_To_gps84(double lat, double lon) {
  131. double[] gcj02 = bd09_To_Gcj02(lat, lon);
  132. double[] gps84 = gcj02_To_Gps84(gcj02[0], gcj02[1]);
  133. //保留小数点后六位
  134. gps84[0] = retain6(gps84[0]);
  135. gps84[1] = retain6(gps84[1]);
  136. return gps84;
  137. }
  138.  
  139. /**
  140. * 保留小数点后六位
  141. *
  142. * @param num
  143. * @return
  144. */
  145. private static double retain6(double num) {
  146. String result = String.format("%.6f", num);
  147. return Double.valueOf(result);
  148. }
  149.  
  150. }

在使用的时候把不同的坐标系转换成需要的坐标系再传入就可以正确使用了

  by jungle张轶

Android调起地图导航的更多相关文章

  1. Android Studio 百度地图导航

    配置就不再多说了,上一篇已经详细说过了,这次就是根据经纬度坐标做地图导航,路径规划.直接上代码: package com.example.appview.mian_page.Frament.Anzhu ...

  2. Android 打开高德地图、百度地图进行导航;打开第三方App去导航;

    抽成工具类了,复制下来就能直接用了,直接看代码吧: 高德地图Url Api: http://lbs.amap.com/api/amap-mobile/guide/android/navigation ...

  3. Android studio 百度地图开发(3)地图导航

    Android studio 百度地图开发(3)地图导航 email:chentravelling@163.com 开发环境:win7 64位,Android Studio,请注意是Android S ...

  4. 实现百度地图导航Demo的语音播报功能

    上文中实现了在本地导入百度地图导航Demo,那么在此基础上如何实现导航的语音播报呢? 一.为该应用申请语音播报(也叫注册) http://developer.baidu.com/map/index.p ...

  5. android 之 百度地图

    简介 百度地图Android定位SDK为基于移动客户端开发LBS应用提供基础定位能力. 功能介绍 功能介绍: 地图展示:包括2D图.卫星图.3D图地图展示. 地图操作:提供控制平移.缩放.底图旋转.变 ...

  6. APP-6-百度地图导航

    1.代码部分 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <me ...

  7. Android multiple back stacks导航的几种实现

    Android multiple back stacks导航 谈谈android中多栈导航的几种实现. 什么是multiple stacks 当用户在app里切换页面时, 会需要向后回退到上一个页面, ...

  8. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(四)地图导航控件模块

    config.xml文件的配置如下: <widget left="10" top="50" config="widgets/Navigation ...

  9. Android隐藏状态栏、导航栏

    Android隐藏状态栏.导航栏 private void hideStatusNavigationBar(){ if(Build.VERSION.SDK_INT<16){ this.getWi ...

随机推荐

  1. H5bulider中的微信支付配置注意事项

    一.云打包安卓自定义证书的生成: 签名算法名称: SHA1withRSA主体公共密钥算法:1024 位 RSA 密钥密钥库类型:JKS 1.下载JDK1.6安装,切换到bin目录,打开命令行: 2.生 ...

  2. paper:synthesizable finit state machine design techniques using the new systemverilog 3.0 enhancements之全0/1/z/x的SV写法

  3. 大意了,这几道Python面试题没有答对,Python面试题No13

    第1题: Python如何爬取 HTTPS 网站? 这类问题属于简单类问题 在使用 requests 前加入:requests.packages.urllib3.disable_warnings(). ...

  4. PEP-8 规范1

    代码布局 缩进 每个缩进级别使用4个空格. 延续线应使用Python的隐含线连接在括号,括号和大括号内,或使用悬挂缩进[7],垂直对齐包装元素.使用悬挂式凹痕时,应考虑以下因素;第一行应该没有参数,应 ...

  5. 笔记-python-urllib

    笔记-python-urllib 1.      简介 PYTHON3中将urllib,urllib2整合到URLLIB中 包括以下模块 urllib.request 请求模块(核心) urllib. ...

  6. php三种方式操作mysql数据库

    php可以通过三种方式操作数据库,分别用mysql扩展库,mysqli扩展库,和mysqli的预处理模式分别举案例加以说明 1.通过mysql方式操作数据库 工具类核心代码: <?php cla ...

  7. JavaScript日期时间格式化函数

    这篇文章主要介绍了JavaScript日期时间格式化函数分享,需要的朋友可以参考下 这个函数经常用到,分享给大家. 函数代码: //格式化参数说明: //y:年,M:月,d:日,h:时,m分,s:秒, ...

  8. luogu3370 【模板】字符串哈希

    #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> ...

  9. 了解CSS核心精髓(一)

    CSS 1.css外联 正确写法:<link rel="stylesheet" href="css/style.css" /> <style ...

  10. webdriver高级应用- 启动带有用户配置信息的firefox浏览器窗口

    由于WebDriver启动FireFox浏览器时会启用全新的FireFox浏览器窗口,导致当前机器的FireFox浏览器已经配置的信息在测试中均无法生效,例如已经安装的浏览器插件.个人收藏夹等.为了解 ...