Newer
Older
GHFX_REFACTOR / FrmMultiPipelineModelDB.cs
wxn on 2 Nov 2016 33 KB 提交
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using GeoScene.Globe;
using GeoScene.Engine;
using GeoScene.Data;
using System.IO;
using System.Collections;
using System.Xml;

namespace Cyberpipe
{
    public partial class FrmMultiPipelineModelDB : Office2007Form
    {
        private GeoScene.Globe.GSOGlobeControl globeControl1;
        GSODataSource ds = null;
        public GSOLayer rukuLayer = null;
        private Hashtable en_cns = new Hashtable();
        private Hashtable fields_types = new Hashtable();

        public FrmMultiPipelineModelDB(GSOGlobeControl _globeControl,GSODataSource _ds)
        {
            globeControl1 = _globeControl;
            ds = _ds;
            InitializeComponent();

            cmbReference.Text = "管顶";
            chkDeep.Checked = true;
        }

        private void FrmMultiPipelineModelDB_Load(object sender, EventArgs e)
        {
            string pipelinetype = Utility.pipelinetype;
            string[] pipelinetypes = pipelinetype.Split(',');
            for (int i = 0; i < pipelinetypes.Length; i++)
            {
                pipelineTypeCbo.Items.Add(pipelinetypes[i]);
            }

            comboBoxShpLayerList.Items.Clear();

            for (int i = 0; i < globeControl1.Globe.Layers.Count; i++)
            {
                GSOLayer layer = globeControl1.Globe.Layers[i];
                if (layer != null && layer.Name.ToLower().EndsWith(".shp"))
                {
                    comboBoxShpLayerList.Items.Add(layer.Caption);
                }
            }

            string filename = Application.StartupPath + "\\FormText.xml";
            if (File.Exists(filename))
            {
                XmlTextReader XmlReader = new XmlTextReader(filename);
                try
                {
                    while (XmlReader.Read())
                    {
                        if (XmlReader.Name == "Field")
                        {
                            string str1 = XmlReader["label"];
                            string str3 = XmlReader["type"];
                            string str2 = XmlReader.ReadElementString();
                            en_cns.Add(str1, str2);
                            fields_types.Add(str1, str3);
                        }
                    }
                }
                catch (Exception ex)
                {
                    LogError.PublishError(ex);
                    MessageBox.Show(ex.Message);
                }
            }

        }

