跳转至第三方地图
/** 判断手机中是否安装指定包名的软件 */
public static boolean isInstallApk(String name) {
List<PackageInfo> packages = App.instance.getPackageManager().getInstalledPackages(0);
for (int i = 0; i < packages.size(); i++) {
PackageInfo packageInfo = packages.get(i);
if (packageInfo.packageName.equals(name)) {
return true;
} else {
continue;
}
}
return false;
}
一、高德地图
打开高德地图API——>开发支持——>高德地图手机版(在其它这个分类里面)。直达链接:https://lbs.amap.com/api/amap-mobile/guide/android/route
举例:
isInstallApk("com.autonavi.minimap")
Uri uri = Uri.parse("amapuri://route/plan/?dlat="+"目的地lat"+"&dlon="+"目的地lng"+"&dname="+"目的地名称"+"&dev=0&t=0");
Activity.startActivity(new Intent(Intent.ACTION_VIEW, uri));
可以额外拼的参数:
二、百度地图
百度地图API——>开发文档——>地图调起API(服务接口)——>android端——>2.3.2路线规划 直达链接:http://lbsyun.baidu.com/index.php?title=uri/api/android
举例:
isInstallApk("com.baidu.BaiduMap")
Uri uri = Uri.parse("baidumap://map/direction?destination=latlng:"+"目的地lat"+","+ "目的地lng"+"|name:"+"目的地名称"+"&mode=driving");
Activity.startActivity(new Intent(Intent.ACTION_VIEW, uri));
可额外拼的参数:
三、google地图
if (isInstallApk( "com.google.android.apps.maps")) {
Uri gmmIntentUri = Uri.parse("google.navigation:q="+ mLatitude + "," + mLongitude+ ", + Sydney +Australia");
Intent mapIntent = new Intent(Intent.ACTION_VIEW,gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
context.startActivity(mapIntent);
} else {
Toast.makeText(context, "您尚未安装谷歌地图", Toast.LENGTH_LONG).show();
Uri uri = Uri.parse("market://details?id=com.google.android.apps.maps");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
context.startActivity(intent);
}
四、腾讯地图
腾讯开放平台——>开发文档——>web端——>URI API(地图调起)
官方网址:http://lbs.qq.com/webApi/uriV1/uriGuide/uriWebRoute
if (isInstallApk("com.tencent.map")){
double[] gcjo2s=CoordinateTransformationUtil.bd09ToGcj02(Double.parseDouble(latitude),Double.parseDouble(longitude));
Uri gmmIntentUri = Uri.parse("qqmap://map/routeplan?type=drive"+ "&to=" + poiname
+"&tocoord=" + gcjo2s[0] + "," + gcjo2s[1]+ "&policy=0&referer="+WirelessZJ.getInstance().getResources().getString(R.string.app_name));
Intent mapIntent = new Intent(Intent.ACTION_VIEW,gmmIntentUri);
mapIntent.setPackage("com.tencent.map");
mapIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mapIntent);
}else{}
参数名 | 必填 | 说明 | 示例 |
---|---|---|---|
type | 是 | 路线规划方式参数: 公交:bus 驾车:drive 步行:walk(仅适用移动端) |
type=bus type=drive type=walk |
from | 二选一 | 起点名称 | fromcoord=39.907380,116.388501 |
fromcoord | 起点坐标 移动端如果起点名称和起点坐标均未传递,则使用当前定位位置作为起点 |
to=奥林匹克森林公园 | |
to | 是 | 终点名称 | to=奥林匹克森林公园 |
tocoord | 否 | 终点坐标 | tocoord=40.010024,116.392239 |
coord_type | 否 | 坐标类型,取值如下: 1 GPtocoord=40.010024,116.392239S 2 腾讯坐标(默认) 如果用户指定该参数为非腾讯地图坐标系,则URI API自动进行坐标处理,以便准确对应到腾讯地图底图上。 |
coord_type=1 |
policy | 否 | 本参数取决于type参数的取值 公交:type=bus,policy有以下取值 0:较快捷 1:少换乘 2:少步行 3:不坐地铁 驾车:type=drive,policy有以下取值 0:较快捷 1:无高速 2:距离 policy的取值缺省为0 |
policy=1 |
referer | 是 | 调用来源,一般为您的应用名称,为了保障对您的服务,请务必填写! | referer=您的应用名 |
五、坐标转换。
package com.secondui.util;
public class CoordinateTransformationUtil {
/*
百度坐标转换成火星坐标,
适用于将结果用于高德,腾讯,google非国际版使用。
*/
public static double[] bd09ToGcj02(double lat,double lng){
double x = lng - 0.0065;
double y = lat - 0.006;
double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * (Math.PI*3000.0/180.0));
double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * (Math.PI*3000.0/180.0));
double gg_lng = z * Math.cos(theta);
double gg_lat = z * Math.sin(theta);
return new double[] {gg_lat,gg_lng};
}
/**
* GCJ-02 坐标转换成 BD-09 坐标
*/
public static double[] Gcj02ToBd09(double lat,double lng) {
double x = lng, y = lat;
double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * (Math.PI*3000.0/180.0));
double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * (Math.PI*3000.0/180.0));
double tempLon = z * Math.cos(theta) + 0.0065;
double tempLat = z * Math.sin(theta) + 0.006;
return new double[] {tempLat,tempLon};
}
public static double[] wgs84ToGcj02(double lat,double lng){
if (outOfChina(lat,lng)){
return new double[]{lat,lng};
}else{
double dlat = transformlat(lng - 105.0, lat - 35.0);
double dlng = transformlng(lng - 105.0, lat - 35.0);
double radlat = lat / 180.0 * Math.PI;
double magic = Math.sin(radlat);
magic = 1 - 0.00669342162296594323 * magic * magic;
double sqrtmagic = Math.sqrt(magic);
dlat = (dlat * 180.0) / ((6378245.0 * (1 - 0.00669342162296594323)) / (magic * sqrtmagic) * Math.PI);
dlng = (dlng * 180.0) / (6378245.0 / sqrtmagic * Math.cos(radlat) * Math.PI);
double mglat = lat + dlat;
double mglng = lng + dlng;
return new double[]{mglat,mglng};
}
}
public static double[] gcj02ToWgs84(double lat,double lng) {
if (outOfChina(lng, lat)) {
return new double[]{lat, lng};
}else {
double dlat = transformlat(lng - 105.0, lat - 35.0);
double dlng = transformlng(lng - 105.0, lat - 35.0);
double radlat = lat / 180.0 * Math.PI;
double magic = Math.sin(radlat);
magic = 1 - 0.00669342162296594323 * magic * magic;
double sqrtmagic = Math.sqrt(magic);
dlat = (dlat * 180.0) / ((6378245.0 * (1 - 0.00669342162296594323)) / (magic * sqrtmagic) * Math.PI);
dlng = (dlng * 180.0) / (6378245.0 / sqrtmagic * Math.cos(radlat) * Math.PI);
double mglat = lat + dlat;
double mglng = lng + dlng;
return new double[]{lng * 2 - mglng, lat * 2 - mglat};
}
}
public static boolean outOfChina(double lat,double lng){
return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false);
}
public static double transformlat(double lat,double lng) {
double ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
ret += (20.0 * Math.sin(6.0 * lng * Math.PI) + 20.0 * Math.sin(2.0 * lng * Math.PI)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(lat * Math.PI) + 40.0 * Math.sin(lat / 3.0 * Math.PI)) * 2.0 / 3.0;
ret += (160.0 * Math.sin(lat / 12.0 * Math.PI) + 320 * Math.sin(lat * Math.PI / 30.0)) * 2.0 / 3.0;
return ret;
}
public static double transformlng(double lat,double lng) {
double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
ret += (20.0 * Math.sin(6.0 * lng * Math.PI) + 20.0 * Math.sin(2.0 * lng * Math.PI)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(lng * Math.PI) + 40.0 * Math.sin(lng / 3.0 * Math.PI)) * 2.0 / 3.0;
ret += (150.0 * Math.sin(lng / 12.0 * Math.PI) + 300.0 * Math.sin(lng / 30.0 * Math.PI)) * 2.0 / 3.0;
return ret;
}
}
参考文献:
https://blog.csdn.net/weimingjue/article/details/80493969
https://blog.csdn.net/shaoyezhangliwei/article/details/77968566