想要使用导航功能可以使用各个地图的开放平台集成导航模块,如果不想集成也可以调起相关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. Linux:FTP服务匿名用户,本地用户,虚拟用户配置

    匿名用户  FTP协议占用两个端口号: 21端口:命令控制,用于接收客户端执行的FTP命令. 20端口:数据传输,用于上传.下载文件数据. 实验:匿名访问,服务器192.168.10.10    客户 ...

  2. PHP 代码优化建议

    1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍.当然了,这个测试方法需要在十万级以上次执行,效果才明显.其实静态方法和非静态方法的效率 ...

  3. 21.Yii2.0框架多表关联一对多查询之性能优化--模型的使用

    控制器里 功能: 通过分类,查分类下的所有文章 //关联查询 public function actionRelatesearch(){ //关联查询 //查询方法一(查一行) 一维数组下的值是obj ...

  4. thinkphp5开发restful-api接口 学习笔记一

    视频学习地址: http://study.163.com/course/courseMain.htm?courseId=1004171002 源码和文档(如果满意,欢迎 star): https:// ...

  5. CentOS 7.X 中systemctl命令用法详解

    systemctl是RHEL 7 的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体.可以使用它永久性或只在当前会话中启用/禁用服务,下面来看CentOS 7.X 中 ...

  6. 关于dispatch_sync死锁问题

    首先,我们来看下下面一个例子: 代码:(串行队列里同步线程嵌套)     NSLog(@"haha");     dispatch_queue_t queue = dispatch ...

  7. shell批量修改文件名

    [root@localhost file1]# ls a.htm b.htm c.htm d.htm pl.sh [root@localhost file1]# vi pl.sh #!/bin/bas ...

  8. 实现类似QQ单一账户登录,在另一个地方登录后在原登录窗口提示下线

    首先,使用框架做的最好,可以在框架页直接做一次就好了 再登陆成功后保存session的代码后添加以下代码: 注意:需要引入命名空间using System.Collections; SetApplic ...

  9. 25、Base64

    Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3 ...

  10. Selenium WebDriver-actionchain模拟鼠标右键操作

    #encoding=utf-8 import unittest import time from selenium import webdriver from selenium.webdriver i ...