Newer
Older
LSPipeline / Forms / FrmAddYuBiZiShp.cs
wxn on 1 Dec 2016 16 KB first
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Collections;
using GeoScene.Data;
using System.Text.RegularExpressions;
using GeoScene.Engine;
using GeoScene.Globe;

namespace WorldGIS.Forms
{
    public partial class FrmAddYuBiZiShp : Form
    {
        GeoScene.Globe.GSOGlobeControl globeControl1;
        GSODataSource ds;
        public FrmAddYuBiZiShp(GeoScene.Globe.GSOGlobeControl _globeControl1, GSODataSource _ds)
        {
            globeControl1 = _globeControl1;
            ds = _ds;
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog dlg = new FolderBrowserDialog();
            dlg.ShowDialog();
            txtFolder.Text = dlg.SelectedPath;
        }

       

        private ArrayList files =new ArrayList ();
        private ArrayList modeltypes = new ArrayList(); // 井的型号
        private ArrayList deeps = new ArrayList();

        private void button3_Click(object sender, EventArgs e)
        {
            if (txtFolder.Text == "")
                return;

            if (cmbLayer.SelectedIndex<0)
                return;

            try
            {
                Regex regNum = new Regex("^[0-9]");

                DirectoryInfo theFolder = new DirectoryInfo(txtFolder.Text);
                foreach (FileInfo nextFile in theFolder.GetFiles())
                {
                    if (nextFile.Name.ToLower().IndexOf("3ds") > -1 || nextFile.Name.ToLower().IndexOf("gcm") > -1)
                    {
                        files.Add(nextFile.Name);
                        string temp = nextFile.Name.Substring(nextFile.Name.IndexOf("-") + 1, nextFile.Name.LastIndexOf(".") - nextFile.Name.IndexOf("-") - 1);
                        string modeltype = nextFile.Name.Substring(0, nextFile.Name.IndexOf("-"));
                        modeltypes.Add(modeltype);

                        double Num;
                        bool isNum = double.TryParse(temp, out Num);

                        if (isNum)
                        {
                            deeps.Add(Convert.ToDouble(temp));
                        }
                    }
                }
                GSOFeatureDataset featdataset = CreateDBFeatureDataset(txtLayerName.Text);
                featdataset.Open();
                
                GSOLayer shpLayer = globeControl1.Globe.Layers[cmbLayer.SelectedIndex];
                if (shpLayer == null)
                    return;

                GSOFeatures features = shpLayer.GetAllFeatures(true);

                for (int j = 0; j < features.Length; j++)
                {
                    GSOFeature f = features[j];
                    GSOGeoPoint3D shpPoint = f.Geometry as GSOGeoPoint3D;

                    double x;
                    double y;
                    
                    double rotateAngle = 0;
                    rotateAngle = (double)f.GetValue(combAngle.SelectedItem.ToString());

                    string currentModelType = f.GetValue(combCode.SelectedItem.ToString()).ToString();
                    double z = Convert.ToDouble(txtUpGround.Text);
                    
                    double deep=f.GetFieldAsDouble(combDeep.SelectedItem.ToString());
                    

                    int index = -1;
                    double diff = double.MaxValue;
                    for (int i = 0; i < deeps.Count; i++)
                    {
                        double tempdeep = Convert.ToDouble(deeps[i]);
                        string modeltype = modeltypes[i].ToString();
                        if (modeltype != currentModelType)
                        {
                            continue;
                        }

                        if (tempdeep > deep)
                        {
                            double chazhi = tempdeep - deep;
                            if (diff > chazhi)
                            {
                                diff = chazhi;
                                index = i;
                            }
                        }
                    }
                    if (index < 0)
                    {                      
                        continue;
                    }
                    
                    GSOFeature feature = featdataset.CreateFeature();
                    GSOGeoModel model = new GSOGeoModel();
                    GSOPoint3d pt = new GSOPoint3d();
                    pt.X = shpPoint.X;
                    pt.Y = shpPoint.Y;
                    pt.Z = z;

                    model.Position = pt;
                    model.Align = EnumEntityAlign.TopCenter; //接口已修复作用
                    model.AltitudeMode = EnumAltitudeMode.RelativeToGround;

                    model.RotateZ = 0 - rotateAngle * 180 / Math.PI + 90;

                    model.FilePath = txtFolder.Text + "\\" + files[index];
                    model.Name = f.GetValue(combModelName.SelectedItem.ToString()).ToString();
                    feature.Name = f.GetValue(combModelName.SelectedItem.ToString()).ToString();
                    feature.Geometry = model;
                    
                    for (int i = 0; i < feature.GetFieldCount(); i++)
                    {
                        GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(f.GetFieldDefn(i));
                        //if (!en_cns.ContainsKey(fielddef.Name))
                        //    continue;
                      //  object fieldvalue = convertFieldValue(fielddef.Name, f.GetValue(fielddef.Name));
                        if (fielddef == null)
                            continue;
                        feature.SetValue(fielddef.Name, f.GetValue(fielddef.Name));
                    }
                    featdataset.AddFeature(feature);
                }

                featdataset.Save();
                this.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        

        //导入数据库
   /*     private void button3_Click(object sender, EventArgs e)
        {
            if (txtFolder.Text == "")
                return;

            if (txtPath.Text == "")
                return;


            Regex regNum = new Regex("^[0-9]");

            DirectoryInfo theFolder = new DirectoryInfo(txtFolder.Text);
            foreach (FileInfo nextFile in theFolder.GetFiles())
            {
                if (nextFile.Name.ToLower().IndexOf("3ds") > -1 || nextFile.Name.ToLower().IndexOf("gcm") > -1)
                {
                    files.Add(nextFile.Name);
                    string temp = nextFile.Name.Substring(nextFile.Name.IndexOf("-")+1, nextFile.Name.LastIndexOf(".") - nextFile.Name.IndexOf("-")-1);
                    string modeltype = nextFile.Name.Substring(0,nextFile.Name.IndexOf("-"));
                    modeltypes.Add(modeltype);

                    double Num;
                    bool isNum = double.TryParse(temp, out Num);

                    if (isNum)
                    {
                        deeps.Add(Convert.ToDouble(temp));
                    }
                }
            }

            TextReader tr = new StreamReader(txtPath.Text);
   
            string line = tr.ReadLine();

            GSOFeatureDataset featdataset = CreateDBFeatureDataset(txtLayerName.Text);
            featdataset.Open();
            while (line != null)
            {
                string[] paras = line.Split(',');

                if (paras.Length != 16)
                {
                    line = tr.ReadLine();
                    continue;
                }

                if (paras.Length <= 15)
                {
                    line = tr.ReadLine();
                    continue;
                }               

                if (paras[4] == "" || paras[5] == "" || paras[6] == "")
                {
                    line = tr.ReadLine();
                    continue;
                }
                double x;
                double y;

                if (!double.TryParse(paras[5], out x))
                {
                    line = tr.ReadLine();
                    continue;
                }

                if (!double.TryParse(paras[4], out y))
                {
                    line = tr.ReadLine();
                    continue;
                }                
                double rotateAngle = 0;
                if (!double.TryParse(paras[15], out rotateAngle))
                {
                    line = tr.ReadLine();
                    continue;
                }
                string currentModelType = paras[6];
                if (currentModelType.Length == 0)
                {
                    line = tr.ReadLine();
                    continue;
                }

                int id = GeoScene.Data.GSOProjectManager.AddProject("+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=-50000 +y_0=-4210000 +ellps=krass +units=m +no_defs");
                GeoScene.Data.GSOPoint2d pt2d = new GeoScene.Data.GSOPoint2d(x, y);
                GeoScene.Data.GSOPoint2d result = GeoScene.Data.GSOProjectManager.Inverse(pt2d, id);

                double z = Convert.ToDouble(txtUpGround.Text);
                GSOFeature feature = featdataset.CreateFeature();
                double deep;
                if (!double.TryParse(paras[8],out deep))
                {
                    line = tr.ReadLine();
                    continue;
                }

                int index = -1;
                double diff = double.MaxValue;
                for (int i = 0; i < deeps.Count; i++)
                {
                    double tempdeep = Convert.ToDouble(deeps[i]);
                    string modeltype = modeltypes[i].ToString();
                    if (modeltype != currentModelType)
                    {
                        continue;
                    }

                    if ( tempdeep > deep )
                    {
                        double chazhi = tempdeep - deep;
                        if (diff > chazhi)
                        {
                            diff = chazhi;
                            index = i;
                        }
                    }
                }
                if (index < 0)
                {
                    line = tr.ReadLine();
                    continue;
                }

                //model.FilePath = txtFolder.Text + "\\" + files[index];
                //model.Position = new GSOPoint3d(result.X, result.Y, z);

                //model.Rotate(0, 0-rotateAngle*180/Math.PI + 90,0);  //旋转的轴,yz 调换了, 有bug              

                //model.Align = EnumEntityAlign.TopCenter; //接口已修复作用
                //model.AltitudeMode = EnumAltitudeMode.RelativeToGround;

                GSOGeoPoint3D pt = new GSOGeoPoint3D(result.X, result.Y, z);         
               
                //model.FilePath = Path.GetDirectoryName(Application.ExecutablePath) + "/Resource/model/tank.3ds";
                feature.Geometry = pt;

                if (paras[9].Length > 0)
                    feature.SetValue("图片编码", paras[9]);
                feature.SetValue("旋转角度", 0 - rotateAngle * 180 / Math.PI + 90);
                feature.SetValue("编号", paras[0]);
                feature.SetValue("模型路径", txtFolder.Text + "\\" + files[index]);

                featdataset.AddFeature(feature);
            
                line = tr.ReadLine();
            }
            featdataset.Save();            
            this.Close();
        }
        */
        private GSOFeatureDataset CreateDBFeatureDataset(string name)
        {       
            //GSOFeatureDataset featDs = ds.CreateFeatureDataset(name);         

            //GSOFieldAttr field = new GSOFieldAttr();
            //field.Name = "编号";
            //field.Type = EnumFieldType.Text;
            //field.Width = 30;            
            //featDs.AddField(field);

            //field = new GSOFieldAttr();
            //field.Name = "井深";
            //field.Type = EnumFieldType.Double;
            //field.Width = 8;
            //featDs.AddField(field);

            //field = new GSOFieldAttr();
            //field.Name = "图片编码";
            //field.Type = EnumFieldType.Text;
            //field.Width = 150;
            //featDs.AddField(field);

            //field = new GSOFieldAttr();
            //field.Name = "建设年代";
            //field.Type = EnumFieldType.Text;
            //field.Width = 30;
            //featDs.AddField(field);

            //field = new GSOFieldAttr();
            //field.Name = "建设单位";
            //field.Type = EnumFieldType.Text;
            //field.Width = 60;
            //featDs.AddField(field);

            //field = new GSOFieldAttr();
            //field.Name = "权属单位";
            //field.Type = EnumFieldType.Text;
            //field.Width = 30;
            //featDs.AddField(field);

            //field = new GSOFieldAttr();
            //field.Name = "备注";
            //field.Type = EnumFieldType.Text;
            //field.Width = 30;
            //featDs.AddField(field);

            //field = new GSOFieldAttr();
            //field.Name = "旋转角度";
            //field.Type = EnumFieldType.Double;
            //field.Width = 8;
            //featDs.AddField(field);

            //field = new GSOFieldAttr();
            //field.Name = "模型路径";
            //field.Type = EnumFieldType.Text;
            //field.Width = 150;
            //featDs.AddField(field);

            GSOLayer layer = globeControl1.Globe.Layers[cmbLayer.SelectedIndex];
            GSOFeatures features = layer.GetAllFeatures();
            if (features.Length == 0)
            {
                MessageBox.Show("图层要素个数为0!", "提示");
                return null;
            }

            GSOFeatureDataset featDs = ds.CreateFeatureDataset(name);
            for (int i = 0; i < features[0].GetFieldCount(); i++)
            {
                GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i));

                //if (!en_cns.ContainsKey(fielddef.Name))
                //    continue;

                GSOFieldAttr field = new GSOFieldAttr();

                field.Name = fielddef.Name;  //en_cns[fielddef.Name].ToString();
                switch (fielddef.Type)
                {
                    case EnumFieldType.Text:
                        field.Type = EnumFieldType.Text;
                        field.Width = 100;
                        break;
                    case EnumFieldType.INT32:
                        field.Type = EnumFieldType.INT32;
                        field.Width = 4;
                        break;
                    case EnumFieldType.Double:
                        field.Type = EnumFieldType.Double;
                        field.Width = 8;
                        break;
                    case EnumFieldType.Date:
                        field.Type = EnumFieldType.Date;
                        field.Width = 10;
                        break;
                }
                bool res = featDs.AddField(field);
            }

            featDs.Save();
            return featDs;

            //featDs.Save();
            //return featDs;
        }

        private void FrmAddWellShp_Load(object sender, EventArgs e)
        {
            cmbLayer.Items.Clear();
            for (int i = 0; i < globeControl1.Globe.Layers.Count; i++)
            {
                GSOLayer layer = globeControl1.Globe.Layers[i];
                cmbLayer.Items.Add(layer.Caption);
            }
        }

        private void cmbLayer_SelectedIndexChanged(object sender, EventArgs e)
        {
            GSOLayer layer = globeControl1.Globe.Layers[cmbLayer.SelectedIndex];
            GSOFeatures features = layer.GetAllFeatures();
            if (features.Length == 0)
                return;

            combCode.Items.Clear();
            combDeep.Items.Clear();
            combModelName.Items.Clear();
            combAngle.Items.Clear();
            for (int i = 0; i < features[0].GetFieldCount(); i++)
            {
                GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i));
                combCode.Items.Add(fielddef.Name);
                combDeep.Items.Add(fielddef.Name);
                combModelName.Items.Add(fielddef.Name);
                combAngle.Items.Add(fielddef.Name);         
            }
        }
    }
}