Newer
Older
EMS_SZ / FrmCompareLayers.cs
root on 21 Mar 2016 21 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 GeoScene.Data;
using GeoScene.Engine;
using GeoScene.Globe;
using System.IO;

namespace Cyberpipe
{
    public partial class FrmCompareLayers : Form
    {
        GSOGlobeControl globeControl1;
        GSOGlobeControl globeControl2;
        public FrmCompareLayers(GSOGlobeControl _globeControl1)
        {
            InitializeComponent();
            globeControl1 = _globeControl1;
        }
       
        public FrmCompareLayers(GSOGlobeControl _globeControl1, GSOGlobeControl _globeControl2)
        {
            InitializeComponent();
            globeControl1 = _globeControl1;
            globeControl2 = _globeControl2;
        }
        /// <summary>
        /// 下拉框选项填充,表格清空
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmCompareLayers_Load(object sender, EventArgs e)
        {
            comboBoxReallyLayer.Items.Clear();
            for (int i = 0; i < globeControl1.Globe.Layers.Count; i++)
            {
                GSOLayer layer = globeControl1.Globe.Layers[i];
                if (layer != null)
                {
                    if (layer.Name.Contains("fttp:") == false && layer.Visible == true)
                    {
                        comboBoxReallyLayer.Items.Add(layer.Caption);
                    }
                }
            }
            if (globeControl2 != null)
            {
                comboBoxdesignLayer.Items.Clear();

                for (int i = 0; i < globeControl2.Globe.Layers.Count; i++)
                {
                    GSOLayer layer = globeControl2.Globe.Layers[i];
                    if (layer != null)
                    {
                        if (layer.Name.Contains("fttp:") == false && layer.Visible == true)
                        {
                            comboBoxdesignLayer.Items.Add(layer.Caption);
                        }
                    }
                }
            }
        }

        private void lineLayerCompare(GSOLayer src, GSOLayer dsc, DataGridView dg, double bufferWidth)
        {
            GSOFeatureDataset srcDataset = src.Dataset as GSOFeatureDataset;

            //初始化数据表
            dg.Rows.Clear();
            dg.Columns.Clear();
            for (int i = 0; i < srcDataset.FieldCount; i++)
            {
                GSOFieldAttr designField = srcDataset.GetField(i);
                dg.Columns.Add(designField.Name, designField.Name);
            }
            dg.Columns.Add("长度", "长度");

             for (int j = 0; j < src.GetAllFeatures().Length; j++)
             {
                 GSOFeature srcFeature = src.GetAt(j);
                 GSOGeoPolyline3D srcLine = srcFeature.Geometry as GSOGeoPolyline3D;

                 GSOGeoPolygon3D bufferPolygon = srcLine.CreateBuffer(bufferWidth, true, 5, true, false);
                 if (bufferPolygon != null)
                 {
                     GSOFeatures featuresInDscLayer = dsc.FindFeaturesInPolygon(bufferPolygon, true);
                     if (featuresInDscLayer != null && featuresInDscLayer.Length > 0)
                     {
                         bool isHasPolyLine = false;
                         for (int i = 0; i < featuresInDscLayer.Length; i++)
                         {
                             if (featuresInDscLayer[i] != null && featuresInDscLayer[i].Geometry != null && featuresInDscLayer[i].Geometry.Type == EnumGeometryType.GeoPolyline3D)
                             {
                                 isHasPolyLine = true;
                                 break;
                             }
                         }

                         if (isHasPolyLine == false)
                         {
                             int rowIndex = dg.Rows.Add();
                             for (int m = 0; m < srcDataset.FieldCount; m++)
                             {
                                 dg.Rows[rowIndex].Cells[m].Value = srcFeature.GetValue(m);
                                 dg.Rows[rowIndex].Tag = srcFeature;
                             }
                             //TODO LIST保存管线长度
                             dg.Rows[rowIndex].Cells[srcDataset.FieldCount].Value = srcLine.GetSpaceLength(true, 6378137);
                         }
                     }
                     else
                     {
                         int rowIndex = dg.Rows.Add();
                         for (int k = 0; k < srcDataset.FieldCount; k++)
                         {
                             dg.Rows[rowIndex].Cells[k].Value = srcFeature.GetValue(k);
                             dg.Rows[rowIndex].Tag = srcFeature;
                         }
                         //TODO LIST保存管线长度
                         dg.Rows[rowIndex].Cells[srcDataset.FieldCount].Value = srcLine.GetSpaceLength(true, 6378137);
                     }
                 }
             }

        }

