跳转至第三方地图

/** 判断手机中是否安装指定包名的软件 */
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

 

      

原文地址:https://www.cnblogs.com/qynprime/p/12022929.html