跳轉至第三方地圖
/** 判斷手機中是否安裝指定包名的軟件 */
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

浙公網安備 33010602011771號