/// <summary> /// 分级渲染单个图层 /// </summary> /// <param name="g"></param> /// <param name="layer"></param> private void RenderAsClassBreaksRenderer(Graphics g, Layer layer) { ClassBreaksRenderer cRenderer = layer.Renderer as ClassBreaksRenderer; // 强转,使图层渲染器为分级渲染器 string field = cRenderer.Field; //图层为点图层 if (layer.FeatureType == typeof(PointD)) { for (int i = 0; i < layer.Features.Count; i++) { double value = Convert.ToDouble(layer.Table.Rows[i][field]); //获取feature的相应值 PointSymbol pSymbol = cRenderer.FindSymbol(value) as PointSymbol; //获取符号类型 PointD point = layer.Features[i] as PointD; //获取id为i的点 //转换为屏幕坐标,绘制 PointD screenPoint = FromMapPoint(point); PointF DrawPoint = new PointF((float)screenPoint.X, (float)screenPoint.Y); pSymbol.DrawPoint(g, DrawPoint); } } //图层为折线图层 else if (layer.FeatureType == typeof(Polyline)) { for (int i = 0; i < layer.Features.Count; i++) { double value = Convert.ToDouble(layer.Table.Rows[i][field]); //获取feature的相应值 LineSymbol lSymbol = cRenderer.FindSymbol(value) as LineSymbol; //获取符号类型 Polyline line = layer.Features[i] as Polyline; //获得折线 List <PointF> screenLine = new List <PointF>(); for (int j = 0; j < line.Data.Count; j++) { PointD point = FromMapPoint(line.Data[j]); //坐标转换 screenLine.Add(new PointF((float)point.X, (float)point.Y)); //添加到绘制队列 } lSymbol.DrawLine(g, screenLine.ToArray()); //绘制 } } //图层为复合折线图层 else if (layer.FeatureType == typeof(MultiPolyline)) { for (int i = 0; i < layer.Features.Count; i++) { double value = Convert.ToDouble(layer.Table.Rows[i][field]); //获取feature的相应值 LineSymbol lSymbol = cRenderer.FindSymbol(value) as LineSymbol; //获取符号类型 MultiPolyline lines = layer.Features[i] as MultiPolyline; //获得复合折线 for (int j = 0; j < lines.Data.Count; j++) { Polyline line = lines.Data[j]; List <PointF> screenLine = new List <PointF>(); for (int k = 0; k < line.Data.Count; k++) { PointD point = FromMapPoint(line.Data[k]); //坐标转换 screenLine.Add(new PointF((float)point.X, (float)point.Y)); //添加到绘制队列 } lSymbol.DrawLine(g, screenLine.ToArray()); //绘制 } } } //图层为多边形图层 else if (layer.FeatureType == typeof(Polygon)) { for (int i = 0; i < layer.Features.Count; i++) { double value = Convert.ToDouble(layer.Table.Rows[i][field]); //获取feature的相应值 PolygonSymbol pSymbol = cRenderer.FindSymbol(value) as PolygonSymbol; //获取符号类型 Polygon polygon = layer.Features[i] as Polygon; //获得折线 List <PointF> screenPolygon = new List <PointF>(); for (int j = 0; j < polygon.Data.Count; j++) { PointD point = FromMapPoint(polygon.Data[j]); //坐标转换 screenPolygon.Add(new PointF((float)point.X, (float)point.Y)); //添加到绘制队列 } pSymbol.DrawPolygon(g, screenPolygon.ToArray()); //绘制 } } //图层为复合折线图层 else if (layer.FeatureType == typeof(MultiPolygon)) { for (int i = 0; i < layer.Features.Count; i++) { double value = Convert.ToDouble(layer.Table.Rows[i][field]); //获取feature的相应值 PolygonSymbol pSymbol = cRenderer.FindSymbol(value) as PolygonSymbol; //获取符号类型 MultiPolygon polygons = layer.Features[i] as MultiPolygon; //获得复合折线 for (int j = 0; j < polygons.Data.Count; j++) { Polygon polygon = polygons.Data[j]; List <PointF> screenPolygon = new List <PointF>(); for (int k = 0; k < polygon.Data.Count; k++) { PointD point = FromMapPoint(polygon.Data[k]); //坐标转换 screenPolygon.Add(new PointF((float)point.X, (float)point.Y)); //添加到绘制队列 } pSymbol.DrawPolygon(g, screenPolygon.ToArray()); //绘制 } } } }
/// <summary> /// 简单渲染单个图层 /// </summary> /// <param name="g"></param> /// <param name="layer"></param> private void RenderAsSimpleRenderer(Graphics g, Layer layer) { SimpleRenderer sRenderer = layer.Renderer as SimpleRenderer; // 强转,使图层渲染器为唯一值渲染器 //图层类型为点 if (layer.FeatureType == typeof(PointD)) { PointSymbol pSymbol = sRenderer.Symbol as PointSymbol; //强转,使符号为点符号 for (int i = 0; i < layer.Features.Count; i++) { PointD point = layer.Features[i] as PointD; //转换为屏幕坐标,绘制 PointD screenPoint = FromMapPoint(point); PointF DrawPoint = new PointF((float)screenPoint.X, (float)screenPoint.Y); pSymbol.DrawPoint(g, DrawPoint); } } //图层类型为折线 else if (layer.FeatureType == typeof(Polyline)) { LineSymbol lSymbol = sRenderer.Symbol as LineSymbol; //强转,使符号为线符号 for (int i = 0; i < layer.Features.Count; i++) { Polyline line = layer.Features[i] as Polyline; //获得折线 List <PointF> screenLine = new List <PointF>(); for (int j = 0; j < line.Data.Count; j++) { PointD point = FromMapPoint(line.Data[j]); //坐标转换 screenLine.Add(new PointF((float)point.X, (float)point.Y)); //添加到绘制队列 } lSymbol.DrawLine(g, screenLine.ToArray()); //绘制 } } //图层类型为复合折线 else if (layer.FeatureType == typeof(MultiPolyline)) { LineSymbol lSymbol = sRenderer.Symbol as LineSymbol; //强转,使符号为线符号 for (int i = 0; i < layer.Features.Count; i++) { MultiPolyline lines = layer.Features[i] as MultiPolyline; //获得复合折线 for (int j = 0; j < lines.Data.Count; j++) { Polyline line = lines.Data[j]; List <PointF> screenLine = new List <PointF>(); for (int k = 0; k < line.Data.Count; k++) { PointD point = FromMapPoint(line.Data[k]); //坐标转换 screenLine.Add(new PointF((float)point.X, (float)point.Y)); //添加到绘制队列 } lSymbol.DrawLine(g, screenLine.ToArray()); //绘制 } } } //图层类型为多边形 else if (layer.FeatureType == typeof(Polygon)) { PolygonSymbol pSymbol = sRenderer.Symbol as PolygonSymbol; //强转,使符号为面符号 for (int i = 0; i < layer.Features.Count; i++) { Polygon polygon = layer.Features[i] as Polygon; //获得折线 List <PointF> screenPolygon = new List <PointF>(); for (int j = 0; j < polygon.Data.Count; j++) { PointD point = FromMapPoint(polygon.Data[j]); //坐标转换 screenPolygon.Add(new PointF((float)point.X, (float)point.Y)); //添加到绘制队列 } pSymbol.DrawPolygon(g, screenPolygon.ToArray()); //绘制 } } //图层类型为复合多边形 else if (layer.FeatureType == typeof(MultiPolygon)) { PolygonSymbol pSymbol = sRenderer.Symbol as PolygonSymbol; //强转,使符号为线符号 for (int i = 0; i < layer.Features.Count; i++) { MultiPolygon polygons = layer.Features[i] as MultiPolygon; //获得复合折线 for (int j = 0; j < polygons.Data.Count; j++) { Polygon polygon = polygons.Data[j]; List <PointF> screenPolygon = new List <PointF>(); for (int k = 0; k < polygon.Data.Count; k++) { PointD point = FromMapPoint(polygon.Data[k]); //坐标转换 screenPolygon.Add(new PointF((float)point.X, (float)point.Y)); //添加到绘制队列 } pSymbol.DrawPolygon(g, screenPolygon.ToArray()); //绘制 } } } }