Android在本地應(yīng)用喚起第三方地圖

  • 因?yàn)樽罱拥叫枨笠霭俣?、高德和騰訊地圖的喚起跳轉(zhuǎn)到步行的路線規(guī)劃操作,故做一下總結(jié)

百度地圖官方URL API地址

實(shí)際操作(主要代碼)

    //頭部 添加相應(yīng)地區(qū)
    private final static String BAIDU_HEAD = "baidumap://map/direction?region=0";
    //起點(diǎn)的經(jīng)緯度
    private final static String BAIDU_ORIGIN = "&origin=";
    //終點(diǎn)的經(jīng)緯度
    private final static String BAIDU_DESTINATION = "&destination=";
    //路線規(guī)劃方式
    private final static String BAIDU_MODE = "&mode=walking";
    //百度地圖的包名
    private final static String BAIDU_PKG = "com.baidu.BaiduMap";

    //檢測(cè)地圖是否安裝和喚起
    if (checkMapAppsIsExist(MainActivity.this,BAIDU_PKG)){
      Toast.makeText(MainActivity.this,"百度地圖已經(jīng)安裝",Toast.LENGTH_SHORT).show();
      intent.setData(Uri.parse(BAIDU_HEAD+BAIDU_ORIGIN+mStart.getLatitude()
                               +","+mStart.getLongitude()+BAIDU_DESTINATION+mEnd.getLatitude()+","+mEnd.getLongitude()
                               +BAIDU_MODE));
      startActivity(intent);
    }else {
      Toast.makeText(MainActivity.this,"百度地圖未安裝",Toast.LENGTH_SHORT).show();
    }
    break;

高德地圖官方URL API地址

實(shí)際操作(主要代碼)

    //頭部 后面的sourceApplicaiton填自己APP的名字
    private final static String GAODE_HEAD = "androidamap://route?sourceApplication=BaiduNavi";
    //起點(diǎn)經(jīng)度
    private final static String GAODE_SLON = "&slon=";
    //起點(diǎn)緯度
    private final static String GAODE_SLAT = "&slat=";
    //起點(diǎn)名字
    private final static String GAODE_SNAME = "&sname=";
    //終點(diǎn)經(jīng)度
    private final static String GAODE_DLON = "&dlon=";
    //終點(diǎn)緯度
    private final static String GAODE_DLAT = "&dlat=";
    //終點(diǎn)名字
    private final static String GAODE_DNAME = "&dname=";
    // dev 起終點(diǎn)是否偏移(0:lat 和 lon 是已經(jīng)加密后的,不需要國(guó)測(cè)加密; 1:需要國(guó)測(cè)加密)
    // t = 1(公交) =2(駕車) =4(步行)
    private final static String GAODE_MODE ="&dev=0&t=4";
    //高德地圖包名
    private final static String GAODE_PKG = "com.autonavi.minimap";

    //檢測(cè)安裝和喚起
    if (checkMapAppsIsExist(MainActivity.this,GAODE_PKG)){
      //Toast.makeText(MainActivity.this,"高德地圖已經(jīng)安裝",Toast.LENGTH_SHORT).show();
      BD09ToGCJ02(mStart,mEnd);
      intent.setAction("android.intent.action.VIEW");
      intent.setPackage("com.autonavi.minimap");
      intent.addCategory("android.intent.category.DEFAULT");
      intent.setData(Uri.parse(GAODE_HEAD+GAODE_SLAT+mStart.getLatitude()+GAODE_SLON+mStart.getLongitude()+
                               GAODE_SNAME+mStart.getName()+GAODE_DLAT+mEnd.getLatitude()+GAODE_DLON+mEnd.getLongitude()+
                               GAODE_DNAME+mEnd.getName()+GAODE_MODE));
      startActivity(intent);
    }else {
      Toast.makeText(MainActivity.this,"高德地圖未安裝",Toast.LENGTH_SHORT).show();
    }

