public void Start(RectLatLng __area, int __zoom, GMapProvider __provider, int __sleep, int __retry) { if (!worker.IsBusy) { this.label1.Text = "..."; this.progressBarDownload.Value = 0; this.area = __area; this.zoom = __zoom; this.provider = __provider; this.sleep = __sleep; this.retry = __retry; GMaps.Instance.UseMemoryCache = false; GMaps.Instance.CacheOnIdleRead = false; GMaps.Instance.BoostCacheEngine = true; if (Overlay != null) { Overlay.Markers.Clear(); } db.打开数据库(); worker.RunWorkerAsync(); this.ShowDialog(); } }
public void 开始(RectLatLng __下载区域, int __最小层级, int __最大层级, int __线程数 = 8) { int __最大重试次数 = 3; if (!载中) { 载中 = true; GMaps.Instance.UseMemoryCache = false; var __总数 = 0; int __成功下载数 = 0; int __失败下载数 = 0; for (int i = __最小层级; i <= __最大层级; i++) { __总数 += _地图提供者.Projection.GetAreaTileList(__下载区域, i, 0).Count; } _存储.打开数据库(); for (int k = __最小层级; k <= __最大层级; k++) { if (!载中) { break; } var __当前层级 = k; var __下载列表 = _地图提供者.Projection.GetAreaTileList(__下载区域, __当前层级, 0); var __当前层级总数 = __下载列表.Count; var __maxTile = _地图提供者.Projection.GetTileMatrixMaxXY(__当前层级); var __任务列表 = new List <Task>(); for (int j = 0; j < __线程数; j++) { var __线程标识 = j; __任务列表.Add(Task.Factory.StartNew(() => { int __已重试次数 = 0; for (int i = __线程标识; i < __当前层级总数; i = i + __线程数) { if (!载中) { break; } GPoint __位置 = __下载列表[i]; try { if (_地图提供者.Overlays != null && _地图提供者.Overlays.Length > 1) { var __图片列表 = new List <Bitmap>(); foreach (var __提供者 in _地图提供者.Overlays) { var __图片 = __提供者.GetTileImage(__提供者.InvertedAxisY ? new GPoint(__位置.X, __maxTile.Height - __位置.Y) : __位置, __当前层级); __图片列表.Add(new Bitmap(__图片.Data)); } var __合成图片 = 混合(__图片列表); MemoryStream __数据 = new MemoryStream(); __合成图片.Save(__数据, System.Drawing.Imaging.ImageFormat.Png); this._存储.保存(__数据.GetBuffer(), __位置, __当前层级); __合成图片.Dispose(); } else { var __图片 = _地图提供者.GetTileImage(_地图提供者.InvertedAxisY ? new GPoint(__位置.X, __maxTile.Height - __位置.Y) : __位置, __当前层级); this._存储.保存(__图片.Data.GetBuffer(), __位置, __当前层级); __图片.Dispose(); } __成功下载数++; __已重试次数 = 0; } catch (Exception ex) { if (++__已重试次数 <= __最大重试次数) { i = i - __线程数; Thread.Sleep(1000); continue; } __失败下载数++; __已重试次数 = 0; Debug.WriteLine(string.Format("CacheTiles Err:{0}", ex.Message)); } On下载进度变化((float)((__成功下载数 + __失败下载数) * 1.0 / __总数)); 成功率 = (float)(__成功下载数 * 1.0 / (__成功下载数 + __失败下载数)); } })); } Task.WaitAll(__任务列表.ToArray()); } 结束(); } }