安卓高德地圖開發(四)——自定義線路規劃(根據地點的經緯度規劃線路)


一、原理


在高德地圖使用的時候,我們在給定起點和終點的時候就可以規劃出線路,但是有時候我們需要車按指定的站點進行運行和線路規劃,那麼,此時的話就必須自己去重新來規

劃這個線路,原理也很簡單,就是獲取到你要經過的那些地方的經緯度(經緯度一定要是準確的經緯度,這裏在獲取的時候可以通過地理編碼去獲取),在獲取到經緯度之後把數

據傳遞到線路規劃的方法裏面,這樣就可以完成線路的自定義規劃!


二、獲取要經過的站點經緯度


1:佈局文件

  1. <?xml version=“1.0” encoding=“utf-8”?>  
  2. <LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”  
  3.     android:layout_width=“fill_parent”  
  4.     android:layout_height=“fill_parent”  
  5.     android:background=“#FFF”  
  6.     android:orientation=“vertical” >  
  7.   
  8.     <LinearLayout  
  9.         android:layout_width=“match_parent”  
  10.         android:layout_height=“50dp” >  
  11.   
  12.         <Button  
  13.             android:id=“@+id/button1”  
  14.             android:layout_width=“0dp”  
  15.             android:layout_height=“fill_parent”  
  16.             android:layout_weight=“1”  
  17.             android:text=“中興產業園” />  
  18.   
  19.         <Button  
  20.             android:id=“@+id/button2”  
  21.             android:layout_width=“0dp”  
  22.             android:layout_height=“fill_parent”  
  23.             android:layout_weight=“1”  
  24.             android:text=“大雁塔” />  
  25.   
  26.         <Button  
  27.             android:id=“@+id/button3”  
  28.             android:layout_width=“0dp”  
  29.             android:layout_height=“fill_parent”  
  30.             android:layout_weight=“1”  
  31.             android:text=“旺座現代城” />  
  32.     </LinearLayout>  
  33.   
  34.     <LinearLayout  
  35.         android:layout_width=“match_parent”  
  36.         android:layout_height=“50dp” >  
  37.   
  38.         <Button  
  39.             android:id=“@+id/button4”  
  40.             android:layout_width=“0dp”  
  41.             android:layout_height=“fill_parent”  
  42.             android:layout_weight=“1”  
  43.             android:text=“亞美大廈” />  
  44.   
  45.         <Button  
  46.             android:id=“@+id/button5”  
  47.             android:layout_width=“0dp”  
  48.             android:layout_height=“fill_parent”  
  49.             android:layout_weight=“1”  
  50.             android:text=“吉祥村” />  
  51.   
  52.         <Button  
  53.             android:id=“@+id/button6”  
  54.             android:layout_width=“0dp”  
  55.             android:layout_height=“fill_parent”  
  56.             android:layout_weight=“1”  
  57.             android:text=“陝西歷史博物館” />  
  58.     </LinearLayout>  
  59.   
  60.     <com.amap.api.maps.MapView  
  61.         android:id=“@+id/map”  
  62.         android:layout_width=“match_parent”  
  63.         android:layout_height=“match_parent” />  
  64.   
  65. </LinearLayout>  
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#FFF"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp" >

        <Button
            android:id="@+id/button1"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:text="中興產業園" />

        <Button
            android:id="@+id/button2"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:text="大雁塔" />

        <Button
            android:id="@+id/button3"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:text="旺座現代城" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp" >

        <Button
            android:id="@+id/button4"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:text="亞美大廈" />

        <Button
            android:id="@+id/button5"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:text="吉祥村" />

        <Button
            android:id="@+id/button6"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:text="陝西歷史博物館" />
    </LinearLayout>

    <com.amap.api.maps.MapView
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

