Newer
Older
EMS_REFACTOR / MarkInfo.cs
nn-203 on 26 Jul 2017 17 KB first commit
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using GeoScene.Data;
using GeoScene.Globe;

namespace Cyberpipe
{
    public enum EnumMarkLayer
    {
        Mark_Altitude = 0, //标高标注
        Mark_Diameter = 1, //管径标注
        Mark_Depth = 2,  //埋深标注
        Mark_Location = 3,//坐标标注
        Mark_Slope = 4,//坡度标注
        Mark_Property = 5,//属性标注
        Mark_Custom = 6, //自定义标注
        Mark_Distance = 7, //距离标注
        Mark_Redline = 8, //红线工具
        Mark_Flag = 9 //扯旗标注
    }

    public  class MarkInfo
    {
        private String desc;
        private GSOGeoPoint3D point;

        public string Desc
        {
            get { return desc; }
            set { desc = value; }
        }

        public GSOGeoPoint3D Point
        {
            get { return point; }
            set { point = value; }
        }
       
    }
    public class MarkTools 
    {
        public static MarkTools markTools;

        public static MarkTools getInstance()
        {
            if(markTools!=null)
            {
                return markTools;
            }
            markTools =  new MarkTools();
            return markTools;
        }

        public void removeMarkerByMarkerLayer(EnumMarkLayer e,GSOGlobeControl globalControl)
        {
            String markerLayerName = "";
            switch (e)
            {
                case EnumMarkLayer.Mark_Altitude:
                    markerLayerName = "标高标注";
                    break;
                case EnumMarkLayer.Mark_Diameter:
                    markerLayerName = "管径标注";
                    break;
                case EnumMarkLayer.Mark_Depth:
                    markerLayerName = "埋深标注";
                    break;
                case EnumMarkLayer.Mark_Location:
                    markerLayerName = "坐标标注";
                    break;
                case EnumMarkLayer.Mark_Slope:
                    markerLayerName = "坡度标注";
                    break;
                case EnumMarkLayer.Mark_Property:
                    markerLayerName = "属性标注";
                    break;
                case EnumMarkLayer.Mark_Custom:
                    markerLayerName = "自定义标注";
                    break;
                case EnumMarkLayer.Mark_Distance:
                    markerLayerName = "距离标注";
                    break;
                case EnumMarkLayer.Mark_Redline:
                    markerLayerName = "红线工具";
                    break;
                case EnumMarkLayer.Mark_Flag:
                    markerLayerName = "扯旗标注";
                    break;
            }
            if (markerLayerName != "")
            {
                GSOLayer markerLayer = globalControl.Globe.Layers.GetLayerByCaption(markerLayerName);
                markerLayer.RemoveAllFeature();
            }

        }

        public static void removeAllMarker(GSOGlobeControl globalControl)
        {
            GSOLayer altitudeLayer = globalControl.Globe.Layers.GetLayerByCaption("标高标注");
            if (altitudeLayer != null) altitudeLayer.RemoveAllFeature();

            GSOLayer diameterLayer = globalControl.Globe.Layers.GetLayerByCaption("管径标注");
            if (diameterLayer != null) diameterLayer.RemoveAllFeature();

            GSOLayer depthLayer = globalControl.Globe.Layers.GetLayerByCaption("埋深标注");
            if (depthLayer != null) depthLayer.RemoveAllFeature();

            GSOLayer locationLayer = globalControl.Globe.Layers.GetLayerByCaption("坐标标注");
            if (locationLayer != null) locationLayer.RemoveAllFeature();

            GSOLayer slopeLayer = globalControl.Globe.Layers.GetLayerByCaption("坡度标注");
            if (slopeLayer != null) slopeLayer.RemoveAllFeature();

            GSOLayer propertyLayer = globalControl.Globe.Layers.GetLayerByCaption("属性标注");
            if (propertyLayer != null) propertyLayer.RemoveAllFeature();

            GSOLayer customLayer = globalControl.Globe.Layers.GetLayerByCaption("自定义标注");
            if (customLayer != null) customLayer.RemoveAllFeature();

            GSOLayer disLayer = globalControl.Globe.Layers.GetLayerByCaption("距离标注");
            if (disLayer != null) disLayer.RemoveAllFeature();

            GSOLayer redLineLayer = globalControl.Globe.Layers.GetLayerByCaption("红线工具");
            if(redLineLayer!=null) redLineLayer.RemoveAllFeature();

            GSOLayer flagLayer = globalControl.Globe.Layers.GetLayerByCaption("扯旗标注");
            if (flagLayer != null) flagLayer.RemoveAllFeature();
        }

