Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android百度地圖、高德地圖、騰訊地圖導航路線規劃問題

Android百度地圖、高德地圖、騰訊地圖導航路線規劃問題

編輯:關於Android編程

在最近的項目中,需求是用戶選擇某個地址需要進行導航時,彈出百度地圖、高德地圖和騰訊地圖讓用戶選擇。如果該用戶手機中已安裝對應的地圖App,則啟動對應軟件進行導航,否則跳轉到網頁版的地圖進行導航。 \   如下為各個地圖效果:     \\ 百度地圖高德地圖     \ 騰訊地圖   一開始做時,這不就簡單嗎,坐標嘛,都是一樣的,去各個地圖平台找到對應的URL api,傳入當前的坐標和目的地址的坐標(當前使用的是百度地圖的SDK)。利用Intent跳轉不就行了嘛。完成之後才發現,tooyoung too simple,原諒我對國家的安全知識了解有點少。坐標各地圖是不一定相同的,地址是有偏移的。 下面是我找弄度娘來的(為什麼不用google呢?):   我們平時用到的地球坐標系統,叫做WGS-84坐標,這個是國際通用的“准確”的坐標系統。國家保密插件,其實就是對真實坐標系統進行人為的加偏處理,即為GCJ-02坐標,戲稱“火星坐標”。於是,我們有了下面的東西: -地球坐標:指WGS84坐標系統 -火星坐標:指使用國家保密插件人為偏移後的坐標 -地球地圖:指與地球坐標對應的客觀真實的地圖 -火星地圖:指經過加密偏移後的,與火星坐標對應的地圖

 

國內出版的各種地圖系統(包括電子形式),必須至少采用GCJ-02對地理位置進行首次加密。於是,

-谷歌地圖的大陸地圖、高德國內地圖采用GCJ-02對地圖進行加偏。 -百度地圖更是進一步發揮了天朝特色,除了GCJ-02加偏,自己又在此基礎上繼續進行加偏,相應的坐標稱為BD-09坐標。 各地圖廠商使用的坐標系: -火星坐標 GCJ02坐標系 -iOS 地圖 -Gogole地圖 -搜搜(騰訊)、阿裡雲、高德地圖 -地球坐標 WGS84坐標系 -Google 衛星地圖(國外地圖應該都是……) -百度坐標 BD09坐標系 -百度地圖   好了,弄懂了之後。也很簡單嘛,用的是百度地圖SDK,那手上的坐標當然也是百度的。那調用高德和騰訊地圖時, 只需把百度地圖的坐標轉換為火星坐標就行啊。
public class MapTranslateUtils {


    /**
     * 坐標轉換,騰訊地圖(火星坐標)轉換成百度地圖坐標
     * @param lat 騰訊緯度
     * @param lon 騰訊經度
     * @return 返回結果:經度,緯度
     */
    public static  double[] map_hx2bd(double lat, double lon){
        double bd_lat;
        double bd_lon;
        double x_pi=3.14159265358979324;
        double x = lon, y = lat;
        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);
        bd_lon = z * Math.cos(theta) + 0.0065;
        bd_lat = z * Math.sin(theta) + 0.006;
        double[] doubles = new double[]{bd_lat,bd_lon};
        System.out.println("bd_lat:"+bd_lat);
        System.out.println("bd_lon:"+bd_lon);
        return  doubles;
    }



    /**
     * 坐標轉換,百度地圖坐標轉換成騰訊地圖坐標
     * @param lat  百度坐標緯度
     * @param lon  百度坐標經度
     * @return 返回結果:緯度,經度
     */
    public static  double[] map_bd2hx(double lat, double lon){
        double tx_lat;
        double tx_lon;
        double x_pi=3.14159265358979324;
        double x = lon - 0.0065, y = lat - 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);
        tx_lon = z * Math.cos(theta);
        tx_lat = z * Math.sin(theta);

        double[] doubles = new double[]{tx_lat,tx_lon};
        return doubles;
    }

}
    ok,現在百度地圖坐標系,火星坐標系都在手了。開干。
那首先要創建 一個webView頁面:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:orientation="vertical">

<com.zk.common.TitleBarView
android:id="@+id/titleBar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/title_bg"/>

<WebView
android:id="@+id/web_wv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>

LinearLayout>
      WebView的Activity:
public class WebViewActivity extends AppCompatActivity {

    private WebView detailsWebView;
    private String mUrl;
    private Handler handler;
    private ProgressDialog pd;
    private String mTitle;


    public static void launch(Activity activity, String url, String title) {

        Intent intent = new Intent(activity, WebViewActivity.class);
        intent.putExtra("url", url);
        intent.putExtra("title", title);
        activity.startActivity(intent);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_view);

        mUrl = this.getIntent().getStringExtra("url");
        mTitle = this.getIntent().getStringExtra("title");
        detailsWebView = (WebView) findViewById(R.id.web_wv);
        detailsWebView.getSettings().setJavaScriptEnabled(true);
        detailsWebView.getSettings().setDomStorageEnabled(true);
        detailsWebView.requestFocus(View.FOCUS_DOWN);
        detailsWebView.getSettings().setUserAgentString("User-Agent");

        detailsWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return false;
            }
        });
        // 設置web視圖客戶端
        detailsWebView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int progress) {// 載入進度改變而觸發

                if (progress == 100) {
                    handler.sendEmptyMessage(1);// 如果全部載入,隱藏進度對話框 }
                    detailsWebView.setVisibility(View.VISIBLE);
                }
                super.onProgressChanged(view, progress);
            }

            @Override
            public void onReceivedTitle(WebView view, String title) {
                super.onReceivedTitle(view, title);

            }
        });

        detailsWebView.setVisibility(View.GONE);
        pd = new ProgressDialog(this);
        pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        pd.setMessage("數據載入中,請稍候!");


        handler = new Handler() {

            public void handleMessage(Message msg) {// 定義一個Handler,用於處理下載線程與UI間通訊
                super.handleMessage(msg);
                if (!Thread.currentThread().isInterrupted()) {
                    switch (msg.what) {
                        case 0:
                            pd.show();// 顯示進度對話框
                            break;
                        case 1:
                            pd.hide();// 隱藏進度對話框,不可使用dismiss()cancel(),否則再次調用show()時,顯示的對話框小圓圈不會動。
                            break;
                    }
                }

            }

        };
        loadurl(detailsWebView, mUrl);
    }

    public void loadurl(final WebView view, final String url) {
        handler.post(new Runnable() {

            @Override
            public void run() {
                handler.sendEmptyMessage(0);
                view.loadUrl(url);// 載入網頁
            }
        });
    }
}
首先,選擇判斷是否安裝對應地圖App時,有則啟動,沒有則轉網頁地圖。   1、百度地圖:開發平台URL地址:http://developer.baidu.com/map/wiki/index.php?title=uri/api/android  
private void selectBaidu() {
    this.dismiss();
    try {
        //調起App
        if (isInstallByread("com.baidu.BaiduMap")) {
            Intent intent = Intent.getIntent("intent://map/direction?origin=latlng:"
                    + nowLat + "," + nowLng
                    + "|name:&destination=" + desAddress + "&mode=driving?ion=" + "我的位置"
                    + "&referer=Autohome|GasStation#Intent;scheme=bdapp;package=com.baidu.BaiduMap;end");
            mActivity.startActivity(intent);
        } else {
            /*String url = "http://api.map.baidu.com/direction?origin=latlng:" + mLatitude + ","
                            + mLongitude + "|name:&destination=" + mDestination
                            + "&mode=driving&output=html&src=天工項目共建";
                    WebViewActivity.launch(getActivity(), url, "網頁版地圖導航");*/
            Toast.makeText(mActivity, "如果您沒有安裝百度地圖APP" +
                    "可能無法正常使用導航,建議選擇其他地圖", Toast.LENGTH_SHORT).show();
        }
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }

}
  2、高德地圖 :   
private void selectGaode() {
    this.dismiss();
    double[] txDesLatLng = MapTranslateUtils.map_bd2hx(desLat, desLng);
    double[] txNowLatLng = MapTranslateUtils.map_bd2hx(nowLat, nowLng);
    if (isInstallByread("com.autonavi.minimap")) {
        try {
            Intent intentOther = new Intent("android.intent.action.VIEW",
                    Uri.parse("androidamap://navi?sourceApplication=amap&lat="
                            + desLat + "&lon=" + desLng + "&dev=1&stype=0"));
            intentOther.setPackage("com.autonavi.minimap");
            intentOther.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
            mActivity.startActivity(intentOther);
        } catch (Exception e) {
            String url = "http://m.amap.com/?from="
                    + nowLat + "," + nowLng
                    + "(from)&to=" + desLat + "," + desLng + "(to)&type=0&opt=1&dev=0";
            WebViewActivity.launch(mActivity, url, "網頁版地圖導航");
        }

    } else {
        String url = "http://m.amap.com/?from="
                + txNowLatLng[0] + "," + txNowLatLng[1]
                + "(from)&to=" + txDesLatLng[0] + "," + txDesLatLng[1] + "(to)&type=0&opt=1&dev=0";
        WebViewActivity.launch(mActivity, url, "網頁版地圖導航");

    }

}
  需要注意的是上面的dev參數,如果你傳入的已經是火星坐標,參數為0就行,如果你傳入的是高德坐標,則傳入1。這裡是個坑,要注意一下。 \   3、騰訊地圖: 開發平台URL地址:http://lbs.qq.com/uri_v1/guide-route.html 看官方介紹目前騰訊還不支持直接啟動騰訊地圖App。 \   所以只能調用web的地圖:  
private void selectTencent() {
    this.dismiss();
    double[] txDesLatLng = MapTranslateUtils.map_bd2hx(desLat, desLng);
    double[] txNowLatLng = MapTranslateUtils.map_bd2hx(nowLat, nowLng);
    String url = "http://apis.map.qq.com/uri/v1/routeplan?type=drive&from=&fromcoord="
            + txNowLatLng[0] + "," + txNowLatLng[1]
            + "&to=&tocoord=" + txDesLatLng[0] + "," + txDesLatLng[1] + "&policy=0&referer=myapp";
    WebViewActivity.launch(mActivity, url, "網頁版地圖導航");
}
另外此處是高德地圖對其他坐標進行轉換的api:   \
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved