//string mapParam = "mapParam={\"mapName\":{0},\"mapScales\":null,mapScale:{1},\"zoomLevel\":null,\"pixelCenter\":{\"x\":{2},\"y\":{3}},\"center\":{\"x\":{4},\"y\":{5}},\"mapCenter\":{\"x\":{6},\"y\":{7}},\"pixelRect\":{\"leftTop\":{\"x\":{8},\"y\":{9}},\"rightBottom\":{\"x\":{10},\"y\":{11}}},\"mapRect\"{\"leftBottom\":{\"x\":null,\"y\":null},\"rightTop\":{\"x\":null,\"y\":null}}}"; /// <summary>${mapping_DynamicISLayer_method_GetImageSource_D}</summary> /// <param name="onCompleted">${mapping_DynamicISLayer_method_GetImageSource_param_onCompleted}</param> protected override void GetImageSource(DynamicLayer.OnImageSourceCompleted onCompleted) { if (!IsInitialized) { onCompleted(null); } else { if (client != null && client.IsBusy) { client.CancelAsync(); client = null; } } client = new WebClient(); client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted); client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged); if (this.Resolution < 0 || this.Dpi < 0) { return; } double scale = ScaleHelper.ScaleConversion(this.Resolution, this.Dpi); Rectangle2D bounds = ViewBounds; int width = (int)Math.Round(ViewSize.Width); int height = (int)Math.Round(ViewSize.Height); StringBuilder imgUrl = new StringBuilder(); imgUrl.Append(Url); if (!Url.EndsWith("/")) { imgUrl.Append("/"); } imgUrl.Append("common.ashx?method=GetMapImage"); imgUrl.AppendFormat("&map={0}", MapName); imgUrl.AppendFormat("&layersKey={0}", LayersKey); imgUrl.AppendFormat("&t={0}", DateTime.Now.Ticks); imgUrl.AppendFormat("&redirect={0}", Redirect.ToString()); imgUrl.Append("&mapParam={"); imgUrl.AppendFormat("\"antiAlias\":{0},", this.AntiAliasing.ToString().ToLower()); imgUrl.AppendFormat("\"mapName\":\"{0}\",", MapName); imgUrl.AppendFormat("\"mapScale\":{0},", scale); imgUrl.AppendFormat("\"transparent\":{0},", Transparent.ToString().ToLower()); imgUrl.AppendFormat("\"center\":{{\"x\":{0},\"y\":{1}}},", bounds.Center.X, bounds.Center.Y); imgUrl.AppendFormat("\"pixelRect\":{{\"leftTop\":{{\"x\":0,\"y\":0}},\"rightBottom\":{{\"x\":{0},\"y\":{1}}}", width, height);//, imgUrl.Append("}}"); //IS.NET中增加重定向参数,此时不需要再下载返回信息了,而是直接采用重定向 //为了兼容,设置Redirect属性,当此属性为FALSE时,兼容以前的模式,当此属性为true时,采用重定向,不兼容以前的模式 if (this.Redirect) { BitmapImage imgSrc = new BitmapImage { UriSource = new Uri(imgUrl.ToString(), UriKind.Absolute) }; onCompleted(imgSrc); } else { client.DownloadStringAsync(new Uri(imgUrl.ToString(), UriKind.Absolute), onCompleted); } }
/// <summary>${mapping_HeatMapLayer_method_GetImageSource_D}</summary> protected override void GetImageSource(DynamicLayer.OnImageSourceCompleted onCompleted) { if (!IsInitialized) { onCompleted(null); } else { if (worker != null && worker.IsBusy) { worker.CancelAsync(); while (worker.IsBusy) { Thread.Sleep(10); } } } List<ThreadSafeGradientStop> stops = new List<ThreadSafeGradientStop>(); foreach (GradientStop item in GradientStops) { stops.Add(new ThreadSafeGradientStop { Color = item.Color, Offset = item.Offset }); } //stops.Sort((ThreadSafeGradientStop g1, ThreadSafeGradientStop g2) => { return g1.Offset.CompareTo(g2.Offset); }); stops.Sort((Comparison<ThreadSafeGradientStop>)((g1, g2) => g1.Offset.CompareTo(g2.Offset))); List<PixelPoint> pps = new List<PixelPoint>(this.GradientStops.Count); foreach (HeatPoint point in this.heatPoints) { if (ViewBounds.Contains(new Point2D(point.X, point.Y)) && point.Value > 0) { PixelPoint pp = new PixelPoint { X = (int)Math.Round((point.X - ViewBounds.Left) / Resolution * Intensity), Y = (int)Math.Round((ViewBounds.Top - point.Y) / Resolution * Intensity), Value = (int)Math.Round(point.Value), //判断给定的地理半径是否小于0,小于0则设置成0 GeoRadius = point.GeoRadius < 0 ? 0 : point.GeoRadius, }; pps.Add(pp); } } //在视图范围内的转换为像素空间坐标 //for (int i = 0; i < heatPoints.Count; i++) //{ // if (ViewBounds.Contains(new Point2D(heatPoints[i].X, heatPoints[i].Y)) && heatPoints[i].Value > 0) // { // PixelPoint point = new PixelPoint // { // X = (int)Math.Round((heatPoints[i].X - ViewBounds.Left) / Resolution * Intensity), // Y = (int)Math.Round((ViewBounds.Top - heatPoints[i].Y) / Resolution * Intensity), // Value = (int)Math.Round(heatPoints[i].Value) // }; // pps.Add(point); // //按照权重多加value遍; // ////int sum = (int)Math.Round(heatPoints[i].Value); // ////for (int k = 0; k < sum; k++) // ////{ // //// hps.Add(point); // ////} // } //} int width = (int)Math.Round(ViewSize.Width); int height = (int)Math.Round(ViewSize.Height); //调用 RunWorkerAsync 方法时将引发DoWork事件。这里就是您启动耗时操作的地方 worker.RunWorkerAsync(new object[] { pps, width, height, Radius, Intensity, stops, onCompleted, this.Map.Resolution }); }