【Android】地圖坐標(biāo)轉(zhuǎn)換

  • 檢查地圖應(yīng)用是否安裝
  • 經(jīng)緯度互相轉(zhuǎn)換
  • 打開(kāi)地圖應(yīng)用導(dǎo)航功能
public class GoToMap {
    public static final String PN_GAODE_MAP = "com.autonavi.minimap";// 高德地圖包名
    public static final String PN_BAIDU_MAP = "com.baidu.BaiduMap"; // 百度地圖包名
    public static final String PN_TENCENT_MAP = "com.tencent.map"; // 騰訊地圖包名
    public static void startInNavi(Context context,double latx,double laty,String name){
        if (isGdMapInstalled()) {
            openGaoDeNavi(context, 0, 0, null, latx, laty, name);
            return;
        }
        if(isBaiduMapInstalled()){
            openBaiDuNavi(context, 0, 0, null, latx, laty, name);
            return;
        }
        //這里必須要寫邏輯杈帐,不然如果手機(jī)沒(méi)安裝該應(yīng)用褥紫,程序會(huì)閃退,這里可以實(shí)現(xiàn)下載安裝該地圖應(yīng)用
        UIUtils.toast("尚未安裝高德/百度地圖浅碾,請(qǐng)先下載");
    }
    /**
     * 打開(kāi)百度地圖導(dǎo)航功能(默認(rèn)坐標(biāo)點(diǎn)是高德地圖鸟廓,需要轉(zhuǎn)換)
     * @param context
     * @param slat 起點(diǎn)緯度
     * @param slon 起點(diǎn)經(jīng)度
     * @param sname 起點(diǎn)名稱 可不填(0,0从祝,null)
     * @param dlat 終點(diǎn)緯度
     * @param dlon 終點(diǎn)經(jīng)度
     * @param dname 終點(diǎn)名稱 必填
     */
    public static void openBaiDuNavi(Context context,double slat, double slon, String sname, double dlat, double dlon, String dname){
        String uriString = null;
        //終點(diǎn)坐標(biāo)轉(zhuǎn)換
//        此方法需要百度地圖的BaiduLBS_Android.jar包
//        LatLng destination = new LatLng(dlat,dlon);
//        LatLng destinationLatLng = GCJ02ToBD09(destination);
//        dlat = destinationLatLng.latitude;
//        dlon = destinationLatLng.longitude;

        double destination[] = gaoDeToBaidu(dlat, dlon);
        dlat = destination[0];
        dlon = destination[1];

        StringBuilder builder = new StringBuilder("baidumap://map/direction?mode=driving&");
        if (slat != 0){
            //起點(diǎn)坐標(biāo)轉(zhuǎn)換

//            LatLng origin = new LatLng(slat,slon);
//            LatLng originLatLng = GCJ02ToBD09(origin);
//            slat = originLatLng.latitude;
//            slon = originLatLng.longitude;

            double[] origin = gaoDeToBaidu(slat, slon);
            slat = origin[0];
            slon = origin[1];

            builder.append("origin=latlng:")
                    .append(slat)
                    .append(",")
                    .append(slon)
                    .append("|name:")
                    .append(sname);
        }
        builder.append("&destination=latlng:")
                .append(dlat)
                .append(",")
                .append(dlon)
                .append("|name:")
                .append(dname);
        uriString = builder.toString();
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setPackage("com.baidu.BaiduMap");
        intent.setData(Uri.parse(uriString));
        context.startActivity(intent);
    }


    /**
     * 打開(kāi)高德地圖導(dǎo)航功能
     * @param context
     * @param slat 起點(diǎn)緯度
     * @param slon 起點(diǎn)經(jīng)度
     * @param sname 起點(diǎn)名稱 可不填(0,0,null)
     * @param dlat 終點(diǎn)緯度
     * @param dlon 終點(diǎn)經(jīng)度
     * @param dname 終點(diǎn)名稱 必填
     */
    public static void openGaoDeNavi(Context context,double slat, double slon, String sname, double dlat, double dlon, String dname){
        String uriString = null;
        StringBuilder builder = new StringBuilder("amapuri://route/plan?sourceApplication=maxuslife");
        if (slat != 0) {
            builder.append("&sname=").append(sname)
                    .append("&slat=").append(slat)
                    .append("&slon=").append(slon);
        }
        builder.append("&dlat=").append(dlat)
                .append("&dlon=").append(dlon)
                .append("&dname=").append(dname)
                .append("&dev=0")
                .append("&t=0");
        uriString = builder.toString();
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setPackage("com.autonavi.minimap");
        intent.setData(Uri.parse(uriString));
        context.startActivity(intent);
    }
    /**
     * 打開(kāi)騰訊地圖
     * params 參考http://lbs.qq.com/uri_v1/guide-route.html
     *
     * @param context
     * @param slat 起點(diǎn)緯度
     * @param slon 起點(diǎn)經(jīng)度
     * @param sname 起點(diǎn)名稱 可不填(0,0引谜,null)
     * @param dlat 終點(diǎn)緯度
     * @param dlon 終點(diǎn)經(jīng)度
     * @param dname 終點(diǎn)名稱 必填
     * 駕車:type=drive牍陌,policy有以下取值
    0:較快捷
    1:無(wú)高速
    2:距離
    policy的取值缺省為0
     * &from=" + dqAddress + "&fromcoord=" + dqLatitude + "," + dqLongitude + "
     */
    public static void openTencentMap(Context context, double slat, double slon, String sname, double dlat, double dlon, String dname) {
        String uriString = null;
        StringBuilder builder = new StringBuilder("qqmap://map/routeplan?type=drive&policy=0&referer=zhongshuo");
        if (slat != 0) {
            builder.append("&from=").append(sname)
                    .append("&fromcoord=").append(slat)
                    .append(",")
                    .append(slon);
        }
        builder.append("&to=").append(dname)
                .append("&tocoord=").append(dlat)
                .append(",")
                .append(dlon);
        uriString = builder.toString();
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setPackage(PN_TENCENT_MAP);
        intent.setData(Uri.parse(uriString));
        context.startActivity(intent);
    }
    /**
     * 檢查地圖應(yīng)用是否安裝
     * @return
     */
    public static boolean isGdMapInstalled(){
        return isInstallPackage(PN_GAODE_MAP);
    }