        private void pointLayerCompare(GSOLayer src, GSOLayer dsc, DataGridView dg, double bufferWidth)
        {
            dg.Rows.Clear();
            dg.Columns.Clear();
            GSOFeatureDataset srcDataset = src.Dataset as GSOFeatureDataset;

            for (int i = 0; i < srcDataset.FieldCount; i++)
            {
                GSOFieldAttr designField = srcDataset.GetField(i);
                dg.Columns.Add(designField.Name, designField.Name);
            }


            globeControl1.Globe.MemoryLayer.RemoveAllFeature();
            GSOLayer pointLayer = globeControl1.Globe.MemoryLayer;

            //将src缓存到点图层
            for (int j = 0; j < src.GetAllFeatures().Length; j++)
            {
                GSOFeature srcFeature = src.GetAt(j);
                if (srcFeature != null && srcFeature.Geometry != null)
                {
                    GSOPoint3d srcPoint = new GSOPoint3d();
                    GSOGeoModel srcModel = srcFeature.Geometry as GSOGeoModel;
                    srcPoint = srcModel.Position;
                    if (srcPoint != null)
                    {
                        GSOGeoPoint3D point3D = new GSOGeoPoint3D();
                        point3D.Position = srcPoint;
                        GSOFeature featurePoint3D = new GSOFeature();
                        featurePoint3D.Geometry = point3D;
                        pointLayer.AddFeature(featurePoint3D);
                    }
                }
            }

            for (int i = 0; i < dsc.GetAllFeatures().Length; i++)
            {
                GSOFeature dscFeature = dsc.GetAt(i);
                if (dscFeature != null && dscFeature.Geometry != null)
                {
                    GSOPoint3d dscPoint = new GSOPoint3d();

                    GSOGeoModel dscModel = dscFeature.Geometry as GSOGeoModel;
                    dscPoint = dscModel.Position;

                    if (dscPoint != null)
                    {
                        GSOGeoPolyline3D bufferLine = new GSOGeoPolyline3D();
                        GSOPoint3ds part = new GSOPoint3ds();
                        part.Add(dscPoint);
                        GSOPoint3d point1 = dscPoint;
                        point1.X += 0.000000001;
                        part.Add(point1);
                        bufferLine.AddPart(part);
                        GSOGeoPolygon3D bufferPolygon = bufferLine.CreateBuffer(0.3, true, 5, true, false);
                        if (bufferPolygon != null)
                        {
                            GSOFeatures featuresInPolygon = pointLayer.FindFeaturesInPolygon(bufferPolygon, true);
                            if (featuresInPolygon == null || featuresInPolygon.Length == 0)
                            {
                                int rowIndex = dg.Rows.Add();
                                for (int j = 0; j < srcDataset.FieldCount; j++)
                                {
                                    dg.Rows[rowIndex].Cells[j].Value = dscFeature.GetValue(j);
                                    dg.Rows[rowIndex].Tag = dscFeature;
                                }
                              
                            }
                        }
                    }
                }
            }
            if (pointLayer.Dataset != null)
            {
                pointLayer.Dataset.Close();
            }
            pointLayer.RemoveAllFeature();

        }

        private void layerCompare(GSOLayer designLayer, GSOLayer reallyLayer)
        { 
            //TODO LIST:判断两个图层是否属于用一种类型的管线,目前只考虑图层为单一类型图层
            GSOFeature deLayerFeatureTemp = designLayer.GetAt(0);
            GSOFeature reLayerFeatureTemp = reallyLayer.GetAt(0);

            GSOFeatureDataset designDataset = designLayer.Dataset as GSOFeatureDataset;
            GSOFeatureDataset reallyDataset = reallyLayer.Dataset as GSOFeatureDataset;

            if (deLayerFeatureTemp.Geometry.Type != reLayerFeatureTemp.Geometry.Type)
            {
                MessageBox.Show("请选择同种类型图层!");
                return;
            }

            if (deLayerFeatureTemp.Geometry.Type == reLayerFeatureTemp.Geometry.Type &&
                deLayerFeatureTemp.Geometry.Type == EnumGeometryType.GeoModel)
            {
                //TODO LIST按之前的方式处理点的方式
                pointLayerCompare(designLayer, reallyLayer, this.dataGridViewReallyLayer, 0.3);
                pointLayerCompare(reallyLayer, designLayer, this.dataGridViewDesignLayer, 0.3);
            }
            else if (deLayerFeatureTemp.Geometry.Type == reLayerFeatureTemp.Geometry.Type &&
                deLayerFeatureTemp.Geometry.Type == EnumGeometryType.GeoPolyline3D)
            {
                //TODO LIST按缓冲区的方式处理线的方式
                lineLayerCompare(designLayer, reallyLayer, this.dataGridViewDesignLayer, 0.3);
                lineLayerCompare(reallyLayer, designLayer, this.dataGridViewReallyLayer, 0.3);
            }
            else
            {
                MessageBox.Show("无法处理该类型图层!");
                return;
            }

        }

