Newer
Older
EMS_SZ / FrmCompareFeature.cs
root on 21 Mar 2016 11 KB first
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;
        }

    }
}