        public void showMarker(GSOFeature feature, GSOGlobeControl globalControl,
                               EnumMarkLayer e,String labelTxt)
        {
            String markerLayerName = "";
            List<MarkInfo> marks = new List<MarkInfo>();
            switch (e)
            {
                case EnumMarkLayer.Mark_Altitude:
                    markerLayerName = "标高标注";
                    marks = createAltitudeMarks(feature);
                    break;
                case EnumMarkLayer.Mark_Diameter:
                    markerLayerName = "管径标注";
                    marks = createDiameterMarks(feature);
                    break;
                case EnumMarkLayer.Mark_Depth:
                    markerLayerName = "埋深标注";
                    marks = createDepthMarks(feature);
                    break;
                case EnumMarkLayer.Mark_Location:
                    markerLayerName = "坐标标注";
                    marks = createLocationMarks(feature);
                    break;
                case EnumMarkLayer.Mark_Slope:
                    markerLayerName = "坡度标注";
                    marks = createSlopeMarks(feature);
                    break;
                case EnumMarkLayer.Mark_Property:
                    markerLayerName = "属性标注";
                    marks = createCustomeMiddleMarks(feature, labelTxt);
                    break;
                case EnumMarkLayer.Mark_Custom:
                    markerLayerName = "自定义标注";
                    marks = createCustomeMiddleMarks(feature, labelTxt);
                    break;
                case EnumMarkLayer.Mark_Distance:
                    markerLayerName = "距离标注";
                    marks = createDistanceMarks(feature);
                    break;
                case EnumMarkLayer.Mark_Redline:
                    markerLayerName = "红线工具";
                    break;
                case EnumMarkLayer.Mark_Flag:
                    markerLayerName = "扯旗标注";
                    marks = createCustomeMiddleMarks(feature, labelTxt);
                    break;
            }
            showMarker(marks, globalControl.Globe.Layers.GetLayerByCaption(markerLayerName));
        }

        public void showMarker(List<MarkInfo> marks, GSOLayer layer)
        {
            layer.Visible = true;
            //MessageBox.Show(layer.GetAllFeatures().Length + "");
            foreach(MarkInfo mark in marks)
            {
                addLabel(mark,layer);
            }
        }

        //创建标高MarkInfo
        private List<MarkInfo> createAltitudeMarks(GSOFeature resFeature)
        {
            GSOGeoPolyline3D selLine = resFeature.Geometry as GSOGeoPolyline3D;
            GSOGeoPoint3D startPoint = new GSOGeoPoint3D();
            startPoint.X = selLine[0][0].X;
            startPoint.Y = selLine[0][0].Y;
            startPoint.Z = selLine[0][0].Z;
            string desc0 = "起点标高:" + resFeature.GetFieldAsString("起始地面高程") + "米";
            MarkInfo markInfo0 = new MarkInfo();
            markInfo0.Desc = desc0;
            markInfo0.Point = startPoint;

            GSOGeoPoint3D endPoint = new GSOGeoPoint3D();
            endPoint.X = selLine[0][selLine[0].Count - 1].X;
            endPoint.Y = selLine[0][selLine[0].Count - 1].Y;
            endPoint.Z = selLine[0][selLine[0].Count - 1].Z;
            string desc1 = "终点标高:" + resFeature.GetFieldAsString("终止地面高程") + "米";
            MarkInfo markInfo1 = new MarkInfo();
            markInfo1.Desc = desc1;
            markInfo1.Point = endPoint;

            List<MarkInfo> marks = new List<MarkInfo>();
            marks.Add(markInfo0);
            marks.Add(markInfo1);
            return marks;
        }

        //创建管径MarkInfo
        private List<MarkInfo> createDiameterMarks(GSOFeature resFeature)
        {
            GSOGeoPolyline3D selLine = resFeature.Geometry as GSOGeoPolyline3D;
            GSOGeoPoint3D centerPoint = new GSOGeoPoint3D();
            GSOPoint3d point3d = selLine.GeoCenterPoint;
            centerPoint.X = point3d.X;
            centerPoint.Y = point3d.Y;
            centerPoint.Z = point3d.Z;

            String desc0 = "管径:" + resFeature.GetFieldAsFloat("管径_毫米") + "毫米";

            MarkInfo markInfo0 = new MarkInfo();
            markInfo0.Desc = desc0;
            markInfo0.Point = centerPoint;

            List<MarkInfo> marks = new List<MarkInfo>();
            marks.Add(markInfo0);
            return marks;
        }

