1. 第一次运行:
读取下载任务参数:ConnectionString、图片 Url、下载的切片保存到数据库而不存为独立的文件,不更新已有的切片数据。
设置地图范围和下载线程,如图:下载从 13 ~ 17 级放大尺度的指定范围,每级放大尺度将有 100 个下载线程(10 * 10)。
2. 开始下载任务:
判断本地(数据库或切片文件)是否存指定的切片,若有就跳过,否则下载切片。
若地图切片为空白区域,则不保存到数据库。
若当前切片下载失败,则记录其 Url。
在此期间,将 gif 格式 转换为 png 格式。
3. 停止下载任务:
100 个下载线程逐一停止,并将每个线程的下载进度保存起来。
重新下载之前下载失败的图片。
4. 再次运行下载任务:
选择继续上次的下载任务还是新建下载任务。
5. 测试:
如下图,在 13 级放大尺度下已有部分图片,空白处还没有完成下载。
存在的问题:
这个程序将会按照 x、y、zoom 的连续递增下载图片,而在选定的区域内总共包括 322586000 个图片(包括空白图片),平均每秒下载 10 张图片,也需要连续下载约 374 天!
实际上,地图在上一级的放大尺度中,若某区域为空白,则下面几级都为空白,只要记住这些空白范围,在下面几级跳过的空白切片数量将是非常可观的,估计在较短的时间内就能完成所有的下载任务,比如一个月。
------------------------------------------------------------------------------------------------------------
程序改进:
根据前面的思路,程序采用递归算法,判断当前切片是否为空白,不为空白就继续深入当前区域的下一级放大尺度执行下载任务,否则跳过。
新增最大线程设置,检查当前下载线程数,如果大于 maxThreads 则在同一线程递归下载,小于 maxThreads 就启用新线程递归下载:
经过 15 小时的下载,如图:
以 "Sub_" 开头的就是动态产生的下载线程。
另外,由于采用递归,不能准确的保存当前的下载进度。