        private void buttonCompare_Click(object sender, EventArgs e)
        {
            try
            {                
                if (comboBoxdesignLayer.SelectedItem == null)
                {
                    MessageBox.Show("请选择一个规划图层!");
                    return;
                }
                string designLayerCaption = comboBoxdesignLayer.SelectedItem.ToString().Trim();

                if (comboBoxReallyLayer.SelectedItem == null)
                {
                    MessageBox.Show("请选择一个实测图层!");
                    return;
                }
                string reallyLayerCaption = comboBoxReallyLayer.SelectedItem.ToString().Trim();

                //GSOLayer designLayer = globeControl1.Globe.Layers.GetLayerByCaption(designLayerCaption);
                GSOLayer designLayer = null;
                if (globeControl2 != null)
                {
                    designLayer = globeControl2.Globe.Layers.GetLayerByCaption(designLayerCaption);
                }

                GSOLayer reallyLayer = globeControl1.Globe.Layers.GetLayerByCaption(reallyLayerCaption);
                if (designLayer == null || reallyLayer == null)
                {
                    MessageBox.Show("选择的图层为空!");
                    return;
                }

                GSOFeatureDataset designDataset = designLayer.Dataset as GSOFeatureDataset;
                GSOFeatureDataset reallyDataset = reallyLayer.Dataset as GSOFeatureDataset;
                if (designDataset == null || reallyDataset == null)
                {
                    MessageBox.Show("选择的图层不是矢量图层!");
                    return;
                }
                this.Cursor = Cursors.WaitCursor;
              
               // labelReallyTotal.Text = "实测图层比规划图层多出 " + dataGridViewReallyLayer.Rows.Count + " 个对象";
                layerCompare(designLayer, reallyLayer);
                this.Cursor = Cursors.Default;
            }
            catch (Exception ex)
            {
                //MessageBox.Show(ex.Message);
                this.Cursor = Cursors.Default;
            }
        }