        //创建埋深MarkInfo
        private List<MarkInfo> createDepthMarks(GSOFeature resFeature)
        {
            GSOGeoPolyline3D selLine = resFeature.Geometry as GSOGeoPolyline3D;
            GSOGeoPoint3D startPoint = new GSOGeoPoint3D();
            startPoint.X = selLine[0][0].X;
            startPoint.Y = selLine[0][0].Y;
            startPoint.Z = selLine[0][0].Z;
            String desc0 = "起点埋深:" + resFeature.GetFieldAsString("起始埋深") + "米"; 
            MarkInfo markInfo0 = new MarkInfo();
            markInfo0.Desc = desc0;
            markInfo0.Point = startPoint;

            GSOGeoPoint3D endPoint = new GSOGeoPoint3D();
            endPoint.X = selLine[0][selLine[0].Count - 1].X;
            endPoint.Y = selLine[0][selLine[0].Count - 1].Y;
            endPoint.Z = selLine[0][selLine[0].Count - 1].Z;
            String desc1 = "终点埋深:" + resFeature.GetFieldAsString("终止埋深") + "米";
            MarkInfo markInfo1 = new MarkInfo();
            markInfo1.Desc = desc1;
            markInfo1.Point = endPoint;

            List<MarkInfo> marks = new List<MarkInfo>();
            marks.Add(markInfo0);
            marks.Add(markInfo1);
            return marks;
        }

        //创建坐标MarkInfo
        private List<MarkInfo> createLocationMarks(GSOFeature resFeature)
        {
            GSOGeoPolyline3D selLine = resFeature.Geometry as GSOGeoPolyline3D;
            GSOGeoPoint3D startPoint = new GSOGeoPoint3D();
            startPoint.X = selLine[0][0].X;
            startPoint.Y = selLine[0][0].Y;
            startPoint.Z = selLine[0][0].Z;
            string desc0 = "起点坐标:(" + selLine[0][0].X.ToString("0.00") + "," + selLine[0][0].Y.ToString("0.00") + "," + selLine[0][0].Z.ToString("0.00") + ")";
            MarkInfo markInfo0 = new MarkInfo();
            markInfo0.Desc = desc0;
            markInfo0.Point = startPoint;

            GSOGeoPoint3D endPoint = new GSOGeoPoint3D();
            endPoint.X = selLine[0][selLine[0].Count - 1].X;
            endPoint.Y = selLine[0][selLine[0].Count - 1].Y;
            endPoint.Z = selLine[0][selLine[0].Count - 1].Z;
            string desc1 = "终点坐标:(" + selLine[0][selLine[0].Count - 1].X.ToString("0.00") + "," + selLine[0][selLine[0].Count - 1].Y.ToString("0.00") + "," + selLine[0][selLine[0].Count - 1].Z.ToString("0.00") + ")";
            MarkInfo markInfo1 = new MarkInfo();
            markInfo1.Desc = desc1;
            markInfo1.Point = endPoint;

            List<MarkInfo> marks = new List<MarkInfo>();
            marks.Add(markInfo0);
            marks.Add(markInfo1);
            return marks;
        }

        //创建坡度MarkInfo
        private List<MarkInfo> createSlopeMarks(GSOFeature resFeature)
        {
            GSOGeoPolyline3D selLine = resFeature.Geometry as GSOGeoPolyline3D;
            GSOGeoPoint3D centerPoint = new GSOGeoPoint3D();
            GSOPoint3d point3d = selLine.GeoCenterPoint;
            centerPoint.X = point3d.X;
            centerPoint.Y = point3d.Y;
            centerPoint.Z = point3d.Z;

            GSOPoint3ds pts = new GSOPoint3ds();
            pts.Add(selLine[0][0]);
            pts.Add(selLine[0][1]);
            GSOGeoPolyline3D newLine = new GSOGeoPolyline3D();
            newLine.AddPart(pts);
            double newFeatLen = newLine.GetSpaceLength(true, 6378137.0);
            double z = selLine[0][1].Z - selLine[0][0].Z;
            double i = Convert.ToDouble(z / newFeatLen);
            double a = Math.Atan(i) * 180 / Math.PI;
            string desc0 = "坡度:" + i.ToString("0.0000") + "度   坡角:" + a.ToString("0.0000") + "度";
                        
            MarkInfo markInfo0 = new MarkInfo();
            markInfo0.Desc = desc0;
            markInfo0.Point = centerPoint;

            List<MarkInfo> marks = new List<MarkInfo>();
            marks.Add(markInfo0);
            return marks;
        }