2Java文件

  1. package com.amap.map3d.demo.geocoder;  
  2.   
  3. import android.app.Activity;  
  4. import android.app.ProgressDialog;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9.   
  10. import com.amap.api.maps.AMap;  
  11. import com.amap.api.maps.CameraUpdateFactory;  
  12. import com.amap.api.maps.MapView;  
  13. import com.amap.api.maps.model.BitmapDescriptorFactory;  
  14. import com.amap.api.maps.model.Marker;  
  15. import com.amap.api.maps.model.MarkerOptions;  
  16. import com.amap.api.services.core.LatLonPoint;  
  17. import com.amap.api.services.geocoder.GeocodeAddress;  
  18. import com.amap.api.services.geocoder.GeocodeQuery;  
  19. import com.amap.api.services.geocoder.GeocodeResult;  
  20. import com.amap.api.services.geocoder.GeocodeSearch;  
  21. import com.amap.api.services.geocoder.GeocodeSearch.OnGeocodeSearchListener;  
  22. import com.amap.api.services.geocoder.RegeocodeQuery;  
  23. import com.amap.api.services.geocoder.RegeocodeResult;  
  24. import com.amap.map3d.demo.util.AMapUtil;  
  25. import com.amap.map3d.demo.util.ToastUtil;  
  26. import com.amap.map3d.demo.R;  
  27.   
  28. /**  
  29.  * 地理編碼與逆地理編碼功能介紹  
  30.  */  
  31. public class GeocoderActivity extends Activity implements OnGeocodeSearchListener, OnClickListener {  
  32.     private ProgressDialog progDialog = null;  
  33.     private GeocodeSearch geocoderSearch;  
  34.     private String addressName;  
  35.     private AMap aMap;  
  36.     private MapView mapView;  
  37.     private LatLonPoint latLonPoint = new LatLonPoint(39.90865, 116.39751);  
  38.     private Marker geoMarker;  
  39.     private Marker regeoMarker;  
  40.   
  41.     @Override  
  42.     protected void onCreate(Bundle savedInstanceState) {  
  43.         super.onCreate(savedInstanceState);  
  44.         setContentView(R.layout.geocoder_activity);  
  45.         /*  
  46.          * 設置離線地圖存儲目錄,在下載離線地圖或初始化地圖設置; 使用過程中可自行設置, 若自行設置了離線地圖存儲的路徑,  
  47.          * 則需要在離線地圖下載和使用地圖頁面都進行路徑設置  
  48.          */  
  49.         // Demo中爲了其他界面可以使用下載的離線地圖,使用默認位置存儲,屏蔽了自定義設置  
  50.         // MapsInitializer.sdcardDir =OffLineMapUtils.getSdCacheDir(this);  
  51.         mapView = (MapView) findViewById(R.id.map);  
  52.         mapView.onCreate(savedInstanceState);// 此方法必須重寫  
  53.     }  
  54.   
  55.   
  56.   
  57.     /**  
  58.      * 方法必須重寫  
  59.      */  
  60.     @Override  
  61.     protected void onResume() {  
  62.         super.onResume();  
  63.         mapView.onResume();  
  64.     }  
  65.   
  66.     /**  
  67.      * 方法必須重寫  
  68.      */  
  69.     @Override  
  70.     protected void onPause() {  
  71.         super.onPause();  
  72.         mapView.onPause();  
  73.     }  
  74.   
  75.     /**  
  76.      * 方法必須重寫  
  77.      */  
  78.     @Override  
  79.     protected void onSaveInstanceState(Bundle outState) {  
  80.         super.onSaveInstanceState(outState);  
  81.         mapView.onSaveInstanceState(outState);  
  82.     }  
  83.   
  84.     /**  
  85.      * 方法必須重寫  
  86.      */  
  87.     @Override  
  88.     protected void onDestroy() {  
  89.         super.onDestroy();  
  90.         mapView.onDestroy();  
  91.     }  
  92.   
  93.     /**  
  94.      * 顯示進度條對話框  
  95.      */  
  96.     public void showDialog() {  
  97.         progDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);  
  98.         progDialog.setIndeterminate(false);  
  99.         progDialog.setCancelable(true);  
  100.         progDialog.setMessage(“正在獲取地址”);  
  101.         progDialog.show();  
  102.     }  
  103.   
  104.     /**  
  105.      * 隱藏進度條對話框  
  106.      */  
  107.     public void dismissDialog() {  
  108.         if (progDialog != null) {  
  109.             progDialog.dismiss();  
  110.         }  
  111.     }  
  112.   
  113.     /**  
  114.      * 響應地理編碼  
  115.      */  
  116.     public void getLatlon(final String name) {  
  117.         showDialog();  
  118.   
  119.         GeocodeQuery query = new GeocodeQuery(name, “010”);// 第一個參數表示地址,第二個參數表示查詢城市,中文或者中文全拼,citycode、adcode,  
  120.         geocoderSearch.getFromLocationNameAsyn(query);// 設置同步地理編碼請求  
  121.     }  
  122.   
  123.     /**  
  124.      * 響應逆地理編碼  
  125.      */  
  126.     public void getAddress(final LatLonPoint latLonPoint) {  
  127.         showDialog();  
  128.         RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 200, GeocodeSearch.AMAP);// 第一個參數表示一個Latlng,第二參數表示範圍多少米,第三個參數表示是火系座標系還是GPS原生座標系  
  129.         geocoderSearch.getFromLocationAsyn(query);// 設置同步逆地理編碼請求  
  130.     }  
  131.   
  132.     /**  
  133.      * 地理編碼查詢回調  
  134.      */  
  135.     @Override  
  136.     public void onGeocodeSearched(GeocodeResult result, int rCode) {  
  137.         dismissDialog();  
  138.         if (rCode == 0) {  
  139.             if (result != null && result.getGeocodeAddressList() != null && result.getGeocodeAddressList().size() > 0) {  
  140.                 GeocodeAddress address = result.getGeocodeAddressList().get(0);  
  141.                 aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(AMapUtil.convertToLatLng(address.getLatLonPoint()), 15));  
  142.                 geoMarker.setPosition(AMapUtil.convertToLatLng(address.getLatLonPoint()));  
  143.                 addressName = “經緯度值:” + address.getLatLonPoint() + ”\n位置描述:” + address.getFormatAddress();  
  144.                 ToastUtil.show(GeocoderActivity.this, addressName);  
  145.             } else {  
  146.                 ToastUtil.show(GeocoderActivity.this, R.string.no_result);  
  147.             }  
  148.         } else if (rCode == 27) {  
  149.             ToastUtil.show(GeocoderActivity.this, R.string.error_network);  
  150.         } else if (rCode == 32) {  
  151.             ToastUtil.show(GeocoderActivity.this, R.string.error_key);  
  152.         } else {  
  153.             ToastUtil.show(GeocoderActivity.this, getString(R.string.error_other) + rCode);  
  154.         }  
  155.     }  
  156.   
  157.     /**  
  158.      * 逆地理編碼回調  
  159.      */  
  160.     @Override  
  161.     public void onRegeocodeSearched(RegeocodeResult result, int rCode) {  
  162.         dismissDialog();  
  163.         if (rCode == 0) {  
  164.             if (result != null && result.getRegeocodeAddress() != null && result.getRegeocodeAddress().getFormatAddress() != null) {  
  165.                 addressName = result.getRegeocodeAddress().getFormatAddress() + ”附近”;  
  166.                 aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(AMapUtil.convertToLatLng(latLonPoint), 15));  
  167.                 regeoMarker.setPosition(AMapUtil.convertToLatLng(latLonPoint));  
  168.                 ToastUtil.show(GeocoderActivity.this, addressName);  
  169.             } else {  
  170.                 ToastUtil.show(GeocoderActivity.this, R.string.no_result);  
  171.             }  
  172.         } else if (rCode == 27) {  
  173.             ToastUtil.show(GeocoderActivity.this, R.string.error_network);  
  174.         } else if (rCode == 32) {  
  175.             ToastUtil.show(GeocoderActivity.this, R.string.error_key);  
  176.         } else {  
  177.             ToastUtil.show(GeocoderActivity.this, getString(R.string.error_other) + rCode);  
  178.         }  
  179.     }  
  180.   
  181.     @Override  
  182.     public void onClick(View v) {  
  183.         switch (v.getId()) {  
  184.         /**  
  185.          * 響應地理編碼按鈕  
  186.          */  
  187.         case R.id.geoButton:  
  188.             getLatlon(“方恆國際中心”);  
  189.             break;  
  190.         /**  
  191.          * 響應逆地理編碼按鈕  
  192.          */  
  193.         case R.id.regeoButton:  
  194.             getAddress(latLonPoint);  
  195.             break;  
  196.         default:  
  197.             break;  
  198.         }  
  199.     }  
  200. }  
package com.amap.map3d.demo.geocoder;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.geocoder.GeocodeAddress;
import com.amap.api.services.geocoder.GeocodeQuery;
import com.amap.api.services.geocoder.GeocodeResult;
import com.amap.api.services.geocoder.GeocodeSearch;
import com.amap.api.services.geocoder.GeocodeSearch.OnGeocodeSearchListener;
import com.amap.api.services.geocoder.RegeocodeQuery;
import com.amap.api.services.geocoder.RegeocodeResult;
import com.amap.map3d.demo.util.AMapUtil;
import com.amap.map3d.demo.util.ToastUtil;
import com.amap.map3d.demo.R;

