Newer
Older
GHFX_REFACTOR / FrmBufferAnalysisBSQ.cs
wxn on 2 Nov 2016 14 KB 提交
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 DevComponents.DotNetBar;
using GeoScene.Data;
using GeoScene.Engine;
using GeoScene.Globe;

namespace Cyberpipe
{
    public partial class FrmBufferAnalysisBSQ : Office2007Form
    {
        GSOGlobeControl globeControl1;
        //GSOGeoPolyline3D line;
        GSOGeoPoint3D pt;
        GSOLayer layerTemp;

        public FrmBufferAnalysisBSQ(GSOGlobeControl _globeControl1, GSOLayer layerTemp1,GSOGeoPoint3D pt1)
        {
            InitializeComponent();
            globeControl1 = _globeControl1;
            layerTemp = layerTemp1;
            pt = pt1;
        }

        private void FrmBufferAnalysis_Load(object sender, EventArgs e)
        {
            for (int i = globeControl1.Globe.Layers.Count - 1; i >= 0; i--)
            {
                GSOLayer layer = globeControl1.Globe.Layers[i];
                if (layer.Dataset != null && layer.Dataset.IsFeatureDataset)
                {
                    string name = layer.Name;
                    if (layer.Type == EnumLayerType.FeatureLayer && !name.Contains("\\"))
                    {
                        clbLayers.Items.Add(layer.Caption);
                    }
                }
            }
            if (txtRadius.Text != "" && pt != null)
            {
                drawPolygon(pt, Convert.ToDouble(txtRadius.Text));
            }
        }

        private void drawPolygon(GSOGeoPoint3D _pnt, double r)
        {
            if (new_feat != null)
            {
                layerTemp.RemoveFeatureByID(new_feat.ID);
            }
            new_feat = new GSOFeature();
            GSOPoint3ds pnts = new GSOPoint3ds();
            GSOPoint3d pnt = new GSOPoint3d();
            pnt.X = _pnt.X;
            pnt.Y = _pnt.Y;
            pnt.Z = _pnt.Z;
            pnts.Add(pnt);
            pnt.X = _pnt.X;
            pnt.Y = _pnt.Y - 0.0000000005;
            pnt.Z = _pnt.Z;
            pnts.Add(pnt);
            GSOGeoPolyline3D line = new GSOGeoPolyline3D();
            line.AddPart(pnts);
            resPolygon = line.CreateBuffer(r * 2, true, 5, true, false);
            new_feat.Geometry = resPolygon;
            layerTemp.AddFeature(new_feat);
            globeControl1.Refresh();
        }
        GSOFeature new_feat;
        GSOGeoPolygon3D resPolygon;
     
        private void txtRadius_TextChanged(object sender, EventArgs e)
        {
            dataGridViewX1.Rows.Clear();
            if (txtRadius.Text == "")
            {
                return;
            }

            double radius = 0.0;

            if (double.TryParse(txtRadius.Text, out radius) == false)
            {
                MessageBox.Show("请输入正确的缓冲半径!", "提示");
                txtRadius.Text = "";
                return;
            }
            else {
                if (pt != null)
                {
                    drawPolygon(pt, radius);
                }
            }


        }

        private void btnEnter_Click(object sender, EventArgs e)
        {
            dataGridViewX1.Rows.Clear();
            if (txtRadius.Text == "")
            {
                MessageBox.Show("请输入缓冲半径!", "提示");
                return;

            }
            else {
                if (clbLayers.CheckedItems.Count > 0)
                {
                    for (int i = 0; i < clbLayers.CheckedItems.Count; i++)
                    {
                        string layerName = clbLayers.CheckedItems[i].ToString();
                        Polygon_Contain_PointAnalysis(resPolygon, layerName);
                    }
                }
                else
                {
                    MessageBox.Show("请选择图层!", "提示");
                   
                }
            }
           
        }
        List<string> markList = new List<string>();
        private void Polygon_Contain_PointAnalysis(GSOGeoPolygon3D polygon, string layername)//方法修改,返回类型由int类型修改为GSOFeatures
        {

            GSOFeatures feats = new GSOFeatures();
            GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(layername);

            GSOFeatureLayer flayer = layer as GSOFeatureLayer;
            GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset;

            if (polygon == null)
                feats = flayer.GetAllFeatures();
            else
                feats = flayer.FindFeaturesInPolygon(polygon, false);
            if (feats.Length > 0)
            {
                for (int i = 0; i < feats.Length; i++)
                {
                    string featNum = feats[i].GetFieldAsString("编号");
                    if (feats[i].GetFieldDefn("标识器编号") != null)
                    {
                        featNum = feats[i].GetFieldAsString("标识器编号");
                    }
                    if (markList.Contains(featNum) == false)
                    {
                        DataGridViewRow row = new DataGridViewRow();
                        int index = dataGridViewX1.Rows.Add(row);
                        row = dataGridViewX1.Rows[index];
                        row.Cells["编号"].Value = featNum;
                        row.Cells["图层名称"].Value = layername;
                        markList.Add(featNum);
                    }
                    else
                    {
                        return;
                    }
                }
            }
        }