騰訊地圖官方URL API沒有放出來?。?! 不過還是找到了實(shí)現(xiàn)方式 以下URL API代碼僅供參考

    //頭部 type出行方式
    private final static String TX_HEAD = "qqmap://map/routeplan?type=walk";
    //起點(diǎn)名稱
    private final static String TX_FROM = "&from=";
    //起點(diǎn)的經(jīng)緯度
    private final static String TX_FROMCOORD = "&fromcoord=";
    //終點(diǎn)名稱
    private final static String TX_TO = "&to=";
    //終點(diǎn)的經(jīng)緯度
    private final static String TX_TOCOORD = "&tocoord=";
    /**
         本參數(shù)取決于type參數(shù)的取值
         公交:type=bus,policy有以下取值
         0:較快捷
         1:少換乘
         2:少步行
         3:不坐地鐵
         駕車:type=drive,policy有以下取值
         0:較快捷
         1:無高速
         2:距離
         policy的取值缺省為0
     */
    private final static String TX_END = "&policy=1&referer=myapp";
    //騰訊地圖包名
    private final static String TX_PKG = "com.tencent.map";

    if (checkMapAppsIsExist(MainActivity.this,TX_PKG)){
      // Toast.makeText(MainActivity.this,"騰訊地圖已經(jīng)安裝",Toast.LENGTH_SHORT).show();
      BD09ToGCJ02(mStart,mEnd);
      intent.setData(Uri.parse(TX_HEAD + TX_FROM+mStart.getName()+TX_FROMCOORD+mStart.getLatitude()+
                               ","+mStart.getLongitude()+TX_TO+mEnd.getName()+TX_TOCOORD+mEnd.getLatitude()+
                               ","+mEnd.getLongitude()+TX_END));
      startActivity(intent);
    }else {
      Toast.makeText(MainActivity.this,"騰訊地圖未安裝",Toast.LENGTH_SHORT).show();
    }
    break;
  • 可能會(huì)有人好奇BD09ToGCJ02()這個(gè)函數(shù)是做什么的,其實(shí)是因?yàn)榘俣鹊貓D的坐標(biāo)系是BD09,而高德地圖和騰訊地圖是GCJ02,所以在實(shí)際使用的時(shí)候需要對(duì)坐標(biāo)進(jìn)行轉(zhuǎn)換,實(shí)測(cè)百度地圖的坐標(biāo)如果不經(jīng)過轉(zhuǎn)換誤差很大!??!

坐標(biāo)轉(zhuǎn)換函數(shù)

    /**
     * 坐標(biāo)轉(zhuǎn)換
     * @param mStart
     * @param mEnd
     */
    public void BD09ToGCJ02(LocationUtils mStart,LocationUtils mEnd){
        LatLng newStart = convertBaiduToGPS(new LatLng(mStart.getLatitude(),mStart.getLongitude()));
        LatLng newEnd = convertBaiduToGPS(new LatLng(mEnd.getLatitude(),mEnd.getLongitude()));
        mStart.setLatitude(newStart.latitude);
        mStart.setLongitude(newStart.longitude);

        mEnd.setLatitude(newEnd.latitude);
        mEnd.setLongitude(newEnd.longitude);

    }

    /**
     * 將百度地圖坐標(biāo)轉(zhuǎn)換成GPS坐標(biāo)
     * @param sourceLatLng
     * @return
     */
    public static LatLng convertBaiduToGPS(LatLng sourceLatLng) {
        // 將GPS設(shè)備采集的原始GPS坐標(biāo)轉(zhuǎn)換成百度坐標(biāo)
        CoordinateConverter converter = new CoordinateConverter();
        converter.from(CoordinateConverter.CoordType.GPS);
        // sourceLatLng待轉(zhuǎn)換坐標(biāo)
        converter.coord(sourceLatLng);
        LatLng desLatLng = converter.convert();
        double latitude = 2 * sourceLatLng.latitude - desLatLng.latitude;
        double longitude = 2 * sourceLatLng.longitude - desLatLng.longitude;
        BigDecimal bdLatitude = new BigDecimal(latitude);
        bdLatitude = bdLatitude.setScale(6, BigDecimal.ROUND_HALF_UP);
        BigDecimal bdLongitude = new BigDecimal(longitude);
        bdLongitude = bdLongitude.setScale(6, BigDecimal.ROUND_HALF_UP);
        return new LatLng(bdLatitude.doubleValue(), bdLongitude.doubleValue());
    }

檢測(cè)地圖應(yīng)用是否安裝函數(shù)

 /**
     * 檢測(cè)地圖應(yīng)用是否安裝
     * @param context
     * @param packagename
     * @return
     */
    public boolean checkMapAppsIsExist(Context context,String packagename){
        PackageInfo packageInfo;
        try{
            packageInfo = context.getPackageManager().getPackageInfo(packagename,0);
        }catch (Exception e){
            packageInfo = null;
            e.printStackTrace();
        }
        if (packageInfo == null){
            return false;
        }else{
            return true;
        }
    }

Bean類

/**
 * Created by maqiang on 2017/2/24.
 * 坐標(biāo)點(diǎn)的經(jīng)緯度和名字
 */

public class LocationUtils {
    private double longitude;
    private double latitude;
    private String name;

    public LocationUtils() {
    }

    public LocationUtils(double longitude, double latitude, String name) {
        this.longitude = longitude;
        this.latitude = latitude;
        this.name = name;
    }

    public double getLongitude() {
        return longitude;
    }

    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }

    public double getLatitude() {
        return latitude;
    }

    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "LocationUtils{" +
                "longitude=" + longitude +
                ", latitude=" + latitude +
                ", name='" + name + '\'' +
                '}';
    }
}

gihub完整地址 注意替換百度地圖的SDK KEY

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容