總要說兩句
今天繼續我們的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。
本期節目就到這裏,感謝大家的收看,我們下期再見~