如何将离线地图的地图发给朋友

您现在的位置: >
安趣为您解答:下载的高德离线地图包怎么用
  问:下载的高德离线地图包怎么用?
  安趣小编回答:
  很多用户朋友都想知道下载的高德地图包怎么用?其实用电脑下载高德地图包可以大大节约手机流量,一般用户都会这么用。下面小编就来详细解答一下下载的高德地图包怎么用。
  问题一:下载完成后是一个压缩包,应该放到哪里?需要解压么?
  安趣小编回答:
  将手机通过数据线连接到电脑。 正确识别后,在&我的电脑&中可以看到手机存储卡,如&可移动磁盘&。
  将之前下载并解压得到的地图数据复制到手机存储卡的&autonavi\mini_mapv2\vmap&目录下,完成离线地图的安装(如有同名文件,选择覆盖即可)。
  问题二:
  官网下载的高德离线地图包怎用不了?我不是下载官网的客户端的。另外,想问iphone高德的地图包在哪里下载?
  最佳答案:
  地图数据安装方法(Android版)
  步骤一
  下载省市区域的地图数据包后,在电脑上解压得到相应区域的地图数据。(注:不同区域的地图数据可能包含一个或多个地图数据文件夹和文件。)
  步骤二
  将手机通过数据线连接到电脑。 正确识别后,在&我的电脑&中可以看到手机存储卡,如&可移动磁盘&。
  步骤三
  将之前下载并解压得到的地图数据复制到手机存储卡的&autonavi\mini_mapv2\vmap&目录下,完成离线地图的安装(如有同名文件,选择覆盖
  即可)。
  问题三:iPhone下载的高德地图包怎么用?怎么安装?
  步骤一
  通过网站下载对应省市区域的地图数据文件包(请不要解压缩zip文件)
  步骤二
  将手机通过数据线连接到电脑。启动iTunes 正确识别后,选择&设备-对应手机-应用程序-文件共享&
  步骤三
  在文件共享内,左侧选择应用程序高德地图,随后在&高德地图的文稿&右下角点击&添加...&在弹出的文件选择窗口内选择之前下载的地图数据文件
  包(可多选),确认完成添加。
  步骤四
  随后在iPhone上启动&高德地图&会对地图数据文件包进行自动的解压和安装。注意通过电脑添加的离线地图数据不会显示在客户端的离线地图列表内。
  随后在iPhone上启动&高德地图&会对地图数据文件包进行自动的解压和安装。注意通过电脑添加的离线地图数据不会显示在客户端的离线地图列表内。
  问题四:城市数据下载后,要解压到哪个文件夹下?
  安趣小编回答:
  城市数据下载,选择需要下载的城市得到不同ZIP压缩包,解压后获取mapdata文件夹, 直接放入autonavidata2c文件夹下。
  注:解压时选中城市zip文件,右键菜单选择&解压到当前文件夹(X)&。
  下面您知道下载后的高德地图包怎么用了吧,希望小编的文章能帮到各位用户朋友们。
