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(); } } } } } }