        private void txtRadius_KeyPress(object sender, KeyPressEventArgs e)
        {
            TextBox text = sender as TextBox;
            if ((e.KeyChar < 48 || e.KeyChar > 57) && (e.KeyChar != 8) && (int)e.KeyChar != 46)
            {
                e.Handled = true;
            }
            if ((int)e.KeyChar == 46)                           //小数点
            {
                if (text.Text.Length <= 0)
                    e.Handled = true;   //小数点不能在第一位
                else                                             //处理不规则的小数点
                {
                    float f;
                    float oldf;
                    bool b1 = false, b2 = false;
                    b1 = float.TryParse(text.Text, out oldf);
                    b2 = float.TryParse(text.Text + e.KeyChar.ToString(), out f);
                    if (b2 == false)
                    {
                        if (b1 == true)
                            e.Handled = true;
                        else
                            e.Handled = false;
                    }
                }
            }
        }

        private void FrmBufferAnalysis_FormClosing(object sender, FormClosingEventArgs e)
        {
            //Form1.y = 0;
            if (new_feat != null)
            {
                layerTemp.RemoveFeatureByID(new_feat.ID);
            }
            globeControl1.Globe.Action = EnumAction3D.ActionNull;
        }
        //双击定位功能
        GSOFeature m_feature;
        private void dataGridViewX1_MouseClick(object sender, MouseEventArgs e)
        {
            if (m_feature != null && m_feature.HighLight == true)
            {
                m_feature.HighLight = false;
            }
            m_feature = null;
            if (e.Button == MouseButtons.Left)
            {
                DataGridView.HitTestInfo hittestinfo = dataGridViewX1.HitTest(e.X, e.Y);
                //idx = hittestinfo.RowIndex;
                if (hittestinfo.RowIndex > -1)
                {
                    string featureName = dataGridViewX1.Rows[hittestinfo.RowIndex].Cells["编号"].Value.ToString().Trim();
                    string layerName = dataGridViewX1.Rows[hittestinfo.RowIndex].Cells["图层名称"].Value.ToString().Trim();

                    GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(layerName);
                    if (layer != null)
                    {
                        GSOFeatures features = layer.GetFeatureByName(featureName, false);
                        for (int j = 0; j < features.Length; j++)
                        {
                            if (features[j].Name == featureName)
                            {
                                m_feature = features[j];
                            }
                        }
                    }
                }
            }

            if (e.Button == MouseButtons.Right)
            {
                DataGridView.HitTestInfo hittestinfo = dataGridViewX1.HitTest(e.X, e.Y);
                if (hittestinfo.RowIndex > -1)
                {
                    string featureName = dataGridViewX1.Rows[hittestinfo.RowIndex].Cells["编号"].Value.ToString();
                    string layerName = dataGridViewX1.Rows[hittestinfo.RowIndex].Cells["图层名称"].Value.ToString().Trim();
                    contextMenuStrip1.Show(dataGridViewX1, e.X, e.Y);
                    featureName = featureName.Trim();

                    GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(layerName);
                    if (layer == null)
                        return;
                    GSOFeatures features = layer.GetFeatureByName(featureName, false);

                    for (int j = 0; j < features.Length; j++)
                    {
                        if (features[j].Name == featureName)
                        {
                            m_feature = features[j];
                            break;
                        }
                    }
                }
            }
        }
        int count = 0;
        private string flashflag = "single";
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (count < 40)
            {
                count++;
                if (flashflag == "single")
                {
                    if (m_feature != null)
                    {
                        if (count % 2 != 0)
                        {
                            m_feature.HighLight = true;
                            globeControl1.Refresh();
                        }
                        else
                        {
                            m_feature.HighLight = false;
                            globeControl1.Refresh();
                        }
                    }
                }
            }
            else
            {
                timer1.Stop();
                count = 0;
            }
        }

