1. 程式人生 > >高德地圖自定義路網

高德地圖自定義路網

思路:繪製折線顯示路網資訊
前提:已知線段起終點座標及路況狀態(一般通過顏色區分)
步驟:
1、按指導文件配置,顯示地圖(這裡就不講了)
2、監聽地圖狀態變化,獲取當前地圖狀態(主要是獲取縮放級別,變更線段粗細)

aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() {
            @Override
            public void onCameraChange(CameraPosition cameraPosition) {

            }

            @Override
public void onCameraChangeFinish(CameraPosition cameraPosition) { //todo 通過監聽地圖狀態變化,設定線段粗細 aMap.clear(); addPolylinessoild(cameraPosition.zoom); } });

3、繪製折線,為了儘可能減緩卡頓,建議放在子執行緒裡進行

//繪製一條實線
//TODO 單指滑動地圖時,需要重繪線段,螢幕內線段數量500條尚可,1000條略卡,5000條卡翻
private void addPolylinessoild(final float zoom) { new Thread(new Runnable() { @Override public void run() { for(int i = 0;i<1;i++){ double j = (double)(Math.round(i)/1.0000000); Log.e("j",""+j); aMap.addPolyline((new
PolylineOptions()) .add(new LatLng(30.345176 +j ,120.131177+j), new LatLng(30.092569+j,119.158602+j)) .width(zoom) .color(Color.argb(255, 1, 1, 1))); } } }).start(); }

4、必要情況下可以限制縮放級別

//      //設定最小縮放級別 縮放級別範圍為[3, 20],超出範圍將按最小級別計算
//      aMap.setMinZoomLevel(15);
//      //設定地圖最大縮放級別 縮放級別範圍為[3, 20],超出範圍將按最大級別計算 。
//      aMap.setMaxZoomLevel(20);

5、因為路網資訊會隨時間變化,所以還需要確定一個重新整理間隔時間,這裡可以使用一個定時器Timer

// 定義計時器
// 定義計劃任務,根據引數的不同可以完成以下種類的工作:在固定時間執行某任務,在固定時間開始重複執行某任務,重複時間間隔可控,在延遲多久後執行某任務,在延遲多久後重復執行某任務,重複時間間隔可控
// 獲取當前地圖狀態的縮放級別aMap.getCameraPosition().zoom
Timer = new Timer();
Timer.schedule(new TimerTask() {
    // TimerTask 是個抽象類,實現的是Runable類
    @Override
    public void run() {
        aMap.clear();
        addPolylinessoild(aMap.getCameraPosition().zoom);
    }
}, 0, 5*60*1000);

6、關於繪製大量線段時單指拖動地圖,卡頓滯澀的問題
描述:當前手機螢幕內,繪製並顯示大量線段,單指拖動地圖,卡頓滯澀

原因:在地圖拖動過程中,螢幕內的線段覆蓋物會不停的重繪,以保證與地圖的相對位置不變。當同一時間點螢幕內有大量線段覆蓋物時,不可避免的會影響效能

解決思路1:
限制地圖縮放級別,即保證在地圖縮放到螢幕內最大可視範圍的情況下,繪製的所有線段覆蓋物數量仍不會影響地圖正常使用。從而達到控制螢幕內線段覆蓋物數量的目的,解決當前問題。

適用與不足:
適用線段覆蓋物數量相對較少,且相對比較集中的情況,比如一個城市(一般指繞城高速環線內)的路況。使用體驗可能會差點,且不可擴充套件,只能一塊區域一個標準(不同地方道路密集度不同)。

解決思路2:
對每一條線段覆蓋物增加顯示級別屬性,根據地圖當前的顯示級別Zoom,顯示相應級別及以下的線段覆蓋物(比如:高德地圖顯示級別範圍為3~20,假設線段級別也是3~20,一一對應,當地圖顯示級別為15時,線段覆蓋物顯示級別在3~15之間的可顯示,級別超過15的線段覆蓋物不可顯示)。
甚至於,當地圖級別低到一定值時,對節點進行抽希,即比如由A、B、C三個點構成一段一定角度的折線ABC,當地圖級別低到一定值時,ABC可以近似的看成直線,如果AB段與BC段路況狀態相同,則可以省略B節點,直接生成線段AC表示,這裡應該需要一個演算法吧。

因為螢幕顯示範圍有限,級別越高顯示範圍越小,從而達到控制螢幕內線段覆蓋物數量的目的,解決當前問題。

適用與不足:
適用所有自定義繪製路況線路的情況,但資料量相對較多,畢竟加了個屬性