        //创建属性、自定义标注
        private List<MarkInfo> createCustomeMiddleMarks(GSOFeature resFeature, String text)
        {
             GSOGeoPoint3D centerPoint=null;
            
            if (resFeature.Geometry.Type == EnumGeometryType.GeoPolyline3D)
            {
                GSOGeoPolyline3D selLine = resFeature.Geometry as GSOGeoPolyline3D;
                centerPoint = new GSOGeoPoint3D();
                GSOPoint3d point3d = selLine.GeoCenterPoint;
                centerPoint.X = point3d.X;
                centerPoint.Y = point3d.Y;
                centerPoint.Z = point3d.Z;
            }
            
            else if (resFeature.Geometry.Type == EnumGeometryType.GeoModel)
            {
                GSOGeoModel selLine = resFeature.Geometry as GSOGeoModel;
                centerPoint = new GSOGeoPoint3D();
                GSOPoint3d point3d = selLine.GeoCenterPoint;
                centerPoint.X = point3d.X;
                centerPoint.Y = point3d.Y;
                centerPoint.Z = point3d.Z;
            }
            string desc0 = text;
            MarkInfo markInfo0 = new MarkInfo();
            markInfo0.Desc = desc0;
            markInfo0.Point = centerPoint;

            List<MarkInfo> marks = new List<MarkInfo>();
            marks.Add(markInfo0);
            return marks;
        }

        //创建距离标注
        private List<MarkInfo> createDistanceMarks(GSOFeature resFeature)
        {
            GSOGeoPolyline3D selLine = resFeature.Geometry as GSOGeoPolyline3D;
            GSOGeoPoint3D centerPoint = new GSOGeoPoint3D();
            GSOPoint3d point3d = selLine.GeoCenterPoint;
            centerPoint.X = point3d.X;
            centerPoint.Y = point3d.Y;
            centerPoint.Z = point3d.Z;

            String desc0 = "距离:" + selLine.GetSpaceLength(false, 6378137);

            MarkInfo markInfo0 = new MarkInfo();
            markInfo0.Desc = desc0;
            markInfo0.Point = centerPoint;

            List<MarkInfo> marks = new List<MarkInfo>();
            marks.Add(markInfo0);
            return marks;
        }

        //
        private List<GSOFeature> getFeaturesAtSamePos(MarkInfo mark, GSOLayer markLayer)
        {
            List<GSOFeature> temps = new List<GSOFeature>();
            for (int i = 0; i < markLayer.GetAllFeatures().Length; i++)
            {
                GSOFeature gfeat = markLayer.GetAt(i);
                if (gfeat != null && gfeat.Geometry != null && gfeat.Geometry.Type == EnumGeometryType.GeoPoint3D)
                {
                    GSOGeoPoint3D pointItem = gfeat.Geometry as GSOGeoPoint3D;
                    if (pointItem.X == mark.Point.X && pointItem.Y == mark.Point.Y && pointItem.Z == mark.Point.Z)
                    {
                        temps.Add(gfeat);
                    }
                }
            }
            return temps;
        }

        private void addLabel(MarkInfo mark, GSOLayer markLayer)
        {
            List<GSOFeature> oldFeats = getFeaturesAtSamePos(mark,markLayer);
            foreach (GSOFeature oldFeat in oldFeats)
            {
                markLayer.RemoveFeatureByID(oldFeat.ID);
            }

            GSOFeature feature = new GSOFeature();
            mark.Point.AltitudeMode = EnumAltitudeMode.RelativeToGround;
            feature.Geometry = mark.Point;
            feature.Name = Guid.NewGuid().ToString();
          
            GSOLabel newLabel = new GSOLabel();
            newLabel.Text = mark.Desc;
            newLabel.Style = new GSOLabelStyle();
            newLabel.Style.Opaque = 0.8;
            newLabel.Style.OutlineColor = Color.Gray;
            newLabel.Style.TractionLineEndPos = new GSOPoint2d(0, 60);
            newLabel.Style.OutlineWidth = 1;
            newLabel.Style.TracktionLineWidth = 1;
            newLabel.Style.TractionLineColor = Color.Green;

            Color color1 = Color.FromArgb(60, 187, 206, 230);
            Color color2 = Color.FromArgb(150, 187, 200, 250);
            newLabel.Style.BackBeginColor = color1;
            newLabel.Style.BackEndColor = color2;
            feature.Label = newLabel;
            markLayer.AddFeature(feature);

        }

        private MarkTools()
        {
         
        }
      
    }
}