        private void dataGridViewDesignLayer_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.RowIndex != -1)
            {
                GSOFeature feature = dataGridViewDesignLayer.Rows[e.RowIndex].Tag as GSOFeature;
                if (feature != null)
                {
                    //globeControl1.Globe.FlyToFeature(feature, 45, 0, 5);
                    //feature.HighLight = true;
                    globeControl1.Globe.JumpToFeature(feature, 300);
                    globeControl2.Globe.JumpToFeature(feature, 300);
                }
            }
        }

        private void dataGridViewReallyLayer_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.RowIndex != -1)
            {
                GSOFeature feature = dataGridViewReallyLayer.Rows[e.RowIndex].Tag as GSOFeature;
                if (feature != null)
                {
                   // globeControl1.Globe.FlyToFeature(feature, 45, 0, 5);
                    //feature.HighLight = true;
                    globeControl1.Globe.JumpToFeature(feature, 300);
                    globeControl2.Globe.JumpToFeature(feature, 300);
                }
            }
        }

        private void dataGridViewDesignLayer_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                DataGridView.HitTestInfo hitTestInfo = dataGridViewDesignLayer.HitTest(e.X, e.Y);
                if (hitTestInfo != null && hitTestInfo.RowIndex != -1)
                {
                    GSOFeature feature = dataGridViewDesignLayer.Rows[hitTestInfo.RowIndex].Tag as GSOFeature;
                    for (int i = 0; i < dataGridViewDesignLayer.SelectedRows.Count; i++)
                    {
                        dataGridViewDesignLayer.SelectedRows[i].Selected = false;
                    }
                    dataGridViewDesignLayer.Rows[hitTestInfo.RowIndex].Selected = true;
                    if (feature != null)
                    {
                        contextMenuStrip1.Tag = feature;
                        contextMenuStrip1.Show(dataGridViewDesignLayer, e.Location);
                    }
                }
            }
        }

        private void dataGridViewReallyLayer_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                DataGridView.HitTestInfo hitTestInfo = dataGridViewReallyLayer.HitTest(e.X, e.Y);
                if (hitTestInfo != null && hitTestInfo.RowIndex != -1)
                {
                    GSOFeature feature = dataGridViewReallyLayer.Rows[hitTestInfo.RowIndex].Tag as GSOFeature;
                    for (int i = 0; i < dataGridViewReallyLayer.SelectedRows.Count; i++)
                    {
                        dataGridViewReallyLayer.SelectedRows[i].Selected = false;
                    }
                    dataGridViewReallyLayer.Rows[hitTestInfo.RowIndex].Selected = true;
                    if (feature != null)
                    {
                        contextMenuStrip1.Tag = feature;
                        contextMenuStrip1.Show(dataGridViewReallyLayer, e.Location);
                    }
                }
            }
        }
      
        private void 飞行ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            GSOFeature feature = contextMenuStrip1.Tag as GSOFeature;
            if (feature != null)
            {
               // globeControl1.Globe.FlyToFeature(feature, 45, 0, 5);
                globeControl1.Globe.JumpToFeature(feature, 300);
                globeControl2.Globe.JumpToFeature(feature, 300);
            }
        }

        private void 闪烁ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
            timer1.Start();
        }
        int count = 0;
        private void timer1_Tick(object sender, EventArgs e)
        {
            GSOFeature feature = contextMenuStrip1.Tag as GSOFeature;
            if (feature != null && feature.Geometry != null)
            {
                GSOStyle3D style = feature.Geometry.Style as GSOStyle3D;
                if (style != null)
                {
                    style.UsingBlur = count % 2 == 0 ? true : false;
                    if (count++ >= 31)
                    {
                        style.UsingBlur = false;
                        timer1.Stop();
                        count = 0;
                    }
                }
                else
                {
                    style = new GSOEntityStyle3D();
                    style.UsingBlur = count % 2 == 0 ? true : false;
                    feature.Geometry.Style = style;                    
                    if (count++ >= 31)
                    {
                        style.UsingBlur = false;
                        timer1.Stop();
                        count = 0;
                    }
                }
            }
            globeControl1.Refresh();
            globeControl2.Refresh();
        }

        private void buttonExportDesignLayer_Click(object sender, EventArgs e)
        {
            string designLayerCaption = "";
            if (comboBoxdesignLayer.SelectedItem != null)
            {
                designLayerCaption = comboBoxdesignLayer.SelectedItem.ToString().Trim();
            }            
            ExportExcel(designLayerCaption, dataGridViewDesignLayer);
        }

        private void buttonExportReallyLayer_Click(object sender, EventArgs e)
        {
            string reallyLayerCaption = "";
            if (comboBoxReallyLayer.SelectedItem != null)
            {
                reallyLayerCaption = comboBoxReallyLayer.SelectedItem.ToString().Trim();
            }             
            ExportExcel(reallyLayerCaption, dataGridViewReallyLayer);
        }

        private void ExportExcel(string fileName, DataGridView _dataGridView)
        {
            if(_dataGridView.Rows.Count <= 0)
            {
                if(MessageBox.Show("表格中记录数量为0,是否继续导出?","提示",MessageBoxButtons.YesNo) == DialogResult.No)
                {
                    return;
                }
            }
            
            {
                SaveFileDialog dlg = new SaveFileDialog();
                dlg.Filter = "Excel files (*.xls)|*.xls";
                dlg.FilterIndex = 0;
                dlg.RestoreDirectory = true;
                dlg.Title = "保存为Excel文件";
                dlg.FileName = fileName + "-" + DateTime.Now.ToString("yyyyMMdd") + ".xls";
                if (dlg.ShowDialog() == DialogResult.OK)
                {
                    Stream myStream;
                    myStream = dlg.OpenFile();
                    StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0));
                    string columnTitle = "";
                    try
                    {                        
                        //写入列标题   
                        for (int i = 0; i < _dataGridView.ColumnCount; i++)
                        {
                            if (i > 0)
                            {
                                columnTitle += "\t";
                            }
                            columnTitle += _dataGridView.Columns[i].HeaderText;
                        }
                        sw.WriteLine(columnTitle);

                        //写入列内容   
                        for (int j = 0; j < _dataGridView.Rows.Count; j++)
                        {
                            string columnValue = "";
                            for (int k = 0; k < _dataGridView.Columns.Count; k++)
                            {
                                if (k > 0)
                                {
                                    columnValue += "\t";
                                }
                                if (_dataGridView.Rows[j].Cells[k].Value == null)
                                {
                                    columnValue += "";
                                }
                                else
                                {
                                    columnValue += _dataGridView.Rows[j].Cells[k].Value.ToString().Trim();
                                }
                            }
                            sw.WriteLine(columnValue);
                        }
                        sw.Close();
                        myStream.Close();
                        if (MessageBox.Show("导出Excel文件成功!是否打开?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
                        {
                            System.Diagnostics.Process.Start(dlg.FileName);
                        }                        
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                    finally
                    {
                        sw.Close();
                        myStream.Close();
                    }
                }
            }
        }
    }
}