using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using GeoScene.Data; using GeoScene.Engine; using GeoScene.Globe; using DevComponents.DotNetBar; namespace Cyberpipe { public partial class FrmCompareFeature : Office2007Form { GSOFeature srcFeature = null; GSOFeature dscFeature = null; GSOGlobeControl globeControl1; GSOGlobeControl globeControl2; bool isSamePolyline; GSOLayer layerTemp; GSOLayer layerTemp2; GSOFeature new_feat; GSOGeoPolygon3D resPolygon; public FrmCompareFeature(GSOGlobeControl _globeControl1, GSOGlobeControl _globeControl2, GSOLayer _layerTemp, GSOLayer _layerTemp2) { globeControl1 = _globeControl1; globeControl2 = _globeControl2; InitializeComponent(); globeControl1.Globe.Action = EnumAction3D.SelectObject; globeControl2.Globe.Action = EnumAction3D.SelectObject; layerTemp = _layerTemp; layerTemp2 = _layerTemp2; globeControl1.MouseClick += new MouseEventHandler(globeControl1_MouseClick); globeControl2.MouseClick += new MouseEventHandler(globeControl2_MouseClick); } private void buttonAnalysis_Click(object sender, EventArgs e) { dataGridViewX1.DataSource = null; srcFeature = globeControl1.Globe.SelectedObject; dscFeature = globeControl2.Globe.SelectedObject; double bufferWidth = Convert.ToDouble(textBox1.Text.ToString()); if (srcFeature != null && dscFeature != null) { if (srcFeature.Geometry.Type != dscFeature.Geometry.Type) { MessageBox.Show("请选择同种类型图层!"); return; } //TODO LIST按之前的方式处理点的方式 //if (srcFeature.Geometry.Type == dscFeature.Geometry.Type && // srcFeature.Geometry.Type == EnumGeometryType.GeoModel) //{ //pointLayerCompare(designLayer, reallyLayer, this.dataGridViewReallyLayer, 0.3); //pointLayerCompare(reallyLayer, designLayer, this.dataGridViewDesignLayer, 0.3); //} //TODO LIST按缓冲区的方式处理线的方式 else if (srcFeature.Geometry.Type == dscFeature.Geometry.Type && srcFeature.Geometry.Type == EnumGeometryType.GeoPolyline3D) { lineLayerCompare(srcFeature, dscFeature, bufferWidth); if (isSamePolyline == true) { lineFeatureCompare(srcFeature, dscFeature); } else { MessageBox.Show("实测管段与施工管段非同一条管段,请选择同一管段进行比较!", "提示"); } } else { MessageBox.Show("无法处理该类型图层!"); return; } } else { MessageBox.Show("请选择要对比的管段!", "提示"); } } /// <summary> /// 在容差范围内判断是否同一根管段 /// </summary> /// <param name="srcFeature"></param> /// <param name="dscFeature"></param> /// <param name="bufferWidth"></param> /// <returns></returns> private bool lineLayerCompare(GSOFeature srcFeature, GSOFeature dscFeature, double bufferWidth) { isSamePolyline = false; GSOGeoPolyline3D srcLine = srcFeature.Geometry as GSOGeoPolyline3D; GSOGeoPolygon3D srcBufferPolygon = srcLine.CreateBuffer(bufferWidth * 2, true, 5, true, false); GSOLayer dsc = globeControl2.Globe.Layers.GetLayerByCaption(dscFeature.Dataset.Caption); if (srcBufferPolygon != null) { GSOFeatures featuresInSrcLayer = dsc.FindFeaturesInPolygon(srcBufferPolygon, true); if (featuresInSrcLayer != null && featuresInSrcLayer.Length > 0) { for (int i = 0; i < featuresInSrcLayer.Length; i++) { if (featuresInSrcLayer[i].Name == dscFeature.Name) { isSamePolyline = true; break; } } } } GSOGeoPolyline3D dscLine = dscFeature.Geometry as GSOGeoPolyline3D; GSOGeoPolygon3D dscBufferPolygon = dscLine.CreateBuffer(bufferWidth * 2, true, 5, true, false); GSOLayer src = globeControl1.Globe.Layers.GetLayerByCaption(srcFeature.Dataset.Caption); if (dscBufferPolygon != null) { GSOFeatures featuresInDscLayer = src.FindFeaturesInPolygon(dscBufferPolygon, true); if (featuresInDscLayer != null && featuresInDscLayer.Length > 0) { for (int i = 0; i < featuresInDscLayer.Length; i++) { if (featuresInDscLayer[i].Name == srcFeature.Name) { isSamePolyline = true; break; } } } } return isSamePolyline; } /// <summary> /// 分析两根管段的具体差异 /// </summary> /// <param name="srcFeature"></param> /// <param name="dscFeature"></param> private void lineFeatureCompare(GSOFeature srcFeature, GSOFeature dscFeature) { GSOGeoPolyline3D srcLine = srcFeature.Geometry as GSOGeoPolyline3D; double srcLineLength = srcLine.GetSpaceLength(false, 6378137); GSOGeoPolyline3D dscLine = dscFeature.Geometry as GSOGeoPolyline3D; double dscLineLength = dscLine.GetSpaceLength(false, 6378137); double horizonDistance = HorizonDistance(srcLine, dscLine); DataTable dt = new DataTable(); dt.Columns.Add("数据名称"); dt.Columns.Add("图层名称"); dt.Columns.Add("管段编号"); dt.Columns.Add("管段长度"); dt.Columns.Add("材质"); dt.Columns.Add("水平距离"); DataRow srcRow = dt.NewRow(); srcRow[0] = "实测数据"; srcRow[1] = srcFeature.Dataset.Caption; srcRow[2] = srcFeature.Name; srcRow[3] = srcLineLength.ToString("0.000"); srcRow[4] = srcFeature.GetFieldAsString("材质"); srcRow[5] = horizonDistance.ToString("0.000"); dt.Rows.Add(srcRow); DataRow dscRow=dt.NewRow(); dscRow[0] = "施工数据"; dscRow[1] = dscFeature.Dataset.Caption; dscRow[2] = dscFeature.Name; dscRow[3] = dscLineLength.ToString("0.000"); dscRow[4] = dscFeature.GetFieldAsString("材质"); dscRow[5] = horizonDistance.ToString("0.000"); dt.Rows.Add(dscRow); dataGridViewX1.DataSource = dt; } private void FrmCompareFeature_FormClosing(object sender, FormClosingEventArgs e) { globeControl1.Globe.Action = EnumAction3D.ActionNull; globeControl2.Globe.Action = EnumAction3D.ActionNull; } /// <summary> /// 地球1中点击地球2中同步添加缓冲区 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void globeControl1_MouseClick(object sender, MouseEventArgs e) { try { double bufferWidth = Convert.ToDouble(textBox1.Text.ToString()); resPolygon = null; layerTemp.RemoveAllFeature(); if (new_feat != null) { layerTemp2.RemoveFeatureByID(new_feat.ID); } if (globeControl1.Globe.Action == EnumAction3D.SelectObject && globeControl1.Globe.SelectedObject != null) { GSOGeoPolyline3D line = globeControl1.Globe.SelectedObject.Geometry as GSOGeoPolyline3D; new_feat = new GSOFeature(); resPolygon = line.CreateBuffer(bufferWidth * 2, true, 0, false, false); resPolygon.AltitudeMode = EnumAltitudeMode.RelativeToGround; new_feat.Geometry = resPolygon; layerTemp.AddFeature(new_feat); layerTemp2.AddFeature(new_feat); globeControl1.Refresh(); globeControl2.Refresh(); } } catch (Exception ex) { } } /// <summary> /// 地球2中点击地球1中同步添加缓冲区 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void globeControl2_MouseClick(object sender, MouseEventArgs e) { try { double bufferWidth = Convert.ToDouble(textBox1.Text.ToString()); resPolygon = null; layerTemp.RemoveAllFeature(); if (new_feat != null) { layerTemp2.RemoveFeatureByID(new_feat.ID); } if (globeControl2.Globe.Action == EnumAction3D.SelectObject && globeControl2.Globe.SelectedObject != null) { GSOGeoPolyline3D line = globeControl2.Globe.SelectedObject.Geometry as GSOGeoPolyline3D; new_feat = new GSOFeature(); resPolygon = line.CreateBuffer(bufferWidth * 2, true, 0, false, false); resPolygon.AltitudeMode = EnumAltitudeMode.RelativeToGround; new_feat.Geometry = resPolygon; layerTemp.AddFeature(new_feat); layerTemp2.AddFeature(new_feat); globeControl1.Refresh(); globeControl2.Refresh(); } } catch (Exception ex) { } } /// <summary> /// 计算水平距离 /// </summary> /// <param name="line1"></param> /// <param name="line2"></param> /// <returns></returns> private double HorizonDistance(GSOGeoPolyline3D line1, GSOGeoPolyline3D line2) { GSOPoint3d pntIntersect1 = new GSOPoint3d(); GSOPoint3d pntIntersect2 = new GSOPoint3d(); GSOPoint3d pntProIntersect1 = new GSOPoint3d(); GSOPoint3d pntProIntersect2 = new GSOPoint3d(); GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D; GSOPipeLineStyle3D pipeStyle2 = line2.Style as GSOPipeLineStyle3D; double dDist = globeControl1.Globe.Analysis3D.ComputeHorizonDistance(line1, line2, out pntIntersect1, out pntIntersect2, out pntProIntersect1, out pntProIntersect2, false); //dDist = Math.Abs(pntProIntersect1.Z - pntProIntersect2.Z) - pipeStyle1.Radius - pipeStyle2.Radius; return dDist; } } }