/**
 * 地理編碼與逆地理編碼功能介紹
 */
public class GeocoderActivity extends Activity implements OnGeocodeSearchListener, OnClickListener {
    private ProgressDialog progDialog = null;
    private GeocodeSearch geocoderSearch;
    private String addressName;
    private AMap aMap;
    private MapView mapView;
    private LatLonPoint latLonPoint = new LatLonPoint(39.90865, 116.39751);
    private Marker geoMarker;
    private Marker regeoMarker;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.geocoder_activity);
        /*
         * 設置離線地圖存儲目錄,在下載離線地圖或初始化地圖設置; 使用過程中可自行設置, 若自行設置了離線地圖存儲的路徑,
         * 則需要在離線地圖下載和使用地圖頁面都進行路徑設置
         */
        // Demo中爲了其他界面可以使用下載的離線地圖,使用默認位置存儲,屏蔽了自定義設置
        // MapsInitializer.sdcardDir =OffLineMapUtils.getSdCacheDir(this);
        mapView = (MapView) findViewById(R.id.map);
        mapView.onCreate(savedInstanceState);// 此方法必須重寫
    }



    /**
     * 方法必須重寫
     */
    @Override
    protected void onResume() {
        super.onResume();
        mapView.onResume();
    }

    /**
     * 方法必須重寫
     */
    @Override
    protected void onPause() {
        super.onPause();
        mapView.onPause();
    }

    /**
     * 方法必須重寫
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mapView.onSaveInstanceState(outState);
    }

    /**
     * 方法必須重寫
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }

    /**
     * 顯示進度條對話框
     */
    public void showDialog() {
        progDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progDialog.setIndeterminate(false);
        progDialog.setCancelable(true);
        progDialog.setMessage("正在獲取地址");
        progDialog.show();
    }

    /**
     * 隱藏進度條對話框
     */
    public void dismissDialog() {
        if (progDialog != null) {
            progDialog.dismiss();
        }
    }

    /**
     * 響應地理編碼
     */
    public void getLatlon(final String name) {
        showDialog();

        GeocodeQuery query = new GeocodeQuery(name, "010");// 第一個參數表示地址,第二個參數表示查詢城市,中文或者中文全拼,citycode、adcode,
        geocoderSearch.getFromLocationNameAsyn(query);// 設置同步地理編碼請求
    }

    /**
     * 響應逆地理編碼
     */
    public void getAddress(final LatLonPoint latLonPoint) {
        showDialog();
        RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 200, GeocodeSearch.AMAP);// 第一個參數表示一個Latlng,第二參數表示範圍多少米,第三個參數表示是火系座標系還是GPS原生座標系
        geocoderSearch.getFromLocationAsyn(query);// 設置同步逆地理編碼請求
    }

    /**
     * 地理編碼查詢回調
     */
    @Override
    public void onGeocodeSearched(GeocodeResult result, int rCode) {
        dismissDialog();
        if (rCode == 0) {
            if (result != null && result.getGeocodeAddressList() != null && result.getGeocodeAddressList().size() > 0) {
                GeocodeAddress address = result.getGeocodeAddressList().get(0);
                aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(AMapUtil.convertToLatLng(address.getLatLonPoint()), 15));
                geoMarker.setPosition(AMapUtil.convertToLatLng(address.getLatLonPoint()));
                addressName = "經緯度值:" + address.getLatLonPoint() + "\n位置描述:" + address.getFormatAddress();
                ToastUtil.show(GeocoderActivity.this, addressName);
            } else {
                ToastUtil.show(GeocoderActivity.this, R.string.no_result);
            }
        } else if (rCode == 27) {
            ToastUtil.show(GeocoderActivity.this, R.string.error_network);
        } else if (rCode == 32) {
            ToastUtil.show(GeocoderActivity.this, R.string.error_key);
        } else {
            ToastUtil.show(GeocoderActivity.this, getString(R.string.error_other) + rCode);
        }
    }

    /**
     * 逆地理編碼回調
     */
    @Override
    public void onRegeocodeSearched(RegeocodeResult result, int rCode) {
        dismissDialog();
        if (rCode == 0) {
            if (result != null && result.getRegeocodeAddress() != null && result.getRegeocodeAddress().getFormatAddress() != null) {
                addressName = result.getRegeocodeAddress().getFormatAddress() + "附近";
                aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(AMapUtil.convertToLatLng(latLonPoint), 15));
                regeoMarker.setPosition(AMapUtil.convertToLatLng(latLonPoint));
                ToastUtil.show(GeocoderActivity.this, addressName);
            } else {
                ToastUtil.show(GeocoderActivity.this, R.string.no_result);
            }
        } else if (rCode == 27) {
            ToastUtil.show(GeocoderActivity.this, R.string.error_network);
        } else if (rCode == 32) {
            ToastUtil.show(GeocoderActivity.this, R.string.error_key);
        } else {
            ToastUtil.show(GeocoderActivity.this, getString(R.string.error_other) + rCode);
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        /**
         * 響應地理編碼按鈕
         */
        case R.id.geoButton:
            getLatlon("方恆國際中心");
            break;
        /**
         * 響應逆地理編碼按鈕
         */
        case R.id.regeoButton:
            getAddress(latLonPoint);
            break;
        default:
            break;
        }
    }
}


通過以上的方法可以以此獲取到各自的經緯度的值:


  1. private LatLonPoint lat_one = new LatLonPoint(34.215748, 108.891869);  
  2. private LatLonPoint lat_two = new LatLonPoint(34.233685, 108.900635);  
  3. private LatLonPoint lat_three = new LatLonPoint(34.225311, 108.930992);  
  4. private LatLonPoint lat_four = new LatLonPoint(34.224136, 108.955284);  
  5.   
  6. // 旺座現代城:34.215748,108.891869  
  7. // 亞美大廈:34.233685,108.900635  
  8. // 吉祥村:34.225311,108.930992  
  9. // 陝西歷史博物館:34.224136,108.955284  
   private LatLonPoint lat_one = new LatLonPoint(34.215748, 108.891869);
    private LatLonPoint lat_two = new LatLonPoint(34.233685, 108.900635);
    private LatLonPoint lat_three = new LatLonPoint(34.225311, 108.930992);
    private LatLonPoint lat_four = new LatLonPoint(34.224136, 108.955284);

    // 旺座現代城:34.215748,108.891869
    // 亞美大廈:34.233685,108.900635
    // 吉祥村:34.225311,108.930992
    // 陝西歷史博物館:34.224136,108.955284

