示例#1
0
        /// <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);
        }
示例#2
0
 public PolygonSymbolSelect(PolygonSymbol nowsymbol)
 {
     polygonsymbol = nowsymbol;
     layersymbol   = nowsymbol;
     InitializeComponent();
     PolygonSymbolSelect_Load();
     polygonsymbol = new PolygonSymbol();
 }
示例#3
0
 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);
        }
示例#5
0
        /// <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());  //画选中多边形的轮廓
                        }
                    }
                }
            }
        }
示例#6
0
文件: Map.cs 项目: ToaruJ/GISDesgin
        /// <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());                   //绘制
                    }
                }
            }
        }
示例#7
0
文件: Map.cs 项目: ToaruJ/GISDesgin
        /// <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);
        }
示例#9
0
        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);
            }
        }