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