        private void cmbLayer_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBoxShpLayerList.SelectedItem == null)
            {
                return;
            }
            GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxShpLayerList.SelectedItem.ToString().Trim());
            if (layer == null)
            {
                return;
            }
            string txtMessage = valiPipeData(layer);
            if (txtMessage != "")
            {
                cmbFrom.Items.Clear();
                cmbTo.Items.Clear();
                cmbRadius.Items.Clear();
                cmbID.Items.Clear();
                cmbWidthNum.Items.Clear();
                cmbHeightNum.Items.Clear();

                FrmValiDataShowErrorMessage showErrorMessage = new FrmValiDataShowErrorMessage(comboBoxShpLayerList.SelectedItem.ToString().Trim(), txtMessage);
                showErrorMessage.ShowDialog();
                return;
            }
            else
            {
                textBoxNewLayerName.Text = layer.Caption;
                GSOFeatures features = layer.GetAllFeatures();
                if (features.Length == 0)
                    return;

                cmbFrom.Items.Clear();
                cmbTo.Items.Clear();
                cmbRadius.Items.Clear();
                cmbID.Items.Clear();
                cmbWidthNum.Items.Clear();
                cmbHeightNum.Items.Clear();

                for (int i = 0; i < features[0].GetFieldCount(); i++)
                {
                    cmbFrom.Items.Add(((GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i))).Name);
                    cmbTo.Items.Add(((GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i))).Name);
                    cmbRadius.Items.Add(((GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i))).Name);
                    cmbID.Items.Add(((GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i))).Name);
                    cmbWidthNum.Items.Add(((GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i))).Name);
                    cmbHeightNum.Items.Add(((GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i))).Name);
                }
                cmbFrom.SelectedItem = "Deep1";
                cmbTo.SelectedItem = "Deep2";
                cmbRadius.SelectedItem = "Diameter";
                cmbWidthNum.SelectedItem = "Hor_Num";// "Weight";
                cmbHeightNum.SelectedItem = "Ver_Num";// "Height";
                cmbID.SelectedItem = "Handle";
            }
            
        }
        
        private void btnPipelineColor_Click(object sender, EventArgs e)
        {
            colorDialog1.Color = btnPipelineColor.BackColor;
            
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                btnPipelineColor.BackColor = colorDialog1.Color;
            }
        }

        private void btnCreateModel_Click(object sender, EventArgs e)
        {
            //GSODataSource ds = Utility.getDataSourceByFullName(globeControl1, comboBoxDataSourceList.SelectedItem.ToString().Trim());
            if (ds == null)
            {
                MessageBox.Show("选择的目标数据源为空!", "提示");
                return;
            }
            if (string.IsNullOrEmpty(textBoxNewLayerName.Text))
            {
                MessageBox.Show("请选择一个Shp图层!", "提示");
                return;
            }
            if (ds.GetDatasetByName(textBoxNewLayerName.Text) != null)
            {
                MessageBox.Show("图层名称已存在!", "提示");
                return;
            }
            try
            {
                GSOLayer ShpSourceLayer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxShpLayerList.SelectedItem.ToString().Trim());
                GSOFeatureDataset pipeline = CreateDBFeatureDataset(textBoxNewLayerName.Text.Trim());
                if (pipeline == null)
                {
                    MessageBox.Show("输入的图层名称不符合要求!", "提示");
                    return;
                }
                pipeline.Open();
                GSOFeatureDataset pipelineRect = CreateDBFeatureDataset(textBoxNewLayerName.Text.Trim() + "_Rect");
                if (pipelineRect == null)
                {
                    return;
                }
                pipelineRect.Open();

                GSOFeatures features = ShpSourceLayer.GetAllFeatures();
                string message = "";
                for (int j = 0; j < features.Length; j++)
                {
                    GSOFeature f = features[j];

                    GSOFeature newFeature = pipeline.CreateFeature();

                    GSOPipeLineStyle3D style = new GSOPipeLineStyle3D();
                    style.LineColor = Color.FromArgb(Convert.ToByte(numericUpDownLineOpaque.Value), btnPipelineColor.BackColor);

                    double radius = 0;
                    if (cmbRadius.SelectedItem == null)
                    {
                        cmbRadius.SelectedIndex = 0;
                    }
                    GSOFieldDefn diameterfield = (GSOFieldDefn)f.GetFieldDefn(cmbRadius.SelectedItem.ToString());
                    string fieldText = f.GetFieldAsString(cmbRadius.SelectedItem.ToString());
                    if (diameterfield.Type == EnumFieldType.Text)
                    {
                        if (double.TryParse(fieldText, out radius))
                        {
                            radius = radius / 2000;
                        }
                        else
                        {
                            message += "ID为" + f.ID + "的对象的管径字段值不符合要求!\r\n";
                            continue;
                        }
                    }
                    else
                    {
                        radius = f.GetFieldAsDouble(cmbRadius.SelectedItem.ToString()) / 2000;  // 探测数据的单位一般是毫米,需换算为米; 管径一般是 直径, 这个需要半径, 所有除以2000     
                    }

                    if (cmbID.SelectedItem == null)
                    {
                        cmbID.SelectedIndex = 0;
                    }
                    if (cmbWidthNum.SelectedItem == null)
                    {
                        cmbWidthNum.SelectedIndex = 0;
                    }
                    if (cmbHeightNum.SelectedItem == null)
                    {
                        cmbHeightNum.SelectedIndex = 0;
                    }
                    string eventid = f.GetFieldAsString(cmbID.SelectedItem.ToString());
                    double interval = radius * 2;
                    int num_width = 0;
                    int num_height = 0;
                    if (!int.TryParse(f.GetFieldAsString(cmbWidthNum.SelectedItem.ToString()), out num_width))
                    {
                        message += "ID为" + f.ID + "的对象的宽度字段值不符合要求!\r\n";
                        continue;
                    }
                    if (!int.TryParse(f.GetFieldAsString(cmbHeightNum.SelectedItem.ToString()), out num_height))
                    {
                        message += "ID为" + f.ID + "的对象的高度字段值不符合要求!\r\n";
                        continue;
                    }

                    double rectWidth = Math.Round( radius * 2.0 * num_width + 0.08,5);// 两端空出0.04
                    double rectHeight = Math.Round(radius * 2.0 * num_height + 0.08, 5);
                    if (radius == 0)
                    {
                        message += "ID为" + f.ID + "的对象的管径字段值为0!\r\n";
                        continue;
                    }

                    int intSlice = 0;
                    double cornerSliceAngle = 0;
                    if (!int.TryParse(txtSlice.Text.Trim(), out intSlice))
                    {
                        message += "ID为" + f.ID + "的对象的截面分段数字段值不符合要求!\r\n";
                        continue;
                    }
                    if (!double.TryParse(textBoxCornerSliceAngle.Text.Trim(), out cornerSliceAngle))
                    {
                        message += "ID为" + f.ID + "的对象的拐弯平滑度字段值不符合要求!\r\n";
                        continue;
                    }
                    style.Radius = radius;
                    style.Slice = intSlice;
                    style.CornerSliceAngle = cornerSliceAngle;

                    f.Geometry.AltitudeMode = EnumAltitudeMode.RelativeToGround;

                    GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D;
                    if (line == null)
                    {
                        message += "ID为" + f.ID + "的对象不是一个线对象!\r\n";
                        continue;
                    }

                    if (cmbFrom.SelectedItem == null)
                    {
                        cmbFrom.SelectedIndex = 0;
                    }
                    if (cmbTo.SelectedItem == null)
                    {
                        cmbTo.SelectedIndex = 0;
                    }
                    double deep1 = 0;
                    double deep2 = 0;
                    if (!double.TryParse(f.GetFieldAsString(cmbFrom.Items[cmbTo.SelectedIndex].ToString().Trim()), out deep1))
                    {
                        message += "ID为" + f.ID + "的对象的起点埋深字段值不符合要求!\r\n";
                        continue;
                    }
                    if (!double.TryParse(f.GetFieldAsString(cmbTo.Items[cmbTo.SelectedIndex].ToString().Trim()), out deep2))
                    {
                        message += "ID为" + f.ID + "的对象的终点埋深字段值不符合要求!\r\n";
                        continue;
                    }

                    if (chkDeep.Checked)
                    {
                        deep1 = 0 - deep1;
                        deep2 = 0 - deep2;
                    }

                    if (cmbReference.SelectedIndex == 0) //管底
                    {
                        deep1 = deep1 + radius * 2;
                        deep2 = deep2 + radius * 2;
                    }
                    else if (cmbReference.SelectedIndex == 1) //管顶
                    {
                        deep1 = deep1 - radius * 2;
                        deep2 = deep2 - radius * 2;
                    }
                    GSOPoint3ds ps = line[0];
                    for (int n = 0; n < ps.Count; n++)
                    {
                        GSOPoint3d pt3d = ps[n];
                        int pointcount = ps.Count;
                        double radio = Math.Sqrt(Math.Pow(pt3d.Y - ps[0].Y, 2) + Math.Pow(pt3d.X - ps[0].X, 2)) / Math.Sqrt(Math.Pow(ps[pointcount - 1].Y - ps[0].Y, 2) + Math.Pow(ps[pointcount - 1].X - ps[0].X, 2));
                        pt3d.Z = deep1 + (deep2 - deep1) * radio;

                        if (double.IsInfinity(pt3d.Z))
                        {
                            pt3d.Z = deep2;
                        }
                        ps[n] = pt3d;
                    }
                    line[0] = ps;
                    if (num_height == 0 || num_width == 0) // 直埋
                    {
                        newFeature.Geometry = line;
                        newFeature.Geometry.Style = style;
                        //newFeature.Name = eventid;
                        newFeature.Name = en_cns.ContainsKey(eventid) == true ? en_cns[eventid].ToString() : eventid;
                        SetFields(f, newFeature);

                        pipeline.AddFeature(newFeature);
                    }
                    else
                    {
                        GSOFeature rectfeat = pipelineRect.CreateFeature();
                        rectfeat.Geometry = CreatePipeRect(line, rectWidth, rectHeight);
                        if (rectfeat != null)
                        {
                            SetFields(f, rectfeat);
                            pipelineRect.AddFeature(rectfeat);
                        }
                        one2Multi(line, num_width, num_height, interval, style, pipeline, eventid, f);
                    }
                }
               
                pipeline.Save();
                pipelineRect.Save();               
                string strMessage = "shp文件中共" + features.Length + "个对象,实际入库" + pipeline.GetAllFeatures().Length + "个对象!\r\n";
                pipeline.Close();
                pipelineRect.Close();
                globeControl1.Refresh();

                GSOLayer layerRuku = globeControl1.Globe.Layers.Add(textBoxNewLayerName.Text);
                rukuLayer = layerRuku;

                if (message == "")
                {
                    MessageBox.Show(strMessage, "提示");
                }
                else
                {
                    //FrmMessageShow frm = new FrmMessageShow(strMessage + message);
                    //frm.ShowDialog();
                    MessageBox.Show(strMessage + message, "提示");
                }

                this.DialogResult = DialogResult.OK;
                this.Close();
            }
            catch (Exception ex)
            {
                //Log.PublishTxt(ex);
                MessageBox.Show(ex.Message);
            }
        }

        private void SetFields(GSOFeature oldfeat, GSOFeature newFeature)
        {
            for (int i = 0; i < oldfeat.GetFieldCount(); i++)
            {
                GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(oldfeat.GetFieldDefn(i));

                object fieldvalue = oldfeat.GetValue(fielddef.Name);
                if (fieldvalue == null)
                    continue;
                string fieldName = en_cns.ContainsKey(fielddef.Name) == true ? en_cns[fielddef.Name].ToString() : fielddef.Name;
                newFeature.SetValue(fieldName, fieldvalue);              
            }
        }

        private GSOGeoPolyline3D CreatePipeRect(GSOGeoPolyline3D line, double width, double height)
        {
            GSOGeoPolyline3D cloneline = line.Clone() as GSOGeoPolyline3D; 
            GSOExtendSectionLineStyle3D style = createRectStyle(width, height);
            if (style == null)
            {
                return null;
            }
            cloneline.Style = style;
            return cloneline;
        }        

        private GSOExtendSectionLineStyle3D createRectStyle(double width, double height)
        {
            GSOExtendSectionLineStyle3D style = new GSOExtendSectionLineStyle3D();
            style.LineColor = Color.FromArgb(Convert.ToByte(numOpaqueRect.Value), btnRectColor.BackColor);
            if (width == 0 || height == 0)
            {
                return null;
            }
            GSOPoint3ds sectionpts = new GSOPoint3ds();
            sectionpts.Add(new GSOPoint3d(width / -2, height / 2, 0));
            sectionpts.Add(new GSOPoint3d(width / -2, height / -2, 0));
            sectionpts.Add(new GSOPoint3d(width / 2, height / -2, 0));
            sectionpts.Add(new GSOPoint3d(width / 2, height / 2, 0));

            style.SetSectionPoints(sectionpts);
            style.IsClosed = true;
            style.SetAnchorByAlign(EnumAlign.MiddleCenter);
            
            return style;
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();           
        }

        private void one2Multi(GSOGeoPolyline3D line, int num_width, int num_height, double interval, GSOPipeLineStyle3D style, GSOFeatureDataset layer,string name,GSOFeature oldfeat)
        {
            line = LatLon2Coord_Line(line);

            double width_all = interval * (num_width-1);
            double height_all = interval * (num_height-1);

            GSOGeoPolyline3D line_1 = line.Clone() as GSOGeoPolyline3D;            
            GSOPoint3d p1 = line[0][0];
            GSOPoint3d p2 = line[0][1];
            double daltaX = p2.X-p1.X;
            double daltaY = p2.Y-p1.Y;            
            double agree = Math.Atan(daltaY/daltaX);
            GSOPoint2d point = new GSOPoint2d((-0.5*width_all-interval)*Math.Sin(agree),(0.5*width_all+interval)*Math.Cos(agree));
            line.MoveXY(point.X,point.Y);
            line.MoveZ(height_all / -2);
            
            for (int i = 0; i < num_width; i++)
            {
                for (int j = 0; j < num_height; j++)
                {
                    GSOGeoPolyline3D templine = line.Clone() as GSOGeoPolyline3D;
                    point = new GSOPoint2d((i + 1) * interval * Math.Sin(agree), -1 * (i + 1) * interval * Math.Cos(agree));
                    templine.MoveXY(point.X,point.Y);                   
                    templine.MoveZ(interval*j);
                    templine = Coord2LatLon_Line(templine);
                    GSOFeature feat = layer.CreateFeature();
                    feat.Geometry = templine;
                    feat.Geometry.Style = style;
                    feat.Name = name;
                    SetFields(oldfeat, feat);
                    layer.AddFeature(feat);
                }
            }
        }

        private GSOGeoPolyline3D LatLon2Coord_Line(GSOGeoPolyline3D line)
        {
            GSOGeoPolyline3D newline = line.Clone() as GSOGeoPolyline3D;
            GSOPoint3ds ps = newline[0];
            for (int i = 0; i < ps.Count; i++)
            {
                GSOPoint3d pt = ps[i];
                GSOPoint2d pt2d = new GSOPoint2d(pt.X, pt.Y);
                GSOPoint2d pt2dnew = LatLon2Coord(pt2d);

                GSOPoint3d ptnew = new GSOPoint3d(pt2dnew.X, pt2dnew.Y, pt.Z);
                ps[i] = ptnew;
            }
            newline[0] = ps;
            return newline;
        }

        private GSOGeoPolyline3D Coord2LatLon_Line(GSOGeoPolyline3D line)
        {
            GSOGeoPolyline3D newline = line.Clone() as GSOGeoPolyline3D;
            GSOPoint3ds ps = newline[0];
            for (int i = 0; i < ps.Count; i++)
            {
                GSOPoint3d pt = ps[i];
                GSOPoint2d pt2d = new GSOPoint2d(pt.X, pt.Y);
                GSOPoint2d pt2dnew = Coord2LatLon(pt2d);

                GSOPoint3d ptnew = new GSOPoint3d(pt2dnew.X, pt2dnew.Y, pt.Z);
                ps[i] = ptnew;
            }
            newline[0] = ps;
            return newline;
        }

        private GSOPoint2d LatLon2Coord(GeoScene.Data.GSOPoint2d pt2d)
        {
            int id = GeoScene.Data.GSOProjectManager.AddProject("+proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=-4869.018 +y_0=-3421238.225 +a=6378140 +b=6356755.288157528 +units=m +no_defs");
            GeoScene.Data.GSOPoint2d result = GeoScene.Data.GSOProjectManager.Forward(pt2d, id);
            return result;
        }

        private GSOPoint2d Coord2LatLon(GeoScene.Data.GSOPoint2d pt2d)
        {
            int id = GeoScene.Data.GSOProjectManager.AddProject("+proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=-4869.018 +y_0=-3421238.225 +a=6378140 +b=6356755.288157528 +units=m +no_defs");           
            GeoScene.Data.GSOPoint2d result = GeoScene.Data.GSOProjectManager.Inverse(pt2d, id);
            return result;
            //+proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=499885 +y_0=6 +ellps=krass +units=m +no_defs
        }

        private GSOFeatureDataset CreateDBFeatureDataset(string name)
        {
            if (comboBoxShpLayerList.SelectedItem == null)
            {
                MessageBox.Show("请选择一个Shp图层!", "提示");
                return null;
            }
            GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxShpLayerList.SelectedItem.ToString().Trim());
            if (layer == null)
            {
                MessageBox.Show("Shp图层为空!", "提示");
                return null;
            }
            GSOFeatures features = layer.GetAllFeatures();
            if (features.Length == 0)
            {
                MessageBox.Show("图层要素个数为0!", "提示");
                return null;
            }
            GSOFeatureDataset featureDataset = layer.Dataset as GSOFeatureDataset;
            if (featureDataset == null)
            {
                MessageBox.Show("Shp图层不是矢量图层!", "提示");
                return null;
            }

           //GSODataSource ds = Utility.getDataSourceByFullName(globeControl1, comboBoxDataSourceList.SelectedItem.ToString().Trim());
            if (ds == null)
            {
                MessageBox.Show("选择的目标数据源为空!", "提示");
                return null ;
            }
            GSOFeatureDataset newFeatureDataset = ds.CreateFeatureDataset(name);
            if (newFeatureDataset != null)
            {
                for (int i = 0; i < featureDataset.FieldCount; i++)
                {
                    GeoScene.Data.GSOFieldAttr fielddef = featureDataset.GetField(i);

                    GSOFieldAttr field = new GSOFieldAttr();
                    //field.Name = fielddef.Name;
                    field.Name = en_cns.ContainsKey(fielddef.Name) == true ? en_cns[fielddef.Name].ToString() : fielddef.Name;
                    field.Type = fielddef.Type;
                    field.Width = fielddef.Width;
                    field.Precision = fielddef.Precision;
                    bool res = newFeatureDataset.AddField(field);
                }
                newFeatureDataset.Save();
            }
            return newFeatureDataset;
        }

        private void pipelineTypeCbo_SelectedIndexChanged(object sender, EventArgs e)
        {
            if ((pipelineTypeCbo.Text != "给水") && (pipelineTypeCbo.Text != "天然气") &&
             (pipelineTypeCbo.Text != "燃气") && (pipelineTypeCbo.Text != "中水"))
            {
                cmbReference.Text = "管底";
            }
            else
            {
                cmbReference.Text = "管顶";
            }

            if (pipelineTypeCbo.Text == "给水")
            {
                btnPipelineColor.BackColor = Color.FromArgb(0, 0, 255);
            }
            else if (pipelineTypeCbo.Text == "供电")
            {
                btnPipelineColor.BackColor = Color.FromArgb(255, 100, 150);
            }
            else if (pipelineTypeCbo.Text == "雨水")
            {
                btnPipelineColor.BackColor = Color.FromArgb(230, 120, 0);
            }
            else if (pipelineTypeCbo.Text == "污水")
            {
                btnPipelineColor.BackColor = Color.FromArgb(128, 64, 0);
            }
            else if (pipelineTypeCbo.Text == "天然气")
            {
                btnPipelineColor.BackColor = Color.FromArgb(215, 0, 64);
            }
            else if (pipelineTypeCbo.Text == "共通")
            {
                btnPipelineColor.BackColor = Color.FromArgb(0, 255, 0);
            }
            else if (pipelineTypeCbo.Text == "电通")
            {
                btnPipelineColor.BackColor = Color.FromArgb(0, 255, 0);
            }
            else if (pipelineTypeCbo.Text == "有线电视")
            {
                btnPipelineColor.BackColor = Color.FromArgb(0, 255, 0);
            }
            else if (pipelineTypeCbo.Text == "监控")
            {
                btnPipelineColor.BackColor = Color.FromArgb(0, 255, 0);
            }
            else if (pipelineTypeCbo.Text == "交通信号")
            {
                btnPipelineColor.BackColor = Color.FromArgb(0, 255, 0);
            }
            else if (pipelineTypeCbo.Text == "路灯")
            {
                btnPipelineColor.BackColor = Color.FromArgb(255, 0, 150);
            }
            else if (pipelineTypeCbo.Text == "通讯")
            {
                btnPipelineColor.BackColor = Color.FromArgb(0, 255, 0);
            }
            else
            {
                btnPipelineColor.BackColor = Color.FromArgb(0, 0, 0);
            }
        }

        private object convertFieldValue(string fieldname, object obj)
        {
            if (obj == null)
                return null;

            try
            {
                string type = fields_types[fieldname].ToString();
                switch (type)
                {
                    case "string":
                        return obj.ToString();
                    case "int":
                        //return 101;
                        int intResult;
                        if (int.TryParse(obj.ToString(), out intResult))
                            return intResult;
                        else
                            return null;
                    case "double":
                        //return 202.5;
                        double doubleResult;
                        if (double.TryParse(obj.ToString(), out doubleResult))
                            return doubleResult;
                        else
                            return null;
                    case "date":
                        DateTime dtResult;
                        if (DateTime.TryParse(obj.ToString(), out dtResult))
                            return dtResult;
                        else
                            return null;
                }
                return null;
            }
            catch (Exception ex)
            {
                LogError.PublishError(ex);
                return null;
            }
        }

        /// <summary>
        /// 验证shp格式文件
        /// </summary>
        /// <param name="layer"></param>
        /// <returns></returns>
        private string valiPipeData(GSOLayer layer) //验证shp格式文件
        {
            string txtMessage = "";
            if (layer != null)
            {
                GSOFeatureDataset featDataSet = layer.Dataset as GSOFeatureDataset;
                List<string> lstField = new List<string>();
                List<string> listFieldType_Text = new List<string>();
                for (int i = 0; i < featDataSet.FieldCount; i++)
                {
                    string fieldName = featDataSet.GetField(i).Name;
                    lstField.Add(fieldName);
                    if (fields_types.ContainsKey(fieldName))
                    {
                        string fieldType = fields_types[fieldName].ToString().ToUpper();
                        switch (featDataSet.GetField(i).Type)
                        {
                            case EnumFieldType.Text:
                                if (fieldType != "string".ToUpper())
                                {
                                    txtMessage += "" + fieldName + "数据类型不正确\r\n";
                                }
                                listFieldType_Text.Add(fieldName);
                                break;
                            case EnumFieldType.INT32:
                                if (fieldType != "int".ToUpper() && fieldType != "double".ToUpper())
                                {
                                    txtMessage += "" + fieldName + "数据类型不正确\r\n";
                                }
                                break;
                            case EnumFieldType.INT16:
                                if (fieldType != "int".ToUpper() && fieldType != "double".ToUpper())
                                {
                                    txtMessage += "" + fieldName + "数据类型不正确\r\n";
                                }
                                break;
                            case EnumFieldType.Double:
                                if (fieldType != "double".ToUpper())
                                {
                                    txtMessage += "" + fieldName + "数据类型不正确\r\n";
                                }
                                break;
                            case EnumFieldType.Date:
                                if (fieldType != "date".ToUpper())
                                {
                                    txtMessage += "" + fieldName + "数据类型不正确\r\n";
                                }
                                break;
                        }
                    }

                }
                if (!lstField.Contains("Deep1"))
                {
                    txtMessage += "Deep1字段不存在!\r\n";
                }
                else
                {
                    GSOFieldAttr fieldDeep1 = featDataSet.GetField("Deep1");
                    if (fieldDeep1.Type != EnumFieldType.Double && fieldDeep1.Type != EnumFieldType.Float && fieldDeep1.Type != EnumFieldType.INT16 && fieldDeep1.Type != EnumFieldType.INT32)
                    {
                        txtMessage += "Deep1字段必须为数值类型\r\n";
                    }
                }
                if (!lstField.Contains("Deep2"))
                {
                    txtMessage += "Deep2字段不存在!\r\n";
                }
                else
                {
                    GSOFieldAttr fieldDeep1 = featDataSet.GetField("Deep2");
                    if (fieldDeep1.Type != EnumFieldType.Double && fieldDeep1.Type != EnumFieldType.Float && fieldDeep1.Type != EnumFieldType.INT16 && fieldDeep1.Type != EnumFieldType.INT32)
                    {
                        txtMessage += "Deep2字段必须为数值类型\r\n";
                    }
                }
                if (!lstField.Contains("Diameter"))
                {
                    txtMessage += "Diameter字段不存在!\r\n";
                }
                else
                {
                    GSOFieldAttr fieldDeep1 = featDataSet.GetField("Diameter");
                    if (fieldDeep1.Type != EnumFieldType.Double && fieldDeep1.Type != EnumFieldType.Float && fieldDeep1.Type != EnumFieldType.INT16 && fieldDeep1.Type != EnumFieldType.INT32)
                    {
                        txtMessage += "Diameter字段必须为数值类型\r\n";
                    }
                }
                if (!lstField.Contains("Handle"))
                {
                    txtMessage += "Handle字段不存在!\r\n";
                }
                List<string> lstHandle = new List<string>();
                for (int i = 0; i < layer.GetAllFeatures().Length; i++)
                {
                    GSOFeature f = layer.GetAt(i);
                    for (int j = 0; j < listFieldType_Text.Count; j++)
                    {
                        string fieldName = listFieldType_Text[j];
                        if (fields_types.ContainsKey(fieldName))
                        {
                            if (f.GetValue(fieldName).ToString().Trim().Length > 8000)
                            {
                                txtMessage += "ID为" + f.ID + "的要素的字段" + fieldName + "的长度大于8000 !\r\n";
                            }
                        }
                    }
                    if (f.GetFieldAsFloat("Diameter") <= 0)
                    {
                        txtMessage += "ID为" + f.ID + "\"Diameter\"字段中的值必须大于0 \r\n";
                    }
                    if (!lstHandle.Contains(f.GetFieldAsString("Handle")))
                    {
                        lstHandle.Add(f.GetFieldAsString("Handle"));
                    }
                    else
                    {
                        txtMessage += "ID为" + f.ID + "的\"Handle\"字段中的值重复\r\n";
                    }
                }
            }
            return txtMessage;
        }

    }
}