    public static boolean isBaiduMapInstalled(){
        return isInstallPackage(PN_BAIDU_MAP);
    }

    public static boolean isTencentMapInstalled(){
        return isInstallPackage(PN_TENCENT_MAP);
    }

    private static boolean isInstallPackage(String packageName) {
        return new File("/data/data/" + packageName).exists();
    }

    /**
     * 百度轉(zhuǎn)高德
     * @param bd_lat
     * @param bd_lon
     * @return
     */
    public static double[] bdToGaoDe(double bd_lat, double bd_lon) {
        double[] gd_lat_lon = new double[2];
        double PI = 3.14159265358979324 * 3000.0 / 180.0;
        double x = bd_lon - 0.0065, y = bd_lat - 0.006;
        double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * PI);
        double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * PI);
        gd_lat_lon[0] = z * Math.cos(theta);
        gd_lat_lon[1] = z * Math.sin(theta);
        return gd_lat_lon;
    }

    /**
     * 高德、騰訊轉(zhuǎn)百度
     * @param gd_lon
     * @param gd_lat
     * @return
     */
    private static double[] gaoDeToBaidu(double gd_lon, double gd_lat) {
        double[] bd_lat_lon = new double[2];
        double PI = 3.14159265358979324 * 3000.0 / 180.0;
        double x = gd_lon, y = gd_lat;
        double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * PI);
        double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * PI);
        bd_lat_lon[0] = z * Math.cos(theta) + 0.0065;
        bd_lat_lon[1] = z * Math.sin(theta) + 0.006;
        return bd_lat_lon;
    }

    /**
     * 百度坐標(biāo)系 (BD-09) 與 火星坐標(biāo)系 (GCJ-02)的轉(zhuǎn)換
     * 即 百度 轉(zhuǎn) 谷歌员咽、高德
     *
     * @param latLng
     * @returns
     *
     * 使用此方法需要下載導(dǎo)入百度地圖的BaiduLBS_Android.jar包
     */
    public static LatLng BD09ToGCJ02(LatLng latLng) {
        double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
        double x = latLng.longitude - 0.0065;
        double y = latLng.latitude - 0.006;
        double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
        double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
        double gg_lat = z * Math.sin(theta);
        double gg_lng = z * Math.cos(theta);
        return new LatLng(gg_lat, gg_lng);
    }

    /**
     * 火星坐標(biāo)系 (GCJ-02) 與百度坐標(biāo)系 (BD-09) 的轉(zhuǎn)換
     * 即谷歌毒涧、高德 轉(zhuǎn) 百度
     *
     * @param latLng
     * @returns
     *
     * 需要百度地圖的BaiduLBS_Android.jar包
     */
    public static LatLng GCJ02ToBD09(LatLng latLng) {
        double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
        double z = Math.sqrt(latLng.longitude * latLng.longitude + latLng.latitude * latLng.latitude) + 0.00002 * Math.sin(latLng.latitude * x_pi);
        double theta = Math.atan2(latLng.latitude, latLng.longitude) + 0.000003 * Math.cos(latLng.longitude * x_pi);
        double bd_lat = z * Math.sin(theta) + 0.006;
        double bd_lng = z * Math.cos(theta) + 0.0065;
        return new LatLng(bd_lat, bd_lng);
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市贝室,隨后出現(xiàn)的幾起案子契讲,更是在濱河造成了極大的恐慌,老刑警劉巖滑频,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捡偏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡峡迷,警方通過(guò)查閱死者的電腦和手機(jī)银伟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)绘搞,“玉大人枣申,你說(shuō)我怎么就攤上這事】春迹” “怎么了忠藤?”我有些...
    開(kāi)封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)楼雹。 經(jīng)常有香客問(wèn)我模孩,道長(zhǎng),這世上最難降的妖魔是什么贮缅? 我笑而不...
    開(kāi)封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任榨咐,我火速辦了婚禮,結(jié)果婚禮上谴供,老公的妹妹穿的比我還像新娘块茁。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布数焊。 她就那樣靜靜地躺著永淌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪佩耳。 梳的紋絲不亂的頭發(fā)上遂蛀,一...
    開(kāi)封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音干厚,去河邊找鬼李滴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蛮瞄,可吹牛的內(nèi)容都是我干的所坯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼挂捅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼包竹!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起籍凝,我...
    開(kāi)封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎苗缩,沒(méi)想到半個(gè)月后饵蒂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酱讶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年退盯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泻肯。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渊迁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出灶挟,到底是詐尸還是另有隱情琉朽,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布稚铣,位于F島的核電站箱叁,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏惕医。R本人自食惡果不足惜耕漱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抬伺。 院中可真熱鬧螟够,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至给郊,卻和暖如春牡肉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背淆九。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工统锤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人炭庙。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓饲窿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親焕蹄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逾雄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355