        private void dataGridViewX1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            try
            {

                if (e.Button == MouseButtons.Left)
                {
                    DataGridView.HitTestInfo hittestinfo = dataGridViewX1.HitTest(e.X, e.Y);
                    if (hittestinfo.RowIndex > -1)
                    {
                        string featureName = dataGridViewX1.Rows[hittestinfo.RowIndex].Cells["编号"].Value.ToString().Trim();
                        string layerName = dataGridViewX1.Rows[hittestinfo.RowIndex].Cells["图层名称"].Value.ToString().Trim();

                        //GSOLayer layer = globeControl1.Globe.Layers.GetLayerByID((int)(Utility.LayerLabel_LayerIDs[layerName]));
                        GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(layerName);
                        if (layer != null)
                        {
                            GSOFeatures features = layer.GetFeatureByName(featureName, false);
                            for (int j = 0; j < features.Length; j++)
                            {
                                if (features[j].Name == featureName)
                                {
                                    m_feature = features[j];
                                    if (m_feature.Geometry != null && m_feature.Geometry.Type == EnumGeometryType.GeoPolyline3D)
                                    {
                                        GSOGeoPolyline3D line = m_feature.Geometry as GSOGeoPolyline3D;
                                        double length = line.GetSpaceLength(true, 6378137);
                                        GSOGeoPolyline3D lineLine = line.GetSegment(0, length / 2);
                                        GSOPoint3d point3d = lineLine[lineLine.PartCount - 1][lineLine[lineLine.PartCount - 1].Count - 1];

                                        globeControl1.Globe.FlyToPosition(point3d, EnumAltitudeMode.Absolute, 0, 45, 5);
                                    }
                                    else
                                    {
                                        globeControl1.Globe.FlyToFeature(m_feature, 0, 45, 3);
                                    }
                                    LightMenu_Click(sender, e);
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                //ErrorLog.PublishError(ex);
                //ErrorLog.PublishError(ex);
                //Log.PublishError(ex);
            }
        }

        private void FlyToMenu_Click(object sender, EventArgs e)
        {
            if (m_feature != null)
            {
                if (m_feature.Geometry != null && m_feature.Geometry.Type == EnumGeometryType.GeoPolyline3D)
                {
                    GSOGeoPolyline3D line = m_feature.Geometry as GSOGeoPolyline3D;
                    double length = line.GetSpaceLength(true, 6378137);
                    GSOGeoPolyline3D lineLine = line.GetSegment(0, length / 2);
                    GSOPoint3d point3d = lineLine[lineLine.PartCount - 1][lineLine[lineLine.PartCount - 1].Count - 1];

                    globeControl1.Globe.FlyToPosition(point3d, EnumAltitudeMode.Absolute, 0, 45, 5);
                }
                else
                {
                    globeControl1.Globe.FlyToFeature(m_feature, 0, 45, 3);
                }
                LightMenu_Click(sender, e);
            }
        }

        private void LightMenu_Click(object sender, EventArgs e)
        {
            flashflag = "single";
            timer1.Start();
        }


        private void buttonXSelectAll_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < clbLayers.Items.Count; i++)
            {
                clbLayers.SetItemChecked(i, true);
            }
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            //Form1.y = 0;
            if (new_feat != null)
            {
                layerTemp.RemoveFeatureByID(new_feat.ID);
            }
            globeControl1.Refresh();
            this.Close();
        }

        private void buttonX2_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < this.clbLayers.Items.Count; i++)
            {
                this.clbLayers.SetItemChecked(i, false);
            }
        }

       
    }
}