Android 调用高德+百度地图导航
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import com.jiarui.base.bases.BaseApplication;
import com.jiarui.base.utils.StringUtils;
import com.jiarui.base.utils.ToastUitl;
import com.tuba.android.tuba40.R;
import com.tuba.android.tuba40.dialog.CommonDialog;
import java.io.File;
import static java.lang.Math.atan2;
import static java.lang.Math.cos;
import static java.lang.Math.sin;
import static java.lang.Math.sqrt;
/**
* ======================================================>
*
* @Todo: 默认使用的是高德经纬度坐标, 不同坐标系之间需要转换
* 如果高德地图进入会提示"定位失败,请重试",可以改成指定起点和终点的坐标
* @Author:Lion-082
* @Date:2018/10/18
* @Time:下午 02:37
* ======================================================>
*/
public class NavigationUtil {
/**
* 显示选择导航方式dialog
*
* @paramcontext
* @paramendLongitude
* @paramendLatitude
* @paramendAddress
*/
public static void showNavDialog(final Context context, final String endLongitude, final String endLatitude, final String endAddress) {
final String[] titles= {"百度地图", "高德地图"};
final CommonDialog dialog= new CommonDialog(context, titles);
dialog.setOnClickListener(new CommonDialog.OnClickListener() {
@Override
public void onItemClick(final int position) {
//调用地图导航
if (StringUtils.isNotEmpty(endLatitude) && StringUtils.isNotEmpty(endLongitude) && StringUtils.isNotEmpty(endAddress)) {
// (1)
// if (0 == position) {
// //调用百度导航 - 高德坐标
// NavigationUtil.initBaiduNavigation_GaodeCoordinate(context, endLongitude, endLatitude, endAddress);
// } else {
// //调用高德导航 - 高德坐标
// NavigationUtil.initAMapNavigation_GaodeCoordinate(context, endLongitude, endLatitude, endAddress);
// }
// (2)
if (0 == position) {
//调用百度导航 - 百度坐标
NavigationUtil.initBaiduNavigation_BaiduCoordinate(context, endLongitude, endLatitude, endAddress);
} else {
//调用高德导航 - 百度坐标
NavigationUtil.initAMapNavigation_BaiduCoordinate(context, endLongitude, endLatitude, endAddress);
}
} else {
ToastUitl.showShort(context,"终点信息获取失败");
}
dialog.dismiss();
}
});
dialog.show();
}
///////////////////////////////////////////////////////////////////////////
// 高德坐标
///////////////////////////////////////////////////////////////////////////
/**
* 调用百度导航 - 高德坐标
*
* @paramcontext 上下文对象
* @parameLon 终点经度
* @parameLat 终点纬度
* @parameAddress 终点地址
*/
private static void initBaiduNavigation_GaodeCoordinate(final Context context, final String eLon, final String eLat, final String eAddress) {
//是否安装百度地图
if (isInstallBaiduMap(context)) {
/*高德坐标转百度坐标*/
double[] endLatLng= gcjToBd(Double.parseDouble(eLon), Double.parseDouble(eLat));
openBaiduMap(context, endLatLng[0], endLatLng[1], eAddress);
}
}
/**
* 调用高德导航 - 高德坐标
*
* @paramcontext 上下文对象
* @parameLon 终点经度
* @parameLat 终点纬度
* @parameAddress 终点地址
*/
private static void initAMapNavigation_GaodeCoordinate(final Context context, final String eLon, final String eLat, final String eAddress) {
//是否安装高德地图
if (isInstallAMap(context)) {
openAMap(context, Double.parseDouble(eLon), Double.parseDouble(eLat), eAddress);
}
}
///////////////////////////////////////////////////////////////////////////
// 百度坐标
///////////////////////////////////////////////////////////////////////////
/**
* 调用百度导航 - 百度坐标
*
* @paramcontext 上下文对象
* @parameLon 终点经度
* @parameLat 终点纬度
* @parameAddress 终点地址
*/
private static void initBaiduNavigation_BaiduCoordinate(final Context context, final String eLon, final String eLat, final String eAddress) {
//是否安装百度地图
if (isInstallBaiduMap(context)) {
openBaiduMap(context, Double.parseDouble(eLon), Double.parseDouble(eLat), eAddress);
}
}
/**
* 调用高德导航 - 百度坐标
*
* @paramcontext 上下文对象
* @parameLon 终点经度
* @parameLat 终点纬度
* @parameAddress 终点地址
*/
private static void initAMapNavigation_BaiduCoordinate(final Context context, final String eLon, final String eLat, final String eAddress) {
//是否安装高德地图
if (isInstallAMap(context)) {
/*百度坐标转高德坐标+bd_decrypt+bdToGcj*/
double[] endLatLng= bdToGcj(Double.parseDouble(eLon), Double.parseDouble(eLat));
openAMap(context, endLatLng[0], endLatLng[1], eAddress);
}
}
/*------------------------------------(分割线)--调用第三方导航--2018/10/18 下午 01:56------------------------------------*/
/**
* 打开百度地图
*
* @paramcontext 上下文对象
* @paramendLon 终点经度
* @paramendLat 终点纬度
* @paramendDescrible 终点地址
*/
private static void openBaiduMap(final Context context, double endLon, double endLat, String endDescrible) {
try {
/*调用导航*/
StringBuffer loc= new StringBuffer("baidumap://map/navi?");
loc.append("&src=").append(R.string.app_name + "|" + R.string.app_name);
loc.append("&location=").append(endLat+ "," + endLon);
Intent intent= Intent.getIntent(loc.toString());
context.startActivity(intent); //启动调用
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 打开高德地图
*
* @paramcontext 上下文对象
* @paramendLon 终点经度
* @paramendLat 终点纬度
* @paramendDescrible 终点地址
*/
private static void openAMap(final Context context, double endLon, double endLat, String endDescrible) {
try {
/*调用导航*/
StringBuilder loc= new StringBuilder();
loc.append("androidamap://navi?sourceApplication=");
loc.append(R.string.app_name);
loc.append("&lat=");
loc.append(endLat);
loc.append("&lon=");
loc.append(endLon);
loc.append("&dev=");//起终 点是否偏移(0:lat和lon是已经加密后的,不需要国测加密: 1:需要国测加密)
loc.append(0);//百度坐标调用高德的时候设置为0,因为百度地图坐标已经加密了
// loc.append("&dname=").append(endDescrible);
loc.append("&style=");
loc.append(2);
Intent intent= new Intent("android.intent.action.VIEW", Uri.parse(loc.toString()));
intent.setPackage("com.autonavi.minimap");
context.startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 检查是否安装百度地图
*/
private static boolean isInstallBaiduMap(Context context) {
// 判断是否安装百度地图
if (new File("/data/data/" + "com.baidu.BaiduMap").exists()) {
return true;
} else {
// 未安装
// 显示手机上所有的market商店
try {
ToastUitl.showShort(BaseApplication.getAppContext(),"未安装百度地图");
Uri uri= Uri.parse("market://details?id=com.baidu.BaiduMap");
Intent intent= new Intent(Intent.ACTION_VIEW, uri);
context.startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
ToastUitl.showShort(BaseApplication.getAppContext(),"请先安装百度地图");
return false;
}
return false;
}
}
/**
* 检查是否安装高德地图
*/
private static boolean isInstallAMap(Context context) {
// 判断是否安装高德地图
if (new File("/data/data/" + "com.autonavi.minimap").exists()) {
return true;
} else {
try {
ToastUitl.showShort(BaseApplication.getAppContext(),"未安装高德地图");//未安装
Uri uri= Uri.parse("market://details?id=com.autonavi.minimap");
Intent intent= new Intent(Intent.ACTION_VIEW, uri);
context.startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
ToastUitl.showShort(BaseApplication.getAppContext(),"请先安装高德地图");
return false;
}
}
return false;
}
//百度转高德-直接用Math.PI
public static double[] bd_decrypt(double bd_lon, double bd_lat) {
double[] gd_lat_lon= new double[2];
double x= bd_lon- 0.0065, y= bd_lat- 0.006;
double z= sqrt(x* x+ y* y) - 0.00002 * sin(y* Math.PI);
double theta= atan2(y, x) - 0.000003 * cos(x* Math.PI);
gd_lat_lon[0] = z* cos(theta);
gd_lat_lon[1] = z* sin(theta);
return gd_lat_lon;
}
/**
* 百度 => 高德
* BD-09 => GCJ-02
*
* @parambdLon 经度
* @parambdLat 纬度
*/
public static double[] bdToGcj(double bdLon, double bdLat) {
double[] gd_lat_lon= new double[2];
double PI= 3.14159265358979324 * 3000.0 / 180.0;
double x= bdLon- 0.0065, y= bdLat- 0.006;
double z= sqrt(x* x+ y* y) - 0.00002 * sin(y* PI);
double theta= atan2(y, x) - 0.000003 * cos(x* PI);
gd_lat_lon[0] = z* cos(theta);
gd_lat_lon[1] = z* sin(theta);
return gd_lat_lon;
}
/**
* 高德 => 百度
*
* @paramgdLon 经度
* @paramgdLat 纬度
*/
public static double[] gcjToBd(double gdLon, double gdLat) {
double[] bd_lat_lon= new double[2];
double PI= 3.14159265358979324 * 3000.0 / 180.0;
double x= gdLon, y= gdLat;
double z= sqrt(x* x+ y* y) + 0.00002 * sin(y* PI);
double theta= atan2(y, x) + 0.000003 * cos(x* PI);
bd_lat_lon[0] = z* cos(theta) + 0.0065;
bd_lat_lon[1] = z* sin(theta) + 0.006;
return bd_lat_lon;
}
}