大型情感類電視連續劇--Android高德之旅(2)地圖類型

總要說兩句

今天繼續我們的Android高德之旅,上一篇已經可以顯示最基本的地圖了,有基本的放大縮小功能,還有最後做的點擊3D旋轉、傾斜視角的效果,今天這篇文章來記錄一下高德地圖的5種地圖類型。
(其實是4種類型,加上離線地圖)

5種地圖類型分別是:

  • 常規地圖模式(又稱行政地圖模式)
  • 衛星地圖模式
  • 導航地圖模式
  • 夜間地圖模式
  • 離線地圖模式(我是混進來的充數的)

這5種地圖模式在不同的場景下使用,各有好處。普通模式是默認的模式,展示地名、交通主幹道、簡單的地形、河流等,用的也是最多的;導航模式會突出顯示交通線路,而降低把其它屬性,常規模式下顯示的部分地名會忽略掉,顯示一些重要的地名;夜間模式不用說了,就是夜間護眼的,採用的是暗色調,低對比度,從而減少對眼鏡的傷害;衛星模式展示的不再是電腦模擬圖,而是真實的衛星拍攝的照片,衛星把全中國的土地都拍成一張張照片,然後經過很碉堡的處理,拼接成無縫銜接的地圖,放大後可以看到真實的樓房、道路、地貌、甚至汽車、行人,玩過Google地圖的都知道,在歐洲一些空氣質量很好的地方(比如巴黎),衛星模式展示的畫面不要太美。

至於離線地圖模式,這並不是展示模式,而是把地圖數據包下載到本地,然後就可以在網絡不佳的時候使用,比如室內。

說到這,肯定有人忍不住了,3D街景模式呢?這種模式是高級模式,而且並不是所有地方都有街景素材(在電腦上玩過的都知道,事實上只有較少的地方可以使用3D街景),所以我們今天先不管。

好了,下面開始記錄一下使用方法,筒子們,老司機要開車了,上車吧。

開車

1、普通模式

這也是默認模式,也可以手動設置

AMap aMap = mapView.getMap();
aMap.setMapType(AMap.MAP_TYPE_NORMAL);

這裏寫圖片描述

2、導航模式

AMap aMap = mapView.getMap();
aMap.setMapType(AMap.MAP_TYPE_NAVI);

這裏寫圖片描述

3、夜間模式

我在調試時偶現過一次夜間模式沒有加載出來,顯示一片黑,不知道是不是高德的bug

AMap aMap = mapView.getMap();
aMap.setMapType(AMap.MAP_TYPE_NIGHT);

這裏寫圖片描述

4、衛星模式

AMap aMap = mapView.getMap();
aMap.setMapType(AMap.MAP_TYPE_SATELLITE);

這裏寫圖片描述

是不是太簡單了,都是一句話設置完事。

今天這篇博客是不是太水了,博主太不負責任了。別急別急,還好有個離線地圖,來幫我撐撐場面。

5、離線地圖模式

離線地圖並不是新的展示模式,而是把地圖數據包下載到本地,加載地圖時就不需要再從網絡下載。事實上,高德地圖在加載地圖時都是優先加載本地離線數據的,本地沒有才從網絡下載。所以離線模式其實就是一系列的api調用。

(1)新建下載管理器

OfflineMapManager manager = new OfflineMapManager(Context, OfflineMapDownloadListener);

第二個參數OfflineMapDownloadListener是下載監聽器,用於下載狀態的回調。

@Override
public void onDownload(int status, int completeCode, String downName) {
    switch (status) {
        case OfflineMapStatus.SUCCESS:
            //下載成功
            break;
        case OfflineMapStatus.LOADING:
            //加載中
            break;
        case OfflineMapStatus.UNZIP:
            //解壓
            break;
        case OfflineMapStatus.WAITING:
            //等待下載
            break;
        case OfflineMapStatus.PAUSE:
            //暫停
            break;
        case OfflineMapStatus.STOP:
            //停止
            break;
        case OfflineMapStatus.ERROR:
            //錯誤
            break;
        case OfflineMapStatus.EXCEPTION_AMAP:
            //地圖異常
            break;
        case OfflineMapStatus.EXCEPTION_NETWORK_LOADING:
            //網絡加載錯誤
            break;
        case OfflineMapStatus.EXCEPTION_SDCARD:
            //SD存儲錯誤
            break;
        default:
            break;
    }
}

@Override
public void onCheckUpdate(boolean hasNew, String name) {
    //update時回調
}

@Override
public void onRemove(boolean success, String name, String describe) {
    //delete離線包時回調
}

有了這些回調,就可以輕鬆的知道所有下載任務的狀態了,太棒了!

(2)開始下載

offlineManager.downloadByCityCode(cityCode);//根據城市code
offlineManager.downloadByCityName(cityName);//根據城市名
offlineManager.downloadByProvinceName(provinceName);//根據省份名

ps:這裏城市名和省份名要寫完整,帶“市”、“省”,如:南京市、江蘇省

(3)暫停下載

offlineManager.pause();

(4)停止下載

offlineManager.stop();

(5)更改下載存儲路徑

MapsInitializer.sdcardDir = "/sdcard/xx/xx/";

(6)更新離線地圖

offlineManager.updateOfflineCityByCode(cityCode);
offlineManager.updateOfflineCityByName(cityName);
offlineManager.updateOfflineMapProvinceByName(provinceName);

(7)刪除離線地圖

offlineManager.remove(cityName);

方便的api
此外,高德還提供了一些api用戶獲取城市列表、省份列表的。

(8)獲取全國城市列表

ArrayList<OfflineMapCity> cities = offlineManager.getOfflineMapCityList();

(9)獲取全國省份列表

ArrayList<OfflineMapProvince> provinces = offlineManager.getOfflineMapProvinceList();

(10)獲取已下載的城市列表

ArrayList<OfflineMapCity> cities = offlineManager.getDownloadOfflineMapCityList();

(11)獲取已下載的省份列表

ArrayList<OfflineMapProvince> provinces = offlineManager.getDownloadOfflineMapProvinceList();

(12)獲取下載中和待下載的城市列表

ArrayList<OfflineMapCity> cities = offlineManager.getDownloadingCityList();

(13)獲取下載中和待下載的省份列表

ArrayList<OfflineMapProvince> provinces = offlineManager.getDownloadingProvinceList();

根據城市名查詢城市編碼

有了上面的api,我們就可以實現根據城市名稱,查詢出城市編碼,用於以後的下載管理操作,下面是我寫的一個實現,可能效率並不高。

public int getCityCodeByCityName(String provinceName, String cityName) {
    if(TextUtils.isEmpty(provinceName)) {
        toast("省份名不能爲空");
        return;
    }
    if(TextUtils.isEmpty(cityName)) {
        toast("城市名不能爲空");
        return;
    }

    OfflineMapProvince findProvince = null;
    for (OfflineMapProvince province : offlineMapProvinceList) {
        if(provinceName.equals(province.getProvinceName())) {
            findProvince = province;
            break;
        }
    }
    if(findProvince == null) {
        toast("省份不存在");
        return;
    }

    OfflineMapCity findCity = null;
    ArrayList<OfflineMapCity> cityList = findProvince.getCityList();
    for (OfflineMapCity city : cityList) {
        if(cityName.equals(city.getCity())) {
            findCity = city;
            break;
        }
    }
    if(findCity == null) {
        toast("城市不存在");
        return;
    }

    return findCity.getCode();
}

完成

好了,今天要記錄的就是這些,下篇博客會講到UISetting。

本期節目就到這裏,感謝大家的收看,我們下期再見~

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