相关文章:高德地图包怎么用
图解新闻:
最新攻略:
24小时更新:
热门排行本周本月
推荐文章本周本月trackbacks-0
最近有很多朋友都在问我地图下载的工具,其实这样的工具网上已经很多了,搜一下就能找得到,基本原理都是一样:
1.选择一定的地图范围。
2.选择需要下载的地图源。
3.选择需要下载的等级。
4.开始下载。
只是每一个软件都会有自己的特点,为了满足不同的需求而以。其实地图下载下来后,最主要的目的还是要应用起来,这就需要结合离线地图的平台.
Google Map API V3.8.6(需要的请跟我联系)&的版本我在之前就发布过,有需要的请自己下载。今天更详细的跟大家讲一下这两个步骤如何结合起来。
1.地图的下载
新制作了一个地图下载的工具,界面如下,操作其实已经很简单了,看图就能明白:
目前地图下载工具可以支持Mapabc、谷歌矢量图、谷歌影像图三种图进行下载,如果需要更多的图源,可以跟我联系。
下载完成后,在应用程序的目录下会生成一个maptile目录,这个目录是存放刚才下载的地图数据。
2.加载本地数据
地图数据我们已经下载下来了,我们使用离线版的Google Map API对图片进行加载:
1 &!DOCTYPE html&
4 &meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no" /&
5 &meta http-equiv="content-type" content="text/ charset=UTF-8"/&
6 &link href="mapfiles/css/default.css" rel="stylesheet" type="text/css" /&
7 &title&Google Maps JavaScript API v3 Example: Map Simple&/title&
8 &!--script type="text/javascript" src="/maps/api/js?sensor=false"&&/script--&
9 &script type="text/javascript" src="mapapi3.8.6.js"&&/script&
10 &script type="text/javascript"&
function LocalMapType() {}
LocalMapType.prototype.tileSize = new google.maps.Size(256, 256);
LocalMapType.prototype.maxZoom = 19;
//地图显示最大级别
LocalMapType.prototype.minZoom = 1;
//地图显示最小级别
LocalMapType.prototype.name = "本地数据";
LocalMapType.prototype.alt = "显示本地地图数据";
LocalMapType.prototype.getTile = function(coord, zoom, ownerDocument) {
var img = ownerDocument.createElement("img");
img.style.width = this.tileSize.width + "px";
img.style.height = this.tileSize.height + "px";
//地图存放路径
//谷歌矢量图 maptile/googlemaps/roadmap
//谷歌影像图 maptile/googlemaps/roadmap
//MapABC地图 maptile/mapabc/
var strURL = "maptile/mapabc/";
strURL += zoom + "/" + coord.x + "/" + coord.y + ".PNG";
img.src = strURL;
var localMapType = new LocalMapType();
function initialize() {
var myLatlng = new google.maps.LatLng(39.344, 116.77);
var myOptions = {
center: myLatlng,
streetViewControl: false,
mapTypeControlOptions: {
mapTypeIds: [
google.maps.MapTypeId.ROADMAP,
google.maps.MapTypeId.HYBRID,
google.maps.MapTypeId.SATELLITE,
google.maps.MapTypeId.TERRAIN,
'locaMap' ]
//定义地图类型
var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
map.mapTypes.set('locaMap', localMapType);
//绑定本地地图类型
map.setMapTypeId('locaMap');
//指定显示本地地图
//var markerOptions = new google.maps.MarkerOptions({draggable:true});
var marker = new google.maps.Marker({
position: myLatlng,
draggable:true,
title:"Hello World!"
var infowindow = new Window(
{ content:"latlng:" + marker.getPosition().toString(),
size: new google.maps.Size(50,50)
google.maps.event.addListener(marker, 'click', function() {
infowindow.setContent("latlng:" + marker.getPosition().toUrlValue(6));
infowindow.open(map,marker);
74 &/script&
75 &/head&
76 &body onload="initialize()"&
&div id="map_canvas"&&/div&
78 &/body&
80 &/html&
示例中是加载本地Mapabc的地图,如果需要其它的地图,只需要把路径改一下即可,如果需要布置到服务器的话,改成服务器地址就行。
地图下载工具和离线版本我都打成一个包,并附带了一部分下载的示例数据,解压后直接打开map-simple.html文件,你应该可以看到本地的地图数据,祝你成功!
地图下载目前只是一个测试版,后续可能还会修改,如果你有什么好的想法,也请告诉我。
本程序只用于学习用。
阅读(...) 评论()百度地图怎么把离线地图存储在SD卡?
作者:佚名
字体:[ ] 来源:互联网 时间:05-05 15:57:25
百度地图怎么把离线地图存储在SD卡?那么当自己用手机百度地图的时候,怎么将下载的离线地图包存储位置修改为SD卡存储呢?这样可以少占用一些手机的内部存储空间,,下面分享具体转移教程
很多朋友都在使用百度地图导航,那么当自己用手机百度地图的时候,怎么将下载的离线地图包存储位置修改为SD卡存储呢?这样可以少占用一些手机的内部存储空间,这里小编给大家介绍一下怎么修改离线地图包存储位置为SD卡的方法,希望可以帮助到朋友们参考。
软件名称:百度地图 手机版(支持离线地图) for Android V9.2.0 安卓版软件大小:47.5MB更新时间:
1、打开我们手机安装的百度地图软件。
2、打开百度地图以后点击界面右下角我的按钮。
3、这时候在下方点击设置打开。
4、设置中找到数据存储位置打开。
5、这里可以看到默认的是内置存储卡,这里选择外置存储卡。
6、修改后点击确定,这时候需要等待一会转移数据。
7、成功以后重新启动地图,这样修改存储位置就完成了。
大家感兴趣的内容
12345678910
最近更新的内容模仿百度地图的LBS服务——离线地图篇 Part 2 (v 3.1.1) - 推酷
模仿百度地图的LBS服务——离线地图篇 Part 2 (v 3.1.1)
这一篇blog写的真心不容易,我只想说我这种菜鸟去高仿百度地图去做LBS服务真心有点作死,期间本想放弃,做简单点算了,但不能说服自己。最后通过F6去一行一行的debug( 新手朋友注意这是最好的解决问题的方式没有之一 ),最后成功完成了核心的功能。上一篇blog高仿了百度地图离线地图模块中的“城市列表”部分
,城市实现里“当前城市”、“热门城市”、“全国省市”数据信息的展示,那么本篇blog主要记录的就是如何进行下载了,同样的是高仿百度离线地图的“下载管理”模块。废话不多说,下面就分步骤进行一一介绍了。
二、百度离线地图“下载管理”功能分析
老规矩我们先来看看百度地图离线地图中“下载管理”模块的界面和功能:
通过这上面两幅截图我们分析一下需要做的工作:
1.下载管理分为“正在下载”和“下载完成”两部分,所以整体界面应当分为2个ListView。
2.可以通过进度条实时看到下载任务的进度,下载中可以进行“暂停下载”和“删除”的操作,那么暂停的时候必定也可以执行“开始下载”的操作。具体细节大家可以通过操作百度地图来看。
3.已下载完成的地图提供了“查看地图”和“删除”的功能。
大体上功能就上面提到的这些,具体的细节在下面的代码中再看,下面就按照我的开发顺序来告诉大家先做什么、后做什么、具体怎么做,对于高手来说高仿这个东东可能不算什么,但是对于我来说确实难度挺大,整整两天,吃饭睡觉都在想细节,最终之所以实现了,是因为我首先会理清思路,先考虑我需要做什么并将任务拆分开,然后是这些步骤应当按什么顺序去做,就这样一点一点做,一行一行debug,最终得以完成。所以下面我就列出开发步骤,再逐一说明。
Step 1 初始化
Step 2 编写离线地图事件通知接口及其回调方法中的代码
Step 3 分别编写“正在下载”和“下载完成”的布局以及Adapter
Step 4 编写测试方法,即开始执行下载任务
上面这个说的可能还不够细节,但是没关系,我会在下面通过代码去一一解释清楚。首先来看看初始化,先上代码(注意和上一篇是同一个Activity,所以重复代码就不贴了):
// 已下载的离线地图数据List
private ArrayList&MKOLUpdateElement& isDoingUpdateMapList =
// 正在下载的数据列表(包括下载中、暂停的)
private ArrayList&MKOLUpdateElement& downLoadingMapList = new ArrayList&MKOLUpdateElement&();
// 已下载完成的数据列表
private ArrayList&MKOLUpdateElement& downLoadedMapList = new ArrayList&MKOLUpdateElement&();
// 已下载的离线地图数据Adapter和ListView
private DownLoadingListView downLoadingListV // 正在下载的ListView
private DownLoadingAdapter mDownLoadingAdapter = new DownLoadingAdapter();
private DownLoadedListView downLoadedListV // 下载完成的ListView
private DownLoadedAdapter mDownLoadedAdapter = new DownLoadedAdapter();
上面的是声明部分,关于“正在下载”和“下载完成”同样是两个自定义的ListView去解决事件冲突问题,解决方案和上一篇blog一样,都是重写onMeasure方法。
同样的声明之后应当进行初始化工作,用来初始化之前的下载任务,比如:两个下载任务都下了一半暂停了,这里我们需要在“正在下载”的ListView中显示出来,参照百度地图应包括以下信息:城市名、数据包大小、下载状态、当前的下载进度等。下面这段代码同样位于initData()方法中:
// 初始化已下载的城市列表,并根据已下载和下载中进行分类
isDoingUpdateMapList = mOfflineMap.getAllUpdateInfo();
if (isDoingUpdateMapList == null) {
isDoingUpdateMapList = new ArrayList&MKOLUpdateElement&();
if (isDoingUpdateMapList.size() & 0) {
for (MKOLUpdateElement element : isDoingUpdateMapList) {
// 如果下载进度为100则应放入“已下载”的List
if (element.ratio == 100) {
downLoadedMapList.add(element);
mDownLoadedAdapter = new DownLoadedAdapter();
// 如果下载进入不为100则应放入“正在下载”的List
if (element.ratio != 100) {
downLoadingMapList.add(element);
mDownLoadingAdapter = new DownLoadingAdapter();
第2行的 getAllUpdateInfo() 方法很好用,是这个下载模块的核心方法,官方的解释是: 返回各城市离线地图更新信息 。对于这个解释我是觉得很笼统,不明白,通过我的使用我认为这个方法的作用就是: 返回当前已下载的(包括开始下载的、暂停的、正在下载的以及完成的)的所有数据信息,并且是以城市为单位的List集合 。根据官方文档可以看出返回值类型是 MKOLUpdateElement ,这个类也正式封装了一个下载任务应有的所有关键信息,而在上面的代码中我正是通过element.ratio来分割List,因为ratio正是下载进度的意思:
所以当ratio为100的时候,我就将这个对象放到“下载完成”的ListView,否则说明还没下载完,就放到“正在下载”的ListView。这样我们就可以在进入应用之后看到之前未完成的、已完成的下载记录了。OK,初始化很简单,结束了。
初始化完成之后,现在就来说道说道离线地图中唯一的一个监听:
public interface MKOfflineMapListener
同样的来看看官方文档中对它的解释:
离线地图事件通知接口。该接口返回新安装离线地图、下载更新、数据版本更新等结果,用户需要实现该接口以处理相应事件。
不知道是不是我书读的少,总觉得官方的解释不够通俗,看了依然不知道怎么用。但是官方对这个接口的回调方法还是解释的比较清楚的:
void onGetOfflineMapState(int type,int state)
type - 事件类型: MKOfflineMap.TYPE_NEW_OFFLINE, MKOfflineMap.TYPE_DOWNLOAD_UPDATE, MKOfflineMap.TYPE_VER_UPDATE.
state - 事件状态: 当type为TYPE_NEW_OFFLINE时,表示新安装的离线地图数目. 当type为TYPE_DOWNLOAD_UPDATE时,表示更新的城市ID.
上面的蓝色字体都是官方文档的原话,这里我们也清楚了这个回调方法的两个参数都表示什么意思了。根据需求,我们需要实时监控下载进度并反馈到UI,所以这里我们只需要关注 TYPE_DOWNLOAD_UPDATE 这个类型的事件即可,而正好此时的state就表示更新城市的ID,那么这个监听的作用就很明显了,就是 通过它来实时获取下载进度并更新我们界面上的ProgressBar即可 。可能有些人不清楚什么时候会触发这个监听,那么通过打印语句来观察控制台不难发现,当type为
TYPE_DOWNLOAD_UPDATE
时,只要下载状态发生变化,即会触发监听。文字解释比较费劲,下面我贴上监听代码,大家可以开启一个下载任务(后面说),并像第9行一样通过打印来观察一下都有什么变化:
mOfflineMap.init(new MKOfflineMapListener() {
public void onGetOfflineMapState(int type, int state) {
// TODO Auto-generated method stub
switch (type) {
case MKOfflineMap.TYPE_DOWNLOAD_UPDATE:
// 得到当前正在下载的城市的具体更新信息
MKOLUpdateElement update = mOfflineMap.getUpdateInfo(state);
Log.e(TAG, update.cityName + & ,& + update.ratio);
if (update != null) {
// 此监听器在下载任务进行期间大概每下载1%触发一次,注意是大概
List&MKOLUpdateElement& elements = downLoadingMapL
for (MKOLUpdateElement element : elements) {
if (update.cityID == element.cityID) {
element.ratio = update.
if (update.ratio == 100) {
// 当下载进度到100时,Item从“下载中”的List移动到“已下载的List”
downLoadingMapList.remove(element);
downLoadedMapList.add(element);
mDownLoadedAdapter.notifyDataSetChanged();
mDownLoadingAdapter.notifyDataSetChanged();
case MKOfflineMap.TYPE_NEW_OFFLINE:
// 有新离线地图安装
Log.e(TAG, &TYPE_NEW_OFFLINE&);
case MKOfflineMap.TYPE_VER_UPDATE:
// 版本更新提示
相信认真看了代码的朋友肯定也大致明白了个123吧,有问题可以留言,虽然我是新手,可我自己写的东西还是解释的清的。
下面就是最重要的适配器了,我们来分别看看“下载中”的Adapter和“下载完成”的Adapter:
// 下载管理——正在下载——适配器
class DownLoadingAdapter extends BaseAdapter {
public int getCount() {
// TODO Auto-generated method stub
return downLoadingMapList.size();
public Object getItem(int position) {
// TODO Auto-generated method stub
return downLoadingMapList.get(position);
public long getItemId(int position) {
// TODO Auto-generated method stub
public View getView(final int position, View convertView,
ViewGroup parent) {
// TODO Auto-generated method stub
final MKOLUpdateElement element = downLoadingMapList.get(position);
ViewHolder holder =
if (convertView == null) {
convertView = mInflater.inflate(R.layout.down_loading_item,
holder = new ViewHolder();
holder.cityName = (TextView) convertView
.findViewById(R.id.id_city_name);
holder.dataPakSize = (TextView) convertView
.findViewById(R.id.id_data_size);
holder.downLoadState = (TextView) convertView
.findViewById(R.id.id_down_state);
holder.downLoadRatio = (TextView) convertView
.findViewById(R.id.id_down_raito);
holder.downLoadProgress = (ProgressBar) convertView
.findViewById(R.id.id_down_progress);
holder.downPullIcon = (ImageButton) convertView
.findViewById(R.id.id_expand_down_icon);
holder.upPullIcon = (ImageButton) convertView
.findViewById(R.id.id_expand_up_icon);
holder.pauseDownBtn = (Button) convertView
.findViewById(R.id.id_pause_down_btn);
holder.startDownBtn = (Button) convertView
.findViewById(R.id.id_start_down_btn);
holder.deleteMapBtn = (Button) convertView
.findViewById(R.id.id_delete_map);
holder.btnGroup = (LinearLayout) convertView
.findViewById(R.id.id_btn_group);
convertView.setTag(holder);
holder = (ViewHolder) convertView.getTag();
holder.cityName.setText(element.cityName);
holder.dataPakSize.setText(NumberFormatUtil
.dataSizeFormatter(element.serversize) + &M&);
String stateInfo = &&;
// 如果是正在下载的状态
if (element.status == MKOLUpdateElement.DOWNLOADING) {
stateInfo = &正在下载&;
holder.startDownBtn.setVisibility(View.GONE);
holder.pauseDownBtn.setVisibility(View.VISIBLE);
holder.downLoadState.setTextColor(Color.BLUE);
//如果是暂停的状态
if (element.status == MKOLUpdateElement.SUSPENDED) {
stateInfo = &已暂停&;
holder.downLoadState.setTextColor(Color.RED);
holder.startDownBtn.setVisibility(View.VISIBLE);
holder.pauseDownBtn.setVisibility(View.GONE);
holder.downLoadState.setText(stateInfo);
//设置当前进度的百分数
holder.downLoadRatio.setText(element.ratio + &%&);
//设置ProgressBar的进度
holder.downLoadProgress.setProgress(element.ratio);
// 暂停下载
holder.pauseDownBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
int cityId = element.cityID;
mOfflineMap.pause(cityId);
Toast.makeText(OfflineActitivty.this,
&暂停下载& + element.cityName + &离线地图:&,
Toast.LENGTH_SHORT).show();
isDoingUpdateMapList = mOfflineMap.getAllUpdateInfo();
if (isDoingUpdateMapList == null) {
isDoingUpdateMapList = new ArrayList&MKOLUpdateElement&();
if (isDoingUpdateMapList.size() & 0) {
downLoadingMapList.clear();
for (MKOLUpdateElement element : isDoingUpdateMapList) {
if (element.ratio != 100) {
downLoadingMapList.add(element);
mDownLoadingAdapter.notifyDataSetChanged();
// 开始下载
holder.startDownBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
int cityId = element.cityID;
mOfflineMap.start(cityId);
Toast.makeText(OfflineActitivty.this,
&开始下载& + element.cityName + &离线地图:&,
Toast.LENGTH_SHORT).show();
isDoingUpdateMapList = mOfflineMap.getAllUpdateInfo();
if (isDoingUpdateMapList == null) {
isDoingUpdateMapList = new ArrayList&MKOLUpdateElement&();
if (isDoingUpdateMapList.size() & 0) {
downLoadingMapList.clear();
for (MKOLUpdateElement element : isDoingUpdateMapList) {
if (element.ratio != 100) {
downLoadingMapList.add(element);
mDownLoadingAdapter.notifyDataSetChanged();
mDownLoadedAdapter.notifyDataSetChanged();
// 删除地图
holder.deleteMapBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
int cityId = element.cityID;
mOfflineMap.remove(cityId);
Toast.makeText(OfflineActitivty.this,
&已删除& + element.cityName + &离线地图:&,
Toast.LENGTH_SHORT).show();
downLoadingMapList.remove(position);
mDownLoadingAdapter.notifyDataSetChanged();
return convertV
private class ViewHolder {
TextView cityN
TextView dataPakS
TextView downLoadS
TextView downLoadR
ProgressBar downLoadP
ImageButton downPullI
ImageButton upPullI
Button pauseDownB
Button startDownB
Button deleteMapB
LinearLayout btnG
// 下载管理——已下载——适配器
class DownLoadedAdapter extends BaseAdapter {
public int getCount() {
// TODO Auto-generated method stub
return downLoadedMapList.size();
public Object getItem(int position) {
// TODO Auto-generated method stub
return downLoadedMapList.get(position);
public long getItemId(int position) {
// TODO Auto-generated method stub
public View getView(final int position, View convertView,
ViewGroup parent) {
// TODO Auto-generated method stub
final MKOLUpdateElement element = downLoadedMapList.get(position);
ViewHolder holder =
if (convertView == null) {
convertView = mInflater
.inflate(R.layout.down_loaded_item, null);
holder = new ViewHolder();
holder.cityName = (TextView) convertView
.findViewById(R.id.id_city_name);
holder.isHasNewData = (TextView) convertView
.findViewById(R.id.id_is_has_new);
holder.dataPakSize = (TextView) convertView
.findViewById(R.id.id_data_pak_size);
holder.deleteMapBtn = (Button) convertView
.findViewById(R.id.id_btn_delete_map);
holder.seeMapDetailBtn = (Button) convertView
.findViewById(R.id.id_see_map_detail);
convertView.setTag(holder);
holder = (ViewHolder) convertView.getTag();
holder.cityName.setText(element.cityName);
holder.dataPakSize.setText(NumberFormatUtil
.dataSizeFormatter(element.serversize) + &M&);
// 删除地图
holder.deleteMapBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
// 删除已下载的离线Map
int cityId = element.cityID;
mOfflineMap.remove(cityId);
Toast.makeText(OfflineActitivty.this,
&已删除& + element.cityName + &离线地图:&,
Toast.LENGTH_SHORT).show();
downLoadedMapList.remove(position);
mDownLoadedAdapter.notifyDataSetChanged();
// 查看地图
holder.seeMapDetailBtn
.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.putExtra(&x&, element.geoPt.longitude);
intent.putExtra(&y&, element.geoPt.latitude);
intent.setClass(OfflineActitivty.this,
BaseMapActivity.class);
startActivity(intent);
return convertV
private class ViewHolder {
private TextView cityN
private TextView isHasNewD
private TextView dataPakS
private Button deleteMapB
private Button seeMapDetailB
可以看到由于“下载中”有开始和暂停两个按钮,所以比“下载完成”略微麻烦一些,而下载完成之后即可以查看地图,即根据经纬坐标去加载改城市的地图,代码很简单就是官方Demo中的那个BaseMapActivity。item的布局也很简单,模仿百度地图的样式拼凑一下就好了,后面会贴上动态效果图,其实到这里离线地图模块的核心功能都已完成,最后看看如何通过点击Item去开启一个下载任务吧。
通过上面的三个步骤就已经完成了离线地图的所有准备工作了,下面只剩下点击列表项开启下载任务了,依然是参考百度地图,简单的流程是这样的:
点击任意列表中的任意项(包括热门城市的ListView、全国省市的ExpandableListView的子项),如果被点击的城市没有下载,那么新开一个下载任务在“正在下载”的列表,如果被点击的城市“正在下载”或“已暂停”,那么只需用切换到“下载管理列表”即可,最后如果被点击的城市“已下载完成”,那么同样的只是切换一下即可。
下面贴上剩余全部代码,包括初始化ListView以及添加Item点击:
// 初始化ListView
private void initListView() {
// 热门城市
hotCitieslistView = (HotCitiesListView) findViewById(R.id.id_hotcities_lv);
mHotCityAdapter = new HotCityAdapter();
hotCitieslistView.setAdapter(mHotCityAdapter);
// 全国省市
allCitieslistView = (NationalCitiesListView) findViewById(R.id.id_allcities_exp_lv);
mNationalCityAdapter = new NationalCityAdapter();
allCitieslistView.setAdapter(mNationalCityAdapter);
// 下载管理——下载中
downLoadingListView = (DownLoadingListView) findViewById(R.id.id_download_manager_lv);
downLoadingListView.setAdapter(mDownLoadingAdapter);
// 下载管理——下载完成
downLoadedListView = (DownLoadedListView) findViewById(R.id.id_download_manager_lv_2);
downLoadedListView.setAdapter(mDownLoadedAdapter);
// 设置热门城市的Item点击事件
hotCitieslistView
.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView&?& parent, View view,
int position, long id) {
// // TODO Auto-generated method stub
OfflineMapItemBean offlineMapItemBean = mHotCityDatas
.get(position);
int cityId = offlineMapItemBean.getCityId();
String cityName = offlineMapItemBean.getCityName();
MKOLUpdateElement element = mOfflineMap
.getUpdateInfo(cityId);
// 如果进度为0,则下载。否则仅仅切换过去
if (element == null) {
// 开始下载
mOfflineMap.start(cityId);
offlineMapItemBean
.setDownloadStatus(DownLoadStatus.DOWNLOADING);
// 切换到下载管理
tb.setChecked(false);
llayout1.setVisibility(View.VISIBLE);
llayout2.setVisibility(View.GONE);
Toast.makeText(OfflineActitivty.this,
&开始下载& + cityName + &离线地图&,
Toast.LENGTH_SHORT).show();
// 更新界面显示
isDoingUpdateMapList = mOfflineMap
.getAllUpdateInfo();
if (isDoingUpdateMapList == null) {
isDoingUpdateMapList = new ArrayList&MKOLUpdateElement&();
// 现在就有更新信息了
element = mOfflineMap.getUpdateInfo(cityId);
downLoadingMapList.add(element);
mDownLoadingAdapter.notifyDataSetChanged();
mHotCityAdapter.notifyDataSetChanged();
// 仅仅跳转
// 切换到下载管理
tb.setChecked(false);
llayout1.setVisibility(View.VISIBLE);
llayout2.setVisibility(View.GONE);
// 设置全国省市的Item点击事件
allCitieslistView.setOnChildClickListener(new OnChildClickListener() {
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
OfflineMapItemBean offlineMapItemBean = allCityDatas
.get(groupPosition).getChildCities().get(childPosition);
int cityId = offlineMapItemBean.getCityId();
String cityName = offlineMapItemBean.getCityName();
// Toast.makeText(OfflineActitivty.this, cityId+&,&+cityName,
// Toast.LENGTH_SHORT).show();
MKOLUpdateElement element = mOfflineMap.getUpdateInfo(cityId);
// 如果进度为0,则下载。否则仅仅切换过去
if (element == null) {
// 开始下载
mOfflineMap.start(cityId);
offlineMapItemBean
.setDownloadStatus(DownLoadStatus.DOWNLOADING);
// 切换到下载管理
tb.setChecked(false);
llayout1.setVisibility(View.VISIBLE);
llayout2.setVisibility(View.GONE);
Toast.makeText(OfflineActitivty.this,
&开始下载& + cityName + &离线地图:&, Toast.LENGTH_SHORT)
// 更新界面显示
isDoingUpdateMapList = mOfflineMap.getAllUpdateInfo();
if (isDoingUpdateMapList == null) {
isDoingUpdateMapList = new ArrayList&MKOLUpdateElement&();
// 现在就有更新信息了
element = mOfflineMap.getUpdateInfo(cityId);
downLoadingMapList.add(element);
mDownLoadingAdapter.notifyDataSetChanged();
mHotCityAdapter.notifyDataSetChanged();
// 仅仅跳转
// 切换到下载管理
tb.setChecked(false);
llayout1.setVisibility(View.VISIBLE);
llayout2.setVisibility(View.GONE);
最后做一些说明,包括我
整体代码的不足和重点需要注意的地方
1.肯定有的朋友发现我在写“热门城市”的列表的时候还通过自定义的OfflineMapItemBean对数据进行了封装,在后面做“下载列表”的时候压根就没有再封装了,而是直接用SDK中的MKOLUpdateElement对象去取值了。这块是我做的不好,因为下载列表要拆分成“正在下载”和“已完成”两部分,每次获取更新对象再遍历拆分感觉也不是个办法,所以干脆就不封装了,我也没有想到更好的办法去处理,有更好的方法的朋友可以给我指点一二。
2.当ScrollView嵌套ListView之后item的点击事件是失效的,包括ExpandableListView的子item也是一样。对于这个我选择了在item的布局文件中添加一个属性: android:descendantFocusability=&blocksDescendants& 来解决的,但这不是个好办法,据说会让ViewHolder失效,问了其他朋友说是让ScrollView中的onTouch返回false之类的,我尝试了没有达到预期效果,如果哪位大神知道最优的解决方案还请给小弟指点一二,感激不尽。
3.由于项目周期紧,还有很多小效果没来得及实现,比如:下载状态(已暂停、已完成等)应当在“下载管理”和“城市列表”中能实时的同步的更新等,但是总体上看效果还是挺不错的吧,下面就贴上效果图:
由于在模拟器上调试时无法开始下载( offlineMap.start方法调用之后MKOLUpdateElement返回的更新对象的status始终是WAITING的状态,而在真机调试时调用start之后更新对象的status会立刻变成DOWNING,模拟器的网络也没有问题,不知道是不是BUG ),所以这里只贴上两张真机运行截图好了,UI比较粗糙,但是核心功能都没问题,到了这里离线地图的全部内容就已经算是记录完毕了。
写到这里关于我们项目中的LBS服务就已经全部介绍完毕了,在做地图模块的同时学到了许多新的东西,在这里也要感谢鸿洋大神对我的帮助,目前准备和同事一起再做一个以LBS为主的APP,等做好之后可能还会写一个博客吧,这个APP的点子不错,目前暂且先不透漏,透漏了也没几个人会看到,哈哈。路漫漫其修远兮,吾将上下而求索,我的Android之路才刚刚开始,今后还应当更加努力!加油!Raito!
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
没有分页内容
图片无法显示
视频无法显示
与原文不一致

我要回帖

更多关于 高德地图离线包下载 的文章

 

随机推荐