废话
今天继续我们的Android高德之旅,上一篇已经可以显示最基本的地图了,有基本的缩放、旋转功能,还有最后做的小特效,今天这篇文章来记录一下高德地图的5种地图类型。
5种地图类型:
- 常规地图模式(默认模式,又称行政地图模式,展示基本信息)
- 卫星地图模式(展示卫星拍摄图,图片质量和当地空气质量相关)
- 导航地图模式(突出显示交通线路,忽略一些不重要的信息)
- 夜间地图模式(暗色调,低对比度以保护视力)
- 离线地图模式(别打我,我是混进来充数的)
说明
其实按照高德地图官方的说法,我们不称之为地图模式,而是地图图层,每个图层负责绘制一种属性,很多个图层叠加起来,构成完整的地图,我们在不同场景下,选择性地隐藏、显示某些图层,从而实现了不同的显示效果。
至于离线地图模式,并不是图层的概念,而是把地图数据包下载到本地,然后在没有网络的时候使用本地数据。
说到这,肯定有人忍不住了,3D街景模式呢?这种模式是高级模式,而且并不是所有地方都有街景素材(在电脑上玩过的都知道,事实上只有很少的地方可以使用3D街景),所以我们暂且忽略。
1、普通模式
这是默认模式,也可以手动设置
AMap aMap = mapView.getMap();
aMap.setMapType(AMap.MAP_TYPE_NORMAL);
2、卫星模式
AMap aMap = mapView.getMap();
aMap.setMapType(AMap.MAP_TYPE_SATELLITE);
3、夜间模式
我在调试时偶现过一次夜间模式没有加载出来,显示一片黑,不知道是不是高德的bug
AMap aMap = mapView.getMap();
aMap.setMapType(AMap.MAP_TYPE_NIGHT);
4、导航模式
导航模式里面有三个可选项:traffix、building、mapText
AMap aMap = mapView.getMap();
aMap.setMapType(AMap.MAP_TYPE_NAVI);
// aMap.setTrafficEnabled(true);
// aMap.showBuildings(true);
// aMap.showMapText(true);
说完了四个模式,貌似内容有点少,别急别急,还好有个离线地图,来帮我撑撑场面。
5、离线地图模式
前面说了,离线地图并不是地图展示模式,而是把地图数据包下载到本地,在没有网络时使用本地数据进行展示。事实上,高德地图在加载地图时都是优先加载本地离线数据的,本地没有才从网络下载。
(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。
本期节目就到这里,感谢大家的收看,我们下期再见~