同時還要拿到起點和終點的經緯度:


  1. private LatLonPoint startPoint = new LatLonPoint(34.185642, 108.881905);  
  2. private LatLonPoint endPoint = new LatLonPoint(34.214397, 108.963448);  
  private LatLonPoint startPoint = new LatLonPoint(34.185642, 108.881905);
    private LatLonPoint endPoint = new LatLonPoint(34.214397, 108.963448);


三、線路規劃


  1. package com.bm.futuretechcity;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.app.ProgressDialog;  
  7. import android.content.Context;  
  8. import android.os.Bundle;  
  9. import android.os.Environment;  
  10. import android.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.widget.ArrayAdapter;  
  13. import android.widget.TextView;  
  14.   
  15. import com.amap.api.maps.AMap;  
  16. import com.amap.api.maps.AMap.InfoWindowAdapter;  
  17. import com.amap.api.maps.AMap.OnInfoWindowClickListener;  
  18. import com.amap.api.maps.AMap.OnMapClickListener;  
  19. import com.amap.api.maps.AMap.OnMarkerClickListener;  
  20. import com.amap.api.maps.MapView;  
  21. import com.amap.api.maps.MapsInitializer;  
  22. import com.amap.api.maps.model.LatLng;  
  23. import com.amap.api.maps.model.Marker;  
  24. import com.amap.api.maps.overlay.DrivingRouteOverlay;  
  25. import com.amap.api.services.core.LatLonPoint;  
  26. import com.amap.api.services.geocoder.GeocodeAddress;  
  27. import com.amap.api.services.geocoder.GeocodeQuery;  
  28. import com.amap.api.services.geocoder.GeocodeResult;  
  29. import com.amap.api.services.geocoder.GeocodeSearch;  
  30. import com.amap.api.services.geocoder.GeocodeSearch.OnGeocodeSearchListener;  
  31. import com.amap.api.services.geocoder.RegeocodeQuery;  
  32. import com.amap.api.services.geocoder.RegeocodeResult;  
  33. import com.amap.api.services.poisearch.PoiItemDetail;  
  34. import com.amap.api.services.poisearch.PoiResult;  
  35. import com.amap.api.services.poisearch.PoiSearch.OnPoiSearchListener;  
  36. import com.amap.api.services.route.BusRouteResult;  
  37. import com.amap.api.services.route.DrivePath;  
  38. import com.amap.api.services.route.DriveRouteResult;  
  39. import com.amap.api.services.route.RouteSearch;  
  40. import com.amap.api.services.route.RouteSearch.DriveRouteQuery;  
  41. import com.amap.api.services.route.RouteSearch.OnRouteSearchListener;  
  42. import com.amap.api.services.route.WalkRouteResult;  
  43. import com.bm.futuretechcity.adapter.ShowBanCheLineAdapter;  
  44. import com.bm.futuretechcity.base.BaseActivity;  
  45. import com.bm.futuretechcity.bean.ShowBanCheMessage;  
  46. import com.bm.futuretechcity.utils.ToastUtil;  
  47. import com.bm.futuretechcity.view.HorizontalListView;  
  48.   
  49. /**  
  50.  * 班車線路  
  51.  *   
  52.  * @author wangxuan  
  53.  *   
  54.  */  
  55. public class TraBanCheLineActivity extends BaseActivity implements OnGeocodeSearchListener, OnClickListener, OnMarkerClickListener,  
  56.         OnMapClickListener, OnInfoWindowClickListener, InfoWindowAdapter, OnPoiSearchListener, OnRouteSearchListener {  
  57.     private ProgressDialog progDialog = null;  
  58.     private GeocodeSearch geocoderSearch;  
  59.     private String addressName;  
  60.   
  61.     private AMap aMap;  
  62.     private MapView mapView;  
  63.   
  64.     private int drivingMode = RouteSearch.DrivingDefault;// 駕車默認模式  
  65.     private DriveRouteResult driveRouteResult;// 駕車模式查詢結果  
  66.     private int routeType = 1;// 1代表公交模式,2代表駕車模式,3代表步行模式  
  67.     private LatLonPoint startPoint = new LatLonPoint(34.185642, 108.881905);  
  68.     private LatLonPoint endPoint = new LatLonPoint(34.214397, 108.963448);  
  69.   
  70.     private LatLonPoint lat_one = new LatLonPoint(34.215748, 108.891869);  
  71.     private LatLonPoint lat_two = new LatLonPoint(34.233685, 108.900635);  
  72.     private LatLonPoint lat_three = new LatLonPoint(34.225311, 108.930992);  
  73.     private LatLonPoint lat_four = new LatLonPoint(34.224136, 108.955284);  
  74.   
  75.     // 旺座現代城:34.215748,108.891869  
  76.     // 亞美大廈:34.233685,108.900635  
  77.     // 吉祥村:34.225311,108.930992  
  78.     // 陝西歷史博物館:34.224136,108.955284  
  79.   
  80.     private String[] station_name = new String[] { ”中興產業園”, ”旺座現代城”, ”亞美大廈”, ”吉祥村”, ”陝西歷史博物館”, ”大雁塔” };  
  81.     private List<LatLonPoint> list_latLatLonPoints = new ArrayList<LatLonPoint>();  
  82.   
  83.     private RouteSearch routeSearch;  
  84.     public ArrayAdapter<String> aAdapter;  
  85.   
  86.     private LatLonPoint start_msg;  
  87.     private LatLonPoint end_msg;  
  88.     private HorizontalListView show_station_name;  
  89.   
  90.     private List<ShowBanCheMessage> list_showBanCheMessages = new ArrayList<ShowBanCheMessage>();  
  91.   
  92.     /**  
  93.      * 頁面標題  
  94.      */  
  95.     private TextView titleTv;  
  96.   
  97.     @Override  
  98.     protected void onCreate(Bundle bundle) {  
  99.         super.onCreate(bundle);  
  100.         setContentView(R.layout.activity_tra_ban_che_line);  
  101.         initWidget();  
  102.   
  103.         show_station_name = (HorizontalListView) this.findViewById(R.id.show_station_name);  
  104.           
  105.           
  106.         ShowBanCheMessage showBanCheMessage;  
  107.         for(int i=0;i<station_name.length;i++){  
  108.             showBanCheMessage = new ShowBanCheMessage();  
  109.             showBanCheMessage.setStation_name(station_name[i]);  
  110.             list_showBanCheMessages.add(showBanCheMessage);  
  111.         }  
  112.           
  113.         ShowBanCheLineAdapter showStationNameAdapter = new ShowBanCheLineAdapter(TraBanCheLineActivity.this, list_showBanCheMessages);  
  114.         show_station_name.setAdapter(showStationNameAdapter);  
  115.   
  116.         geocoderSearch = new GeocodeSearch(this);  
  117.         geocoderSearch.setOnGeocodeSearchListener(this);  
  118.   
  119.         list_latLatLonPoints.add(lat_one);  
  120.         list_latLatLonPoints.add(lat_two);  
  121.         list_latLatLonPoints.add(lat_three);  
  122.         list_latLatLonPoints.add(lat_four);  
  123.   
  124.         /*  
  125.          * 設置離線地圖存儲目錄,在下載離線地圖或初始化地圖設置; 使用過程中可自行設置, 若自行設置了離線地圖存儲的路徑,  
  126.          * 則需要在離線地圖下載和使用地圖頁面都進行路徑設置  
  127.          */  
  128.         // Demo中爲了其他界面可以使用下載的離線地圖,使用默認位置存儲,屏蔽了自定義設置  
  129.         MapsInitializer.sdcardDir = getSdCacheDir(this);  
  130.         mapView = (MapView) findViewById(R.id.map);  
  131.         mapView.onCreate(bundle);// 此方法必須重寫  
  132.         init();  
  133.   
  134.         searchRouteResult(startPoint, endPoint);  
  135.     }  
  136.   
  137.     /**  
  138.      * 初始化AMap對象  
  139.      */  
  140.     private void init() {  
  141.         if (aMap == null) {  
  142.             aMap = mapView.getMap();  
  143.             registerListener();  
  144.         }  
  145.         routeSearch = new RouteSearch(this);  
  146.         routeSearch.setRouteSearchListener(this);  
  147.     }  
  148.   
  149.     /**  
  150.      * 響應地理編碼  
  151.      */  
  152.     public void getLatlon(final String name) {  
  153.         GeocodeQuery query = new GeocodeQuery(name, “029”);// 第一個參數表示地址,第二個參數表示查詢城市,中文或者中文全拼,citycode、adcode,  
  154.         geocoderSearch.getFromLocationNameAsyn(query);// 設置同步地理編碼請求  
  155.     }  
  156.   
  157.     /**  
  158.      * 響應逆地理編碼  
  159.      */  
  160.     public void getAddress(final LatLonPoint latLonPoint) {  
  161.         RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 200, GeocodeSearch.AMAP);// 第一個參數表示一個Latlng,第二參數表示範圍多少米,第三個參數表示是火系座標系還是GPS原生座標系  
  162.         geocoderSearch.getFromLocationAsyn(query);// 設置同步逆地理編碼請求  
  163.     }  
  164.   
  165.     /**  
  166.      * 地理編碼查詢回調  
  167.      */  
  168.     @Override  
  169.     public void onGeocodeSearched(GeocodeResult result, int rCode) {  
  170.         if (rCode == 0) {  
  171.             if (result != null && result.getGeocodeAddressList() != null && result.getGeocodeAddressList().size() > 0) {  
  172.                 GeocodeAddress address = result.getGeocodeAddressList().get(0);  
  173.                 address.getLatLonPoint();  
  174.   
  175.                 // if (flag == 0) {  
  176.                 // start_msg = address.getLatLonPoint();  
  177.                 // System.out.println(“========start_msg======:”+start_msg);  
  178.                 // } else {  
  179.                 // end_msg = address.getLatLonPoint();  
  180.                 // System.out.println(“=======end_msg=======:”+end_msg);  
  181.                 // }  
  182.                 //  
  183.                 // if (start_msg != null && end_msg != null) {  
  184.                 // searchRouteResult(start_msg, end_msg);  
  185.                 // }  
  186.   
  187.                 addressName = “經緯度值:” + address.getLatLonPoint() + ”\n位置描述:” + address.getFormatAddress();  
  188.                 ToastUtil.show(TraBanCheLineActivity.this, start_msg + ”,” + end_msg);  
  189.             } else {  
  190.                 ToastUtil.show(TraBanCheLineActivity.this, R.string.no_result);  
  191.             }  
  192.         } else if (rCode == 27) {  
  193.             ToastUtil.show(TraBanCheLineActivity.this, R.string.error_network);  
  194.         } else if (rCode == 32) {  
  195.             ToastUtil.show(TraBanCheLineActivity.this, R.string.error_key);  
  196.         } else {  
  197.             ToastUtil.show(TraBanCheLineActivity.this, getString(R.string.error_other) + rCode);  
  198.         }  
  199.     }  
  200.   
  201.     /**  
  202.      * 逆地理編碼回調  
  203.      */  
  204.     @Override  
  205.     public void onRegeocodeSearched(RegeocodeResult result, int rCode) {  
  206.         if (rCode == 0) {  
  207.             if (result != null && result.getRegeocodeAddress() != null && result.getRegeocodeAddress().getFormatAddress() != null) {  
  208.                 addressName = result.getRegeocodeAddress().getFormatAddress() + ”附近”;  
  209.                 ToastUtil.show(TraBanCheLineActivity.this, addressName);  
  210.             } else {  
  211.                 ToastUtil.show(TraBanCheLineActivity.this, R.string.no_result);  
  212.             }  
  213.         } else if (rCode == 27) {  
  214.             ToastUtil.show(TraBanCheLineActivity.this, R.string.error_network);  
  215.         } else if (rCode == 32) {  
  216.             ToastUtil.show(TraBanCheLineActivity.this, R.string.error_key);  
  217.         } else {  
  218.             ToastUtil.show(TraBanCheLineActivity.this, getString(R.string.error_other) + rCode);  
  219.         }  
  220.     }  
  221.   
  222.     @Override  
  223.     public void onInfoWindowClick(Marker marker) {  
  224.     }  
  225.   
  226.     @Override  
  227.     public boolean onMarkerClick(Marker marker) {  
  228.         if (marker.isInfoWindowShown()) {  
  229.             marker.hideInfoWindow();  
  230.         } else {  
  231.             marker.showInfoWindow();  
  232.         }  
  233.         return false;  
  234.     }  
  235.   
  236.     @Override  
  237.     public void onMapClick(LatLng latng) {  
  238.     }  
  239.   
  240.     @Override  
  241.     public View getInfoContents(Marker marker) {  
  242.         return null;  
  243.     }  
  244.   
  245.     @Override  
  246.     public View getInfoWindow(Marker marker) {  
  247.         return null;  
  248.     }  
  249.   
  250.     /**  
  251.      * 註冊監聽  
  252.      */  
  253.     private void registerListener() {  
  254.         aMap.setOnMapClickListener(TraBanCheLineActivity.this);  
  255.         aMap.setOnMarkerClickListener(TraBanCheLineActivity.this);  
  256.         aMap.setOnInfoWindowClickListener(TraBanCheLineActivity.this);  
  257.         aMap.setInfoWindowAdapter(TraBanCheLineActivity.this);  
  258.     }  
  259.   
  260.     /**  
  261.      * 顯示進度框  
  262.      */  
  263.     private void showProgressDialog() {  
  264.         if (progDialog == null)  
  265.             progDialog = new ProgressDialog(this);  
  266.         progDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);  
  267.         progDialog.setIndeterminate(false);  
  268.         progDialog.setCancelable(true);  
  269.         progDialog.setMessage(“正在搜索”);  
  270.         progDialog.show();  
  271.     }  
  272.   
  273.     /**  
  274.      * 隱藏進度框  
  275.      */  
  276.     private void dissmissProgressDialog() {  
  277.         if (progDialog != null) {  
  278.             progDialog.dismiss();  
  279.         }  
  280.     }  
  281.   
  282.     /**  
  283.      * 開始搜索路徑規劃方案  
  284.      */  
  285.     public void searchRouteResult(LatLonPoint startPoint, LatLonPoint endPoint) {  
  286.         showProgressDialog();  
  287.         final RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(startPoint, endPoint);  
  288.         // 駕車路徑規劃  
  289.         // 第一個參數表示路徑規劃的起點和終點,第二個參數表示駕車模式,第三個參數表示途經點,第四個參數表示避讓區域,第五個參數表示避讓道路  
  290.           
  291.           
  292.           
  293.         DriveRouteQuery query = new DriveRouteQuery(fromAndTo, drivingMode, list_latLatLonPoints, null, ”“);  
  294.         routeSearch.calculateDriveRouteAsyn(query);// 異步路徑規劃駕車模式查詢  
  295.     }  
  296.   
  297.     @Override  
  298.     public void onPoiItemDetailSearched(PoiItemDetail arg0, int arg1) {  
  299.   
  300.     }  
  301.   
  302.     /**  
  303.      * POI搜索結果回調  
  304.      */  
  305.     @Override  
  306.     public void onPoiSearched(PoiResult result, int rCode) {  
  307.     }  
  308.   
  309.     /**  
  310.      * 駕車結果回調  
  311.      */  
  312.     @Override  
  313.     public void onDriveRouteSearched(DriveRouteResult result, int rCode) {  
  314.         dissmissProgressDialog();  
  315.         if (rCode == 0) {  
  316.             if (result != null && result.getPaths() != null && result.getPaths().size() > 0) {  
  317.                 driveRouteResult = result;  
  318.                 DrivePath drivePath = driveRouteResult.getPaths().get(0);  
  319.                 aMap.clear();// 清理地圖上的所有覆蓋物  
  320.                 DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay(this, aMap, drivePath, driveRouteResult.getStartPos(),  
  321.                         driveRouteResult.getTargetPos());  
  322.                 drivingRouteOverlay.removeFromMap();  
  323.                 drivingRouteOverlay.addToMap();  
  324.                 drivingRouteOverlay.zoomToSpan();  
  325.             } else {  
  326.                 ToastUtil.show(TraBanCheLineActivity.this, R.string.no_result);  
  327.             }  
  328.         } else if (rCode == 27) {  
  329.             ToastUtil.show(TraBanCheLineActivity.this, R.string.error_network);  
  330.         } else if (rCode == 32) {  
  331.             ToastUtil.show(TraBanCheLineActivity.this, R.string.error_key);  
  332.         } else {  
  333.             ToastUtil.show(TraBanCheLineActivity.this, getString(R.string.error_other) + rCode);  
  334.         }  
  335.     }  
  336.   
  337.     /**  
  338.      * 公交路線查詢回調  
  339.      */  
  340.     @Override  
  341.     public void onBusRouteSearched(BusRouteResult result, int rCode) {  
  342.     }  
  343.   
  344.     /**  
  345.      * 步行路線結果回調  
  346.      */  
  347.     @Override  
  348.     public void onWalkRouteSearched(WalkRouteResult result, int rCode) {  
  349.     }  
  350.   
  351.     public String getSdCacheDir(Context context) {  
  352.         if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {  
  353.             java.io.File fExternalStorageDirectory = Environment.getExternalStorageDirectory();  
  354.             java.io.File autonaviDir = new java.io.File(fExternalStorageDirectory, “amapsdk”);  
  355.             boolean result = false;  
  356.             if (!autonaviDir.exists()) {  
  357.                 result = autonaviDir.mkdir();  
  358.             }  
  359.             java.io.File minimapDir = new java.io.File(autonaviDir, “offlineMap”);  
  360.             if (!minimapDir.exists()) {  
  361.                 result = minimapDir.mkdir();  
  362.             }  
  363.             return minimapDir.toString() + ”/”;  
  364.         } else {  
  365.             return ”“;  
  366.         }  
  367.   
  368.     }  
  369.   
  370.     @Override  
  371.     public void initWidget() {  
  372.         titleTv = (TextView) findViewById(R.id.titleText);  
  373.         titleTv.setText(“班車線路”);  
  374.     }  
  375.   
  376.     @Override  
  377.     public void widgetClick(View v) {  
  378.         // TODO Auto-generated method stub  
  379.   
  380.     }  
  381.   
  382. }  
