/// <summary> /// 创建要素 /// </summary> /// <returns></returns> public Symbol CreatNewSymbol() { Symbol newsymbol; switch (datatype) { case MySpaceDataType.MyPoint: newsymbol = new PointSymbol(); break; case MySpaceDataType.MyPolyLine: newsymbol = new LineSymbol(); break; case MySpaceDataType.MyPolygon: newsymbol = new PolygonSymbol(); break; default: newsymbol = new Symbol(); break; //防错TODO&栅格文件渲染方式再议 } return(newsymbol); }
public PolygonSymbolSelect(PolygonSymbol nowsymbol) { polygonsymbol = nowsymbol; layersymbol = nowsymbol; InitializeComponent(); PolygonSymbolSelect_Load(); polygonsymbol = new PolygonSymbol(); }
private void Yes_Click(object sender, EventArgs e) { layersymbol = polygonsymbol; ((SymbolSelect)this.ParentForm).NewSymbol = polygonsymbol; this.ParentForm.DialogResult = DialogResult.OK; //加赋值 this.ParentForm.Close(); }
/// <summary> /// 计算该点和其他两点组成的三角形的顺序 /// </summary> public PolygonSymbol SetSymbol(PolygonPoint2D last, PolygonPoint2D next) { Vector2 ab = this.point - last.point; Vector2 ac = next.point - last.point; // Vector2 ab = last.point - this.point; //Vector2 ac = next.point - this.point; float v = MathUtils.Cross_2d(ab, ac); if (v > 0) { symbol = PolygonSymbol.Negative; } else if (v == 0) { symbol = PolygonSymbol.Line; } else { symbol = PolygonSymbol.Positive; } return(symbol); }
/// <summary> /// 唯一值渲染和分级渲染时的绘制要素 /// </summary> /// <param name="g"></param> /// <param name="bounds"></param> /// <param name="centerPos"></param> /// <param name="scale"></param> /// <param name="fid2Symbol"></param> internal override void DrawSpaceData(Graphics g, Rectangle bounds, PointF centerPos, double scale, Dictionary <int, Symbol> fid2Symbol) { //选中要素的样式 Pen selectedPen = new Pen(Color.Cyan); selectedPen.Width = 2.5F; MyPoint xyCenter = ETCProjection.LngLat2XY(new MyPoint(centerPos.X, centerPos.Y)); double xmin = xyCenter.X - scale * bounds.Width / 2; double xmax = xyCenter.X + scale * bounds.Width / 2; double ymin = xyCenter.Y - scale * bounds.Height / 2; double ymax = xyCenter.Y + scale * bounds.Height / 2; for (int i = 0; i < polygons.Count; i++) { //从symbol中获取样式 PolygonSymbol ps = (PolygonSymbol)fid2Symbol[polygons[i].FID]; Pen mypen = ps.LineStyle.GetPen; Brush mybrush = new SolidBrush(ps.GetColor()); List <int> parts = new List <int>(polygons[i].firstIndex); parts.Add(polygons[i].PointCount); for (int k = 0; k < polygons[i].firstIndex.Length; k++) //对于每一个MultiPolygon的子多边形 { List <PointF> pointfs = new List <PointF>(); for (int j = parts[k]; j < parts[k + 1]; j++) //对于每一个MultiPolygon的子多边形的每一个点 { MyPoint xyProjection = ETCProjection.LngLat2XY(polygons[i].Points[j]); double xScreen = bounds.Width * (xyProjection.X - xmin) / (xmax - xmin); double yScreen = bounds.Height * (xyProjection.Y - ymin) / (ymax - ymin); PointF p = new PointF((float)xScreen, bounds.Height - (float)yScreen); pointfs.Add(p); } if (GeometryTools.IsPointsPartInRectangle(pointfs.ToArray(), new MyRectangle(bounds.X, bounds.Width, bounds.Y, bounds.Height)) == true) { g.DrawPolygon(mypen, pointfs.ToArray()); g.FillPolygon(mybrush, pointfs.ToArray()); } } } for (int i = 0; i < polygons.Count; i++) { if (polygons[i].Selected == true) { List <int> parts = new List <int>(polygons[i].firstIndex); parts.Add(polygons[i].PointCount); for (int k = 0; k < polygons[i].firstIndex.Length; k++) //对于每一个MultiPolygon的子多边形 { List <PointF> pointfs = new List <PointF>(); for (int j = parts[k]; j < parts[k + 1]; j++) { MyPoint xyProjection = ETCProjection.LngLat2XY(polygons[i].Points[j]); double xScreen = bounds.Width * (xyProjection.X - xmin) / (xmax - xmin); double yScreen = bounds.Height * (xyProjection.Y - ymin) / (ymax - ymin); PointF p = new PointF((float)xScreen, bounds.Height - (float)yScreen); pointfs.Add(p); } if (GeometryTools.IsPointsPartInRectangle(pointfs.ToArray(), new MyRectangle(bounds.X, bounds.Width, bounds.Y, bounds.Height)) == true) { g.DrawPolygon(selectedPen, pointfs.ToArray()); //画选中多边形的轮廓 } } } } }
/// <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()); //绘制 } } } }
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (!(value is SymbolTemplate)) { return(value); } SymbolTemplate symbolTemplate = value as SymbolTemplate; if (symbolTemplate.Symbol == null) { return(null); } Symbol convertedSymbol = symbolTemplate.Symbol; if (symbolTemplate.FeatureTemplate == null) { return(convertedSymbol); } FeatureTemplate featureTemplate = symbolTemplate.FeatureTemplate; if (symbolTemplate.Symbol is FSSymbols.SimpleFillSymbol || symbolTemplate.Symbol is FSSymbols.PictureFillSymbol || symbolTemplate.Symbol is FSSymbols.SimpleLineSymbol) { switch (featureTemplate.DrawingTool) { case FeatureEditTool.Polygon: convertedSymbol = new PolygonSymbol(); break; case FeatureEditTool.AutoCompletePolygon: convertedSymbol = new AutoCompletePolygonSymbol(); break; case FeatureEditTool.Circle: convertedSymbol = new CircleSymbol(); break; case FeatureEditTool.Ellipse: convertedSymbol = new EllipseSymbol(); break; case FeatureEditTool.Rectangle: convertedSymbol = new RectangleSymbol(); break; case FeatureEditTool.Freehand: if (symbolTemplate.Symbol is FSSymbols.SimpleLineSymbol) { convertedSymbol = new FreehandLineSymbol(); } else { convertedSymbol = new FreehandPolygonSymbol(); } break; case FeatureEditTool.Line: convertedSymbol = new PolylineSymbol(); break; } if (convertedSymbol is ShapeMarkerSymbol) { ShapeMarkerSymbol shapeMarkerSymbol = convertedSymbol as ShapeMarkerSymbol; FillMarkerSymbol fillMarkerSymbol = convertedSymbol as FillMarkerSymbol; if (symbolTemplate.Symbol is FSSymbols.SimpleFillSymbol) { ESRI.ArcGIS.Client.FeatureService.Symbols.SimpleFillSymbol simpleFillSymbol = symbolTemplate.Symbol as FSSymbols.SimpleFillSymbol; fillMarkerSymbol.Stroke = simpleFillSymbol.BorderBrush; fillMarkerSymbol.Fill = simpleFillSymbol.Fill; fillMarkerSymbol.StrokeStyle = simpleFillSymbol.BorderStyle; fillMarkerSymbol.StrokeThickness = simpleFillSymbol.BorderThickness; shapeMarkerSymbol.SelectionColor = simpleFillSymbol.SelectionColor; } else if (symbolTemplate.Symbol is FSSymbols.PictureFillSymbol) { ESRI.ArcGIS.Client.FeatureService.Symbols.PictureFillSymbol pictureFillSymbol = symbolTemplate.Symbol as FSSymbols.PictureFillSymbol; fillMarkerSymbol.Stroke = pictureFillSymbol.BorderBrush; fillMarkerSymbol.StrokeStyle = pictureFillSymbol.BorderStyle; fillMarkerSymbol.StrokeThickness = pictureFillSymbol.BorderThickness; shapeMarkerSymbol.SelectionColor = pictureFillSymbol.SelectionColor; // Create new image brush for fill in order to set stretch to Uniform ImageBrush brush = new ImageBrush() { Stretch = Stretch.Uniform, ImageSource = pictureFillSymbol.Source }; fillMarkerSymbol.Fill = brush; } else if (symbolTemplate.Symbol is FSSymbols.SimpleLineSymbol) { ESRI.ArcGIS.Client.FeatureService.Symbols.SimpleLineSymbol simpleLineSymbol = symbolTemplate.Symbol as FSSymbols.SimpleLineSymbol; shapeMarkerSymbol.Stroke = simpleLineSymbol.Color; shapeMarkerSymbol.StrokeStyle = simpleLineSymbol.Style; shapeMarkerSymbol.StrokeThickness = simpleLineSymbol.Width; shapeMarkerSymbol.SelectionColor = simpleLineSymbol.SelectionColor; if (fillMarkerSymbol != null) { fillMarkerSymbol.Fill = new SolidColorBrush(Colors.Transparent); } } } } return(convertedSymbol); }
bool _ReadOnly = false; //图层是否可编辑 #endregion #region 构造函数 /// <summary> /// 静态构造函数 /// </summary> /// <param name="name">图层名称</param> /// <param name="geoType">图层类型</param> /// <returns>已初始化的图层,类型不对则返回null</returns> public static Layer CreateLayer(string name, Type geoType, string filePath) { if (geoType == typeof(PointD) || geoType == typeof(MultiPolyLine) || geoType == typeof(MultiPolygon)) { Layer sLayer = new Layer(); sLayer._FilePath = filePath; sLayer._DT = new DataTable(name); sLayer._GeoType = geoType; sLayer._Node = new TreeNode(name); sLayer._Node.Tag = sLayer; //Tag设置成layer sLayer._Node.Checked = true; //加入ID列 DataColumn mID = new DataColumn(__ID_COLUMN_NAME, typeof(int)); mID.Unique = true; mID.AllowDBNull = false; mID.AutoIncrementSeed = 1; mID.AutoIncrement = true; sLayer._DT.Columns.Add(mID); //加入要素列,存地理坐标 DataColumn mGeoData = new DataColumn(__GEO_COLUMN_NAME, geoType); mGeoData.AllowDBNull = true; sLayer._DT.Columns.Add(mGeoData); //加入要素列,存投影坐标 DataColumn mPrjData = new DataColumn(__PRJ_COLUMN_NAME, geoType); mPrjData.AllowDBNull = true; sLayer._DT.Columns.Add(mPrjData); //加入要素列,存储注记位置 DataColumn mTextLabeldData = new DataColumn(__TEXT_LABEL_COLUMN_NAME, typeof(PointD)); mTextLabeldData.AllowDBNull = true; mTextLabeldData.DefaultValue = null; sLayer._DT.Columns.Add(mTextLabeldData); if (geoType == typeof(PointD)) { Symbol symbol = new PointSymbol(PointSymbol.PointStyleConstant.FillCircle, 4, Color.Black); sLayer._SimpleRenderer = new SimpleRenderer(symbol); } else if (geoType == typeof(MultiPolyLine)) { Symbol symbol = new LineSymbol(DashStyle.Solid, 2, Color.Black); sLayer._SimpleRenderer = new SimpleRenderer(symbol); } else { LineSymbol outlineSymbol = new LineSymbol(DashStyle.Solid, 1, Color.Black); Symbol symbol = new PolygonSymbol(Color.Red, outlineSymbol); sLayer._SimpleRenderer = new SimpleRenderer(symbol); } sLayer._Renderer = sLayer._SimpleRenderer; //设置默认Renderer sLayer._UniqueValueRenderer = new UniqueValueRenderer(sLayer); sLayer._ClassBreakRenderer = new ClassBreakRenderer(sLayer); sLayer._TextLabel = new TextSymbol(sLayer); return(sLayer); } else { return(null); } }