package com.bm.futuretechcity;

import java.util.ArrayList;
import java.util.List;

import android.app.ProgressDialog;
import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import com.amap.api.maps.AMap;
import com.amap.api.maps.AMap.InfoWindowAdapter;
import com.amap.api.maps.AMap.OnInfoWindowClickListener;
import com.amap.api.maps.AMap.OnMapClickListener;
import com.amap.api.maps.AMap.OnMarkerClickListener;
import com.amap.api.maps.MapView;
import com.amap.api.maps.MapsInitializer;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.overlay.DrivingRouteOverlay;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.geocoder.GeocodeAddress;
import com.amap.api.services.geocoder.GeocodeQuery;
import com.amap.api.services.geocoder.GeocodeResult;
import com.amap.api.services.geocoder.GeocodeSearch;
import com.amap.api.services.geocoder.GeocodeSearch.OnGeocodeSearchListener;
import com.amap.api.services.geocoder.RegeocodeQuery;
import com.amap.api.services.geocoder.RegeocodeResult;
import com.amap.api.services.poisearch.PoiItemDetail;
import com.amap.api.services.poisearch.PoiResult;
import com.amap.api.services.poisearch.PoiSearch.OnPoiSearchListener;
import com.amap.api.services.route.BusRouteResult;
import com.amap.api.services.route.DrivePath;
import com.amap.api.services.route.DriveRouteResult;
import com.amap.api.services.route.RouteSearch;
import com.amap.api.services.route.RouteSearch.DriveRouteQuery;
import com.amap.api.services.route.RouteSearch.OnRouteSearchListener;
import com.amap.api.services.route.WalkRouteResult;
import com.bm.futuretechcity.adapter.ShowBanCheLineAdapter;
import com.bm.futuretechcity.base.BaseActivity;
import com.bm.futuretechcity.bean.ShowBanCheMessage;
import com.bm.futuretechcity.utils.ToastUtil;
import com.bm.futuretechcity.view.HorizontalListView;

/**
 * 班車線路
 * 
 * @author wangxuan
 * 
 */
public class TraBanCheLineActivity extends BaseActivity implements OnGeocodeSearchListener, OnClickListener, OnMarkerClickListener,
        OnMapClickListener, OnInfoWindowClickListener, InfoWindowAdapter, OnPoiSearchListener, OnRouteSearchListener {
    private ProgressDialog progDialog = null;
    private GeocodeSearch geocoderSearch;
    private String addressName;

    private AMap aMap;
    private MapView mapView;

    private int drivingMode = RouteSearch.DrivingDefault;// 駕車默認模式
    private DriveRouteResult driveRouteResult;// 駕車模式查詢結果
    private int routeType = 1;// 1代表公交模式,2代表駕車模式,3代表步行模式
    private LatLonPoint startPoint = new LatLonPoint(34.185642, 108.881905);
    private LatLonPoint endPoint = new LatLonPoint(34.214397, 108.963448);

    private LatLonPoint lat_one = new LatLonPoint(34.215748, 108.891869);
    private LatLonPoint lat_two = new LatLonPoint(34.233685, 108.900635);
    private LatLonPoint lat_three = new LatLonPoint(34.225311, 108.930992);
    private LatLonPoint lat_four = new LatLonPoint(34.224136, 108.955284);

    // 旺座現代城:34.215748,108.891869
    // 亞美大廈:34.233685,108.900635
    // 吉祥村:34.225311,108.930992
    // 陝西歷史博物館:34.224136,108.955284

    private String[] station_name = new String[] { "中興產業園", "旺座現代城", "亞美大廈", "吉祥村", "陝西歷史博物館", "大雁塔" };
    private List<LatLonPoint> list_latLatLonPoints = new ArrayList<LatLonPoint>();

    private RouteSearch routeSearch;
    public ArrayAdapter<String> aAdapter;

    private LatLonPoint start_msg;
    private LatLonPoint end_msg;
    private HorizontalListView show_station_name;

    private List<ShowBanCheMessage> list_showBanCheMessages = new ArrayList<ShowBanCheMessage>();

    /**
     * 頁面標題
     */
    private TextView titleTv;

    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        setContentView(R.layout.activity_tra_ban_che_line);
        initWidget();

        show_station_name = (HorizontalListView) this.findViewById(R.id.show_station_name);


        ShowBanCheMessage showBanCheMessage;
        for(int i=0;i<station_name.length;i++){
            showBanCheMessage = new ShowBanCheMessage();
            showBanCheMessage.setStation_name(station_name[i]);
            list_showBanCheMessages.add(showBanCheMessage);
        }

        ShowBanCheLineAdapter showStationNameAdapter = new ShowBanCheLineAdapter(TraBanCheLineActivity.this, list_showBanCheMessages);
        show_station_name.setAdapter(showStationNameAdapter);

        geocoderSearch = new GeocodeSearch(this);
        geocoderSearch.setOnGeocodeSearchListener(this);

        list_latLatLonPoints.add(lat_one);
        list_latLatLonPoints.add(lat_two);
        list_latLatLonPoints.add(lat_three);
        list_latLatLonPoints.add(lat_four);

        /*
         * 設置離線地圖存儲目錄,在下載離線地圖或初始化地圖設置; 使用過程中可自行設置, 若自行設置了離線地圖存儲的路徑,
         * 則需要在離線地圖下載和使用地圖頁面都進行路徑設置
         */
        // Demo中爲了其他界面可以使用下載的離線地圖,使用默認位置存儲,屏蔽了自定義設置
        MapsInitializer.sdcardDir = getSdCacheDir(this);
        mapView = (MapView) findViewById(R.id.map);
        mapView.onCreate(bundle);// 此方法必須重寫
        init();

        searchRouteResult(startPoint, endPoint);
    }

    /**
     * 初始化AMap對象
     */
    private void init() {
        if (aMap == null) {
            aMap = mapView.getMap();
            registerListener();
        }
        routeSearch = new RouteSearch(this);
        routeSearch.setRouteSearchListener(this);
    }

    /**
     * 響應地理編碼
     */
    public void getLatlon(final String name) {
        GeocodeQuery query = new GeocodeQuery(name, "029");// 第一個參數表示地址,第二個參數表示查詢城市,中文或者中文全拼,citycode、adcode,
        geocoderSearch.getFromLocationNameAsyn(query);// 設置同步地理編碼請求
    }

    /**
     * 響應逆地理編碼
     */
    public void getAddress(final LatLonPoint latLonPoint) {
        RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 200, GeocodeSearch.AMAP);// 第一個參數表示一個Latlng,第二參數表示範圍多少米,第三個參數表示是火系座標系還是GPS原生座標系
        geocoderSearch.getFromLocationAsyn(query);// 設置同步逆地理編碼請求
    }

    /**
     * 地理編碼查詢回調
     */
    @Override
    public void onGeocodeSearched(GeocodeResult result, int rCode) {
        if (rCode == 0) {
            if (result != null && result.getGeocodeAddressList() != null && result.getGeocodeAddressList().size() > 0) {
                GeocodeAddress address = result.getGeocodeAddressList().get(0);
                address.getLatLonPoint();

                // if (flag == 0) {
                // start_msg = address.getLatLonPoint();
                // System.out.println("========start_msg======:"+start_msg);
                // } else {
                // end_msg = address.getLatLonPoint();
                // System.out.println("=======end_msg=======:"+end_msg);
                // }
                //
                // if (start_msg != null && end_msg != null) {
                // searchRouteResult(start_msg, end_msg);
                // }

                addressName = "經緯度值:" + address.getLatLonPoint() + "\n位置描述:" + address.getFormatAddress();
                ToastUtil.show(TraBanCheLineActivity.this, start_msg + "," + end_msg);
            } else {
                ToastUtil.show(TraBanCheLineActivity.this, R.string.no_result);
            }
        } else if (rCode == 27) {
            ToastUtil.show(TraBanCheLineActivity.this, R.string.error_network);
        } else if (rCode == 32) {
            ToastUtil.show(TraBanCheLineActivity.this, R.string.error_key);
        } else {
            ToastUtil.show(TraBanCheLineActivity.this, getString(R.string.error_other) + rCode);
        }
    }

    /**
     * 逆地理編碼回調
     */
    @Override
    public void onRegeocodeSearched(RegeocodeResult result, int rCode) {
        if (rCode == 0) {
            if (result != null && result.getRegeocodeAddress() != null && result.getRegeocodeAddress().getFormatAddress() != null) {
                addressName = result.getRegeocodeAddress().getFormatAddress() + "附近";
                ToastUtil.show(TraBanCheLineActivity.this, addressName);
            } else {
                ToastUtil.show(TraBanCheLineActivity.this, R.string.no_result);
            }
        } else if (rCode == 27) {
            ToastUtil.show(TraBanCheLineActivity.this, R.string.error_network);
        } else if (rCode == 32) {
            ToastUtil.show(TraBanCheLineActivity.this, R.string.error_key);
        } else {
            ToastUtil.show(TraBanCheLineActivity.this, getString(R.string.error_other) + rCode);
        }
    }

    @Override
    public void onInfoWindowClick(Marker marker) {
    }

    @Override
    public boolean onMarkerClick(Marker marker) {
        if (marker.isInfoWindowShown()) {
            marker.hideInfoWindow();
        } else {
            marker.showInfoWindow();
        }
        return false;
    }

    @Override
    public void onMapClick(LatLng latng) {
    }

    @Override
    public View getInfoContents(Marker marker) {
        return null;
    }

    @Override
    public View getInfoWindow(Marker marker) {
        return null;
    }

    /**
     * 註冊監聽
     */
    private void registerListener() {
        aMap.setOnMapClickListener(TraBanCheLineActivity.this);
        aMap.setOnMarkerClickListener(TraBanCheLineActivity.this);
        aMap.setOnInfoWindowClickListener(TraBanCheLineActivity.this);
        aMap.setInfoWindowAdapter(TraBanCheLineActivity.this);
    }

    /**
     * 顯示進度框
     */
    private void showProgressDialog() {
        if (progDialog == null)
            progDialog = new ProgressDialog(this);
        progDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progDialog.setIndeterminate(false);
        progDialog.setCancelable(true);
        progDialog.setMessage("正在搜索");
        progDialog.show();
    }

    /**
     * 隱藏進度框
     */
    private void dissmissProgressDialog() {
        if (progDialog != null) {
            progDialog.dismiss();
        }
    }

    /**
     * 開始搜索路徑規劃方案
     */
    public void searchRouteResult(LatLonPoint startPoint, LatLonPoint endPoint) {
        showProgressDialog();
        final RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(startPoint, endPoint);
        // 駕車路徑規劃
        // 第一個參數表示路徑規劃的起點和終點,第二個參數表示駕車模式,第三個參數表示途經點,第四個參數表示避讓區域,第五個參數表示避讓道路



        DriveRouteQuery query = new DriveRouteQuery(fromAndTo, drivingMode, list_latLatLonPoints, null, "");
        routeSearch.calculateDriveRouteAsyn(query);// 異步路徑規劃駕車模式查詢
    }

    @Override
    public void onPoiItemDetailSearched(PoiItemDetail arg0, int arg1) {

    }

    /**
     * POI搜索結果回調
     */
    @Override
    public void onPoiSearched(PoiResult result, int rCode) {
    }

    /**
     * 駕車結果回調
     */
    @Override
    public void onDriveRouteSearched(DriveRouteResult result, int rCode) {
        dissmissProgressDialog();
        if (rCode == 0) {
            if (result != null && result.getPaths() != null && result.getPaths().size() > 0) {
                driveRouteResult = result;
                DrivePath drivePath = driveRouteResult.getPaths().get(0);
                aMap.clear();// 清理地圖上的所有覆蓋物
                DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay(this, aMap, drivePath, driveRouteResult.getStartPos(),
                        driveRouteResult.getTargetPos());
                drivingRouteOverlay.removeFromMap();
                drivingRouteOverlay.addToMap();
                drivingRouteOverlay.zoomToSpan();
            } else {
                ToastUtil.show(TraBanCheLineActivity.this, R.string.no_result);
            }
        } else if (rCode == 27) {
            ToastUtil.show(TraBanCheLineActivity.this, R.string.error_network);
        } else if (rCode == 32) {
            ToastUtil.show(TraBanCheLineActivity.this, R.string.error_key);
        } else {
            ToastUtil.show(TraBanCheLineActivity.this, getString(R.string.error_other) + rCode);
        }
    }

    /**
     * 公交路線查詢回調
     */
    @Override
    public void onBusRouteSearched(BusRouteResult result, int rCode) {
    }

    /**
     * 步行路線結果回調
     */
    @Override
    public void onWalkRouteSearched(WalkRouteResult result, int rCode) {
    }

    public String getSdCacheDir(Context context) {
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            java.io.File fExternalStorageDirectory = Environment.getExternalStorageDirectory();
            java.io.File autonaviDir = new java.io.File(fExternalStorageDirectory, "amapsdk");
            boolean result = false;
            if (!autonaviDir.exists()) {
                result = autonaviDir.mkdir();
            }
            java.io.File minimapDir = new java.io.File(autonaviDir, "offlineMap");
            if (!minimapDir.exists()) {
                result = minimapDir.mkdir();
            }
            return minimapDir.toString() + "/";
        } else {
            return "";
        }

    }

    @Override
    public void initWidget() {
        titleTv = (TextView) findViewById(R.id.titleText);
        titleTv.setText("班車線路");
    }

    @Override
    public void widgetClick(View v) {
        // TODO Auto-generated method stub

    }

}


說明:

// 第一個參數表示路徑規劃的起點和終點,第二個參數表示駕車模式,第三個參數表示途經點,第四個參數表示避讓區域,第五個參數表示避讓道路

  1. DriveRouteQuery query = new DriveRouteQuery(fromAndTo, drivingMode, list_latLatLonPoints, null, ”“);  
DriveRouteQuery query = new DriveRouteQuery(fromAndTo, drivingMode, list_latLatLonPoints, null, "");

這裏的list_latLatLonPoints就是第三個經過的站點的經緯度數據集合,只要把這個傳遞進去就可以按指定的路線進行規劃了!



四、運行效果





五、有什麼問題可以加


 QQ羣:261742462

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章