private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { int selectIndex = comboBox1.SelectedIndex; if (selectIndex >= 0) { layer = mGlobeControl.Globe.Layers.GetLayerByCaption(comboBox1.SelectedItem.ToString()); if (layer != null) { features = layer.GetAllFeatures(); if (features.Length > 0) { GSOFeature feature = features[0]; if (feature.GetFieldCount() > 0) { for (int i = 0; i < feature.GetFieldCount(); i++) { GSOFieldDefn defn = (GSOFieldDefn)feature.GetFieldDefn(i); listBox1.Items.Add(defn.Name); } } } } } }
//判断用户输入数据的类型 private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) { if (geoLayer != null && m_features.Length >= e.RowIndex) { int rowIndex = e.RowIndex; int columnIndex = e.ColumnIndex; string cellValue = dataGridView1.Rows[rowIndex].Cells[columnIndex].Value.ToString().Trim(); GSOFeature featureEdit = dataGridView1.Rows[rowIndex].Tag as GSOFeature;// geoLayer.GetAt(rowIndex); if (featureEdit == null) { MessageBox.Show("修改的对象不存在!", "提示"); return; } string fieldName = dataGridView1.Columns[columnIndex].Name.Trim(); GSOFieldDefn field = (GSOFieldDefn)featureEdit.GetFieldDefn(fieldName); switch (field.Type) { case EnumFieldType.INT32: int intValue = 0; if (!Int32.TryParse(cellValue, out intValue)) { MessageBox.Show("输入的数据格式不正确,请重新输入!", "提示"); dataGridView1.Rows[rowIndex].Cells[columnIndex].Value = cellValueBeginCellEdit; return; } featureEdit.SetFieldValue(fieldName, intValue); break; case EnumFieldType.Double: double doubleValue = 0; if (!double.TryParse(cellValue, out doubleValue)) { MessageBox.Show("输入的数据格式不正确,请重新输入!", "提示"); dataGridView1.Rows[rowIndex].Cells[columnIndex].Value = cellValueBeginCellEdit; return; } featureEdit.SetFieldValue(fieldName, doubleValue); break; case EnumFieldType.Date: DateTime dateTimeValue = DateTime.Now.Date; if (!DateTime.TryParse(cellValue, out dateTimeValue)) { MessageBox.Show("输入的数据格式不正确,请重新输入!", "提示"); dataGridView1.Rows[rowIndex].Cells[columnIndex].Value = cellValueBeginCellEdit; return; } featureEdit.SetFieldValue(fieldName, dateTimeValue); break; case EnumFieldType.Text: featureEdit.SetFieldValue(fieldName, cellValue); break; } } }
private void FrmAtrributeMapping_Load(object sender, EventArgs e) { this.MaximizeBox = false; if (m_feature != null) { try { //ArrayList list = new ArrayList(); dt = new DataTable(m_feature.Name); DataColumn dcName = new DataColumn("Name", typeof(string)); DataColumn dcValue = new DataColumn("Value", typeof(string)); dt.Columns.Add(dcName); dt.Columns.Add(dcValue); dt.Columns["Name"].ReadOnly = true; for (int j = 0; j < m_feature.GetFieldCount(); j++) { DataRow dr = dt.NewRow(); GSOFieldDefn field = (GSOFieldDefn)m_feature.GetFieldDefn(j); if (field != null) { dr["Name"] = field.Name; object obj = m_feature.GetValue(j); if (obj != null) { dr["Value"] = obj.ToString(); DateTime date = DateTime.Now.Date; bool isDatetime = DateTime.TryParse(obj.ToString(), out date); if (isDatetime) { dr["Value"] = date.ToShortDateString(); list.Add(j); } } } dt.Rows.Add(dr); } dataGridView1.DataSource = dt; dataGridView1.Columns[0].HeaderText = "属性名"; dataGridView1.Columns[1].HeaderText = "属性值"; //for (int i = 0; i < list.Count; i++) //{ // int index = int.Parse(list[i].ToString()); // dataGridView1[1,index].ReadOnly = true; //} } catch (System.Exception exp) { Log.PublishTxt(exp); } } }
private void CtrlLineFieldsValuePage_Load(object sender, EventArgs e) { if (m_feature != null) { try { dt = new DataTable(m_feature.Name); DataColumn dcName = new DataColumn("属性名", typeof(string)); DataColumn dcValue = new DataColumn("属性值", typeof(string)); dt.Columns.Add(dcName); dt.Columns.Add(dcValue); dt.Columns["属性名"].ReadOnly = true; if (m_feature.GetFieldCount() > 0) { for (int j = 0; j < m_feature.GetFieldCount(); j++) { DataRow dr = dt.NewRow(); GSOFieldDefn field = (GSOFieldDefn)m_feature.GetFieldDefn(j); if (field != null) { dr["属性名"] = field.Name; object obj = m_feature.GetValue(j); if (obj != null) { dr["属性值"] = obj.ToString(); if (obj.GetType() == typeof(DateTime)) { DateTime date = DateTime.Parse(obj.ToString()); dr["属性值"] = date.ToShortDateString(); } } } dt.Rows.Add(dr); } } dataGridView1.DataSource = dt; dataGridView1.ReadOnly = !mlayer.Editable; dataGridView1.Columns[0].Width = 100; dataGridView1.Columns[1].Width = 200; } catch (System.Exception exp) { Log.PublishTxt(exp); } } }
private void buttonOk_Click(object sender, EventArgs e) { if (m_feature != null) { for (int j = 0; j < m_feature.GetFieldCount(); j++) { GSOFieldDefn field = (GSOFieldDefn)m_feature.GetFieldDefn(j); if (field != null) { m_feature.SetValue(CtrlLineFieldsValuePage.dt.Rows[j][0].ToString(), CtrlLineFieldsValuePage.dt.Rows[j][1].ToString()); } } } this.Close(); }
//datagrid绑定数据 public void SetDataTable(GSOFeatures feats) { if (feats.Length == 0) { MessageBox.Show("查询结果为空!", "提示"); return; } GSOFeature feat = feats[0]; try { DataTable table = new DataTable(); for (int i = 0; i < feat.GetFieldCount(); i++) { GSOFieldDefn field = (GSOFieldDefn)feat.GetFieldDefn(i); table.Columns.Add(field.Name); } for (int i = 0; i < feats.Length; i++) { GSOFeature f = feats[i]; DataRow row = table.NewRow(); for (int j = 0; j < feat.GetFieldCount(); j++) { GSOFieldDefn field = (GSOFieldDefn)feat.GetFieldDefn(j); row[j] = f.GetValue(field.Name); } table.Rows.Add(row); } dataGridView1.DataSource = table; for (int i = 0; i < feats.Length; i++) { GSOFeature f = feats[i]; if (dataGridView1.Rows.Count > i) { dataGridView1.Rows[i].Tag = f; } } } catch (System.Exception exp) { Log.PublishTxt(exp); MessageBox.Show(exp.Message, "提示"); } }
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex > -1) { bool bl = true; object obj = dt.Rows[e.RowIndex][e.ColumnIndex]; GSOFieldDefn field = (GSOFieldDefn)m_feature.GetFieldDefn(e.RowIndex); switch (field.Type) { case EnumFieldType.Float: float value = 0; bl = float.TryParse(obj.ToString(), out value); break; case EnumFieldType.Double: double value1 = 0; bl = double.TryParse(obj.ToString(), out value1); break; case EnumFieldType.INT16: Int16 value2 = 0; bl = Int16.TryParse(obj.ToString(), out value2); break; case EnumFieldType.INT32: Int32 value3 = 0; bl = Int32.TryParse(obj.ToString(), out value3); break; case EnumFieldType.INT64: Int64 value4 = 0; bl = Int64.TryParse(obj.ToString(), out value4); break; } if (!bl) { MessageBox.Show("您输入的格式不正确!", "提示"); dt.Rows[e.RowIndex][e.ColumnIndex] = m_feature.GetValue(e.RowIndex); return; } } }
private void buttonOk_Click(object sender, EventArgs e) { if (m_feature != null) { //for (int i = 0; i < list.Count; i++) //{ // int index = int.Parse(list[i].ToString()); // dataGridView1[1, index].ReadOnly = false; //} for (int j = 0; j < m_feature.GetFieldCount(); j++) { GSOFieldDefn field = (GSOFieldDefn)m_feature.GetFieldDefn(j); if (field != null) { //m_feature.SetFieldValue(j, dt.Rows[j][1].ToString()); m_feature.SetValue(dt.Rows[j][0].ToString().Trim(), dt.Rows[j][1].ToString().Trim()); } } } this.Close(); }
private string GetBubbleInfo(GSOFeature feature, string width, string height) { string str = "<!-- <BALLOON><CONTENT_CX>" + width + "</CONTENT_CX><CONTENT_CY>" + height + "</CONTENT_CY><CONTENT_TYPE>text</CONTENT_TYPE><SHOW_MODE>balloonex</SHOW_MODE>-->"; str += "<html><body><table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" style=\"width:100%;background:#FFFFFF none repeat scroll 0 0;border-collapse:collapse;font-family:\"Lucida Sans Unicode\",\"Lucida Grande\",Sans-Serif;font-size:10px;text-align:center;\" >"; for (int j = 0; j < listFields.CheckedItems.Count; j++) { GSOFieldDefn field1 = (GSOFieldDefn)feature.GetFieldDefn(listFields.CheckedItems[j].ToString()); string value1 = feature.GetFieldAsString(listFields.CheckedItems[(j)].ToString()); str += "<tr><td style=\"font-size:10pt;border:1px solid #CCCCCC;color:#666699;padding:2px 2px; background-color:#E7F3FB\"><center>" + field1.Name + "</center></td><td style=\"font-size:10pt;border:1px solid #CCCCCC;color:#666699;padding:2px 2px;\"><center>" + value1 + "</center></td></tr>"; } str += "</table></body></html>"; return(str); }
private void FrmDeleteFieldFromLayer_Load(object sender, EventArgs e) { if (layer != null) { textBoxLayerCaption.Text = layer.Caption.Trim(); if (layer.GetAllFeatures().Length > 0) { GSOFeature feature = layer.GetAt(0); if (feature != null) { for (int i = 0; i < feature.GetFieldCount(); i++) { GSOFieldDefn field = (GSOFieldDefn)feature.GetFieldDefn(i); if (field != null) { listViewFields.Items.Add(field.Name.Trim()); } } } } } }
private void FrmShowValveInformation_Load(object sender, EventArgs e) { labelValveInformation.Text = "共匹配了" + valveCount + "个阀门!";//localhost_casic_pipe_test if (features != null) { labelValveInformation.Text += "共有" + features.Length + "个阀门没有匹配!"; for (int i = 0; i < features.Length; i++) { GSOFeature f = features[i]; if (f != null) { for (int j = 0; j < f.GetFieldCount(); j++) { GSOFieldDefn fieldDefn = (GSOFieldDefn)f.GetFieldDefn(j); if (fieldDefn != null) { dataGridView1.Columns.Add(fieldDefn.Name, fieldDefn.Name); } } break; } } for (int i = 0; i < features.Length; i++) { GSOFeature f = features[i]; if (f != null) { int rowIndex = dataGridView1.Rows.Add(); for (int j = 0; j < f.GetFieldCount(); j++) { dataGridView1.Rows[rowIndex].Cells[j].Value = f.GetValue(j); } } } } }
private void btnCreateModel_Click(object sender, EventArgs e) { try { if (string.IsNullOrEmpty(txtModelLayer.Text)) { MessageBox.Show("管线模型文件路径无效!", "提示"); return; } if (File.Exists(txtModelLayer.Text)) { MessageBox.Show("管线模型文件已存在!", "提示"); return; } GSOLayer ShpSourceLayer = ctl.Globe.Layers[cmbLayer.SelectedIndex]; GSOLayer pipeModelLayer = ctl.Globe.Layers.Add(txtModelLayer.Text); string pipeRectFile = Path.GetDirectoryName(txtModelLayer.Text) + "\\" + Path.GetFileNameWithoutExtension(txtModelLayer.Text) + "_Rect" + Path.GetExtension(txtModelLayer.Text); GSOLayer layer_Rect = ctl.Globe.Layers.Add(pipeRectFile); lgdFilePath = txtModelLayer.Text; if (pipeModelLayer != null) { GSOFeatures features = ShpSourceLayer.GetAllFeatures(); string message = ""; for (int j = 0; j < features.Length; j++) { GSOFeature f = features[j]; GSOFeature newFeature = new GSOFeature(); GSOPipeLineStyle3D style = new GSOPipeLineStyle3D(); style.LineColor = Color.FromArgb(Convert.ToByte(numericUpDownLineOpaque.Value), btnPipelineColor.BackColor); double radius = 0; GSOFieldDefn diameterfield = (GSOFieldDefn)f.GetFieldDefn(cmbRadius.SelectedItem.ToString()); if (diameterfield.Type == EnumFieldType.Text) { radius = Convert.ToDouble(f.GetFieldAsString(cmbRadius.SelectedItem.ToString())) / 2000; } else { radius = f.GetFieldAsDouble(cmbRadius.SelectedItem.ToString()) / 2000; // 探测数据的单位一般是毫米,需换算为米; 管径一般是 直径, 这个需要半径, 所有除以2000 } string eventid = f.GetFieldAsString(cmbID.SelectedItem.ToString()); int num_width = f.GetFieldAsInt32(cmbWidthNum.SelectedItem.ToString()); int num_height = f.GetFieldAsInt32(cmbHeightNum.SelectedItem.ToString()); double interval = radius * 2; // f.GetFieldAsDouble(cmbInterval.SelectedItem.ToString()); double rectWidth = radius * 2 * num_width + 0.08; // 两端空出0.04 double rectHeight = radius * 2 * num_height + 0.08; if (radius == 0) { message += "ID为" + f.ID + "的管线的半径为0 \n "; continue; } style.Radius = radius; style.Slice = int.Parse(txtSlice.Text); style.CornerSliceAngle = Convert.ToDouble(textBoxCornerSliceAngle.Text); f.Geometry.AltitudeMode = EnumAltitudeMode.RelativeToGround; GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; if (line == null) { message += "ID为" + f.ID + "的管线不是线对象 \n "; continue; } double deep1 = f.GetFieldAsDouble(cmbFrom.SelectedItem.ToString()); double deep2 = f.GetFieldAsDouble(cmbTo.SelectedItem.ToString()); if (chkDeep.Checked) { deep1 = 0 - deep1; deep2 = 0 - deep2; } if (cmbReference.SelectedIndex == 0) //管底 { deep1 = deep1 + radius * 2; deep2 = deep2 + radius * 2; } else if (cmbReference.SelectedIndex == 1) //管顶 { deep1 = deep1 - radius * 2; deep2 = deep2 - radius * 2; } for (int n = 0; n < line[0].Count; n++) { GSOPoint3d pt3d = line[0][n]; int pointcount = line[0].Count; double radio = Math.Sqrt(Math.Pow(pt3d.Y - line[0][0].Y, 2) + Math.Pow(pt3d.X - line[0][0].X, 2)) / Math.Sqrt(Math.Pow(line[0][pointcount - 1].Y - line[0][0].Y, 2) + Math.Pow(line[0][pointcount - 1].X - line[0][0].X, 2)); pt3d.Z = deep1 + (deep2 - deep1) * radio; if (double.IsInfinity(pt3d.Z)) { pt3d.Z = deep2; } line[0][n] = pt3d; } if (num_height == 0 || num_width == 0) // 直埋 { newFeature.Geometry = line; newFeature.Geometry.Style = style; newFeature.Name = eventid; pipeModelLayer.AddFeature(newFeature); } else { GSOFeature rectfeat = CreatePipeRect(f, line, rectWidth, rectHeight); if (rectfeat != null) { layer_Rect.AddFeature(rectfeat); } one2Multi(line, num_width, num_height, interval, style, pipeModelLayer, eventid); } } ctl.Refresh(); pipeModelLayer.Save(); layer_Rect.Save(); string strMessage = "shp文件中共" + features.Length + "个对象,实际生成" + (pipeModelLayer.GetAllFeatures().Length + layer_Rect.GetAllFeatures().Length) + "个对象!\n"; MessageBox.Show(strMessage + message, "提示"); this.Close(); } } catch (Exception ex) { Log.PublishTxt(ex); MessageBox.Show(ex.Message); } }
private List <DataTable> CollisionAnalysis() { List <DataTable> listTable = new List <DataTable>(); GSOPoint3d pntIntersect1; GSOPoint3d pntIntersect2; int layerCount = listBox1.SelectedItems.Count; for (int i = 0; i < layerCount; i++)//遍历所有的图层 { GSOLayer layer1 = globeControl1.Globe.Layers.GetLayerByCaption(listBox1.SelectedItems[i].ToString().Trim()); if (layer1 != null) { DataTable dt = new DataTable(); if (layer1.GetAllFeatures().Length > 0) { for (int fieldName = 0; fieldName < layer1.GetAt(0).GetFieldCount(); fieldName++) { GSOFieldDefn field = (GSOFieldDefn)layer1.GetAt(0).GetFieldDefn(fieldName); dt.Columns.Add(field.Name); } } listTable.Add(dt); } } if (listTable.Count > 0 && listTable.Count == layerCount) { for (int i = 0; i < layerCount; i++)//遍历所有的图层 { GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(listBox1.SelectedItems[i].ToString().Trim()); if (layer.Caption.Contains("管线")) //过滤出管线图层 { GSOFeatureLayer flayer = layer as GSOFeatureLayer; GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset; GSOFeatures feats = flayer.GetAllFeatures(); for (int m = 0; m < feats.Length; m++) //遍历图层中的所有管线 { GSOFeature feat = feats[m]; GSOGeoPolyline3D line1 = feat.Geometry as GSOGeoPolyline3D; if (line1 == null) { continue; } GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D; if (pipeStyle1 == null) { continue; } for (int j = i; j < layerCount; j++) { GSOLayer layer2 = globeControl1.Globe.Layers.GetLayerByCaption(listBox1.SelectedItems[j].ToString().Trim()); GSOFeatureLayer flayer2 = layer2 as GSOFeatureLayer; if (layer2.Caption.Contains("管线")) { GSOFeatureDataset fdataset2 = flayer2.Dataset as GSOFeatureDataset; GSOFeatures feats2 = flayer2.GetAllFeatures(); for (int n = 0; n < feats2.Length; n++)//遍历图层中的所有管线 { if (i == j) { if (m >= n) { continue; } } GSOFeature feat2 = feats2[n]; GSOGeoPolyline3D line2 = feat2.Geometry as GSOGeoPolyline3D; if (line2 == null) { continue; } GSOPipeLineStyle3D pipeStyle2 = line2.Style as GSOPipeLineStyle3D; if (pipeStyle2 == null) { continue; } double dHonLen; double dVerLen; double dNoIntersectStartRatio = 0; // 计算两条线的距离和交点,若果失败返回-1 // 若在同一直线上,并且有交点,返回0 // 若不在同一平面,返回最近两点的距离,并且计算最近两点 double dDist = globeControl1.Globe.Analysis3D.ComputeTwoGeoPolylineDistance(line1, line2, out pntIntersect1, out pntIntersect2, out dHonLen, out dVerLen, false, false, dNoIntersectStartRatio); if (dDist > -1) { if (dDist != 0) { dDist = dDist - pipeStyle1.Radius - pipeStyle2.Radius; if (dDist < 0) //发生碰撞,把发生碰撞的管线名称添加到DataTable里 { DataRow newRow = listTable[i].NewRow(); for (int fieldName = 0; fieldName < feats[m].GetFieldCount(); fieldName++) { newRow[fieldName] = feats[m].GetValue(fieldName); } if (newRow != null) { listTable[i].Rows.Add(newRow); } DataRow newRow1 = listTable[j].NewRow(); for (int fieldName = 0; fieldName < feats2[n].GetFieldCount(); fieldName++) { newRow1[fieldName] = feats2[n].GetValue(fieldName); } if (newRow != null) { listTable[j].Rows.Add(newRow1); } //newRow["编号1"] = layer.Caption + "-" + feats[m].ID; //newRow["编号2"] = layer2.Caption + "-" + feats2[n].ID; //dt.Rows.Add(newRow); } } } line2.ReleaseInnerPointer(); feat2.ReleaseInnerPointer(); } feats2.ReleaseInnerPointer(); } } line1.ReleaseInnerPointer(); feat.ReleaseInnerPointer(); } feats.ReleaseInnerPointer(); } } } return(listTable); }
private void radioButtonElevatePartFeature_CheckedChanged(object sender, EventArgs e) { if (radioButtonElevatePartFeature.Checked == true) { string layerCaption = cmbLayers.Text.Trim(); if (layerCaption == "") { radioButtonElevateAllFeature.Checked = true; MessageBox.Show("请先选择图层!", "提示"); return; } GSOLayer layer = ctl.Globe.Layers.GetLayerByCaption(layerCaption); if (layer == null) { radioButtonElevateAllFeature.Checked = true; MessageBox.Show("请先选择图层!", "提示"); return; } GSOFeatureLayer featureLayer = layer as GSOFeatureLayer; if (featureLayer == null) { radioButtonElevateAllFeature.Checked = true; MessageBox.Show("图层不是矢量图层!", "提示"); return; } if (featureLayer.GetAllFeatures().Length <= 0) { radioButtonElevateAllFeature.Checked = true; MessageBox.Show("图层中的要素个数为0个!", "提示"); return; } for (int i = 0; i < featureLayer.GetAllFeatures().Length; i++) { GSOFeature feature = featureLayer.GetAt(i); if (feature != null) { if (feature.GetFieldCount() <= 0) { radioButtonElevateAllFeature.Checked = true; MessageBox.Show("图层中的字段个数为0个!", "提示"); return; } for (int j = 0; j < feature.GetFieldCount(); j++) { GSOFieldDefn field = (GSOFieldDefn)feature.GetFieldDefn(j); if (field != null) { comboBoxFieldNames.Items.Add(field.Name); } } break; } } radioButtonElevateAllFeature.Checked = false; panel1.Enabled = true; } else { panel1.Enabled = false; radioButtonElevateAllFeature.Checked = true; } }
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) { mGlobeControl.Globe.AddToEditHistroy(mlayer, m_feature, EnumEditType.Modify); bool bl = true; object obj = dt.Rows[e.RowIndex][e.ColumnIndex]; GSOFieldDefn field = (GSOFieldDefn)m_feature.GetFieldDefn(e.RowIndex); switch (field.Type) { case EnumFieldType.Float: float value = 0; bl = float.TryParse(obj.ToString(), out value); break; case EnumFieldType.Double: double value1 = 0; bl = double.TryParse(obj.ToString(), out value1); break; case EnumFieldType.INT16: Int16 value2 = 0; bl = Int16.TryParse(obj.ToString(), out value2); break; case EnumFieldType.INT32: Int32 value3 = 0; bl = Int32.TryParse(obj.ToString(), out value3); break; case EnumFieldType.INT64: Int64 value4 = 0; bl = Int64.TryParse(obj.ToString(), out value4); break; case EnumFieldType.Date: DateTime dtime = DateTime.Now; bl = DateTime.TryParse(obj.ToString(), out dtime); break; case EnumFieldType.DateTime: DateTime dtime1 = DateTime.Now; bl = DateTime.TryParse(obj.ToString(), out dtime1); break; } if (!bl) { MessageBox.Show("您输入的格式不正确!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); dt.Rows[e.RowIndex][e.ColumnIndex] = m_feature.GetValue(e.RowIndex); if (m_feature.GetValue(e.RowIndex).GetType() == typeof(DateTime)) { dt.Rows[e.RowIndex][e.ColumnIndex] = ((DateTime)m_feature.GetValue(e.RowIndex)).ToShortDateString(); } return; } else { m_feature.SetValue(e.RowIndex, dt.Rows[e.RowIndex][e.ColumnIndex]); } }
private void 粘贴ToolStripMenuItem_Click(object sender, EventArgs e) { if (dataGridView1.ReadOnly) { MessageBox.Show("表格当前为不可编辑状态!", "提示"); return; } if (Clipboard.GetData(DataFormats.Text) == null) { return; } string strCellValue = Clipboard.GetData(DataFormats.Text).ToString(); string[] separator = { "\r\n" }; if (strCellValue.EndsWith(separator[0])) { strCellValue = strCellValue.Remove(strCellValue.LastIndexOf(separator[0])); } string[] arrayCells = strCellValue.Split(separator, StringSplitOptions.None); if (arrayCells.Length <= 0 || dataGridView1.SelectedCells.Count <= 0) { return; } int count = arrayCells.Length > dataGridView1.SelectedCells.Count ? dataGridView1.SelectedCells.Count : arrayCells.Length; List <DataGridViewCell> listSelectCells = sortAllSelectCells(dataGridView1); for (int i = 0; i < count; i++) { string cellValue = arrayCells[i].Trim(); GSOFeature featureEdit = dataGridView1.Rows[listSelectCells[i].RowIndex].Tag as GSOFeature;// geoLayer.GetAt(listSelectCells[i].RowIndex); if (featureEdit == null) { MessageBox.Show("修改的对象不存在!", "提示"); return; } string fieldName = dataGridView1.Columns[listSelectCells[i].ColumnIndex].Name.Trim(); GSOFieldDefn field = (GSOFieldDefn)featureEdit.GetFieldDefn(fieldName); if (field == null) { continue; } switch (field.Type) { case EnumFieldType.INT32: int intValue = 0; if (!Int32.TryParse(cellValue, out intValue)) { MessageBox.Show("数据格式不正确!", "提示"); return; } featureEdit.SetFieldValue(fieldName, intValue); break; case EnumFieldType.Double: double doubleValue = 0; if (!double.TryParse(cellValue, out doubleValue)) { MessageBox.Show("数据格式不正确!", "提示"); return; } featureEdit.SetFieldValue(fieldName, doubleValue); break; case EnumFieldType.Date: DateTime dateTimeValue = DateTime.Now.Date; if (!DateTime.TryParse(cellValue, out dateTimeValue)) { MessageBox.Show("数据格式不正确!", "提示"); return; } featureEdit.SetFieldValue(fieldName, dateTimeValue); break; case EnumFieldType.Text: featureEdit.SetFieldValue(fieldName, cellValue); break; } dataGridView1.Rows[listSelectCells[i].RowIndex].Cells[listSelectCells[i].ColumnIndex].Value = cellValue; } }
private void btnCreateModel_Click(object sender, EventArgs e) { if (comboBoxDataSourceList.SelectedItem == null) { MessageBox.Show("请选择一个目标数据源!", "提示"); return; } GSODataSource ds = Utility.getDataSourceByFullName(globeControl1, comboBoxDataSourceList.SelectedItem.ToString().Trim()); if (ds == null) { MessageBox.Show("选择的目标数据源为空!", "提示"); return; } try { if (string.IsNullOrEmpty(textBoxNewLayerName.Text)) { MessageBox.Show("管线图层名称无效!", "提示"); return; } if (valiPipeData()) { GSODataset dataset = ds.GetDatasetByName(textBoxNewLayerName.Text.Trim()); GSOFeatureDataset newFeatureDataset; if (dataset != null) { DialogResult result = MessageBox.Show("管线图层名称在数据库中已存在!是否向该表追加", "提示", MessageBoxButtons.YesNo); if (result == DialogResult.Yes) { newFeatureDataset = dataset as GSOFeatureDataset; } else { return; } } else { newFeatureDataset = CreateDBFeatureDataset(textBoxNewLayerName.Text.Trim()); } if (newFeatureDataset == null) { MessageBox.Show("输入的图层名称不符合要求!", "提示"); return; } GSOLayer sourceLayer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxShpLayerList.SelectedItem.ToString().Trim()); if (sourceLayer == null) { MessageBox.Show("选择的shp图层为空!", "提示"); return; } newFeatureDataset.Open(); GSOFeatures features = sourceLayer.GetAllFeatures(true); string message = ""; for (int j = 0; j < features.Length; j++) { GSOFeature f = features[j]; GSOFeature newFeature = newFeatureDataset.CreateFeature(); string maisheFangshi = f.GetFieldAsString(cmbMaiSheFangShi.SelectedItem.ToString()); string eventid = f.GetFieldAsString(cmbID.SelectedItem.ToString()); f.Geometry.AltitudeMode = EnumAltitudeMode.RelativeToGround; GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; if (line == null) { message += "ID为" + f.ID + "的管线不是一个线对象\r\n"; continue; } double deep1 = f.GetFieldAsDouble(cmbFrom.SelectedItem.ToString()); double deep2 = f.GetFieldAsDouble(cmbTo.SelectedItem.ToString()); if (chkDeep.Checked) { deep1 = 0 - deep1; deep2 = 0 - deep2; } if (maisheFangshi == "直埋") { GSOPipeLineStyle3D style = new GSOPipeLineStyle3D(); style.LineColor = Color.FromArgb(Convert.ToByte(numericUpDownLineOpaque.Value), btnPipelineColor.BackColor); double radius = 0; GSOFieldDefn field = (GSOFieldDefn)(f.GetFieldDefn(cmbRadius.SelectedItem.ToString())); if (field.Type == EnumFieldType.Text) { string temp = f.GetFieldAsString(cmbRadius.SelectedItem.ToString()); double outNum = 0; bool num = double.TryParse(temp, out outNum); if (num) { radius = outNum / 2000; } } else if (field.Type == EnumFieldType.Double) { radius = f.GetFieldAsDouble(cmbRadius.SelectedItem.ToString()) / 2000; // 探测数据的单位一般是毫米,需换算为米; 管径一般是 直径, 这个需要半径, 所有除以2000 } if (radius == 0) { message += "ID为" + f.ID + "的管线半径为0\r\n"; continue; } style.Radius = radius; style.Slice = int.Parse(txtSlice.Text); style.CornerSliceAngle = Convert.ToDouble(textBoxCornerSliceAngle.Text); if (cmbReference.SelectedIndex == 0) //管底 { deep1 = deep1 + radius * 2; deep2 = deep2 + radius * 2; } else if (cmbReference.SelectedIndex == 1) //管顶 { deep1 = deep1 - radius * 2; deep2 = deep2 - radius * 2; } for (int n = 0; n < line[0].Count; n++) { GSOPoint3d pt3d = line[0][n]; int pointcount = line[0].Count; double fenmu = Math.Sqrt(Math.Pow(line[0][pointcount - 1].Y - line[0][0].Y, 2) + Math.Pow(line[0][pointcount - 1].X - line[0][0].X, 2)); if (fenmu == 0) { pt3d.Z = deep1; } else { double radio = Math.Sqrt(Math.Pow(pt3d.Y - line[0][0].Y, 2) + Math.Pow(pt3d.X - line[0][0].X, 2)) / fenmu; pt3d.Z = deep1 + (deep2 - deep1) * radio; } line[0][n] = pt3d; } newFeature.Geometry = line; // f.Geometry; newFeature.Geometry.Style = style; } else if (maisheFangshi == "沟道") { GSOExtendSectionLineStyle3D style = new GSOExtendSectionLineStyle3D(); style.LineColor = Color.FromArgb(Convert.ToByte(numericUpDownLineOpaque.Value), btnPipelineColor.BackColor); double width = 0; GSOFieldDefn field = (GSOFieldDefn)(f.GetFieldDefn(cmbWidth.SelectedItem.ToString())); if (field.Type == EnumFieldType.Text) { string temp = f.GetFieldAsString(cmbWidth.SelectedItem.ToString()); double outNum = 0; bool num = double.TryParse(temp, out outNum); if (num) { width = outNum; } } else if (field.Type == EnumFieldType.Double) { width = f.GetFieldAsDouble(cmbWidth.SelectedItem.ToString()); } double height = 0; field = (GSOFieldDefn)(f.GetFieldDefn(cmbHeight.SelectedItem.ToString())); if (field.Type == EnumFieldType.Text) { string temp = f.GetFieldAsString(cmbHeight.SelectedItem.ToString()); double outNum = 0; bool num = double.TryParse(temp, out outNum); if (num) { height = outNum; } } else if (field.Type == EnumFieldType.Double) { height = f.GetFieldAsDouble(cmbHeight.SelectedItem.ToString()); } if (width == 0 || height == 0) { message += "ID为" + f.ID + "的沟道的宽度或高度为0\r\n"; continue; } GSOPoint3ds sectionpts = new GSOPoint3ds(); sectionpts.Add(new GSOPoint3d(width / -2, height / 2, 0)); sectionpts.Add(new GSOPoint3d(width / -2, height / -2, 0)); sectionpts.Add(new GSOPoint3d(width / 2, height / -2, 0)); sectionpts.Add(new GSOPoint3d(width / 2, height / 2, 0)); style.SetSectionPoints(sectionpts); style.IsClosed = false; style.SetAnchorByAlign(EnumAlign.BottomCenter); for (int n = 0; n < line[0].Count; n++) { GSOPoint3d pt3d = line[0][n]; int pointcount = line[0].Count; double fenmu = Math.Sqrt(Math.Pow(line[0][pointcount - 1].Y - line[0][0].Y, 2) + Math.Pow(line[0][pointcount - 1].X - line[0][0].X, 2)); if (fenmu == 0) { pt3d.Z = deep1; } else { double radio = Math.Sqrt(Math.Pow(pt3d.Y - line[0][0].Y, 2) + Math.Pow(pt3d.X - line[0][0].X, 2)) / fenmu; pt3d.Z = deep1 + (deep2 - deep1) * radio; } line[0][n] = pt3d; } newFeature.Geometry = line; // f.Geometry; newFeature.Geometry.Style = style; } else { message += "ID为" + f.ID + "的对象的埋设方式既不是直埋,也不是沟道\r\n"; continue; // 即不是 直埋,又不是 沟道,那么忽略该记录 } for (int i = 0; i < f.GetFieldCount(); i++) { GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(f.GetFieldDefn(i)); if (!en_cns.ContainsKey(fielddef.Name)) { continue; } object fieldvalue = f.GetValue(fielddef.Name);// convertFieldValue(fielddef.Name, f.GetValue(fielddef.Name)); if (fieldvalue == null) { continue; } string fieldName = en_cns.ContainsKey(fielddef.Name) == true ? en_cns[fielddef.Name].ToString() : fielddef.Name; newFeature.SetValue(fieldName, fieldvalue); } newFeature.Name = eventid; newFeatureDataset.AddFeature(newFeature); } globeControl1.Refresh(); newFeatureDataset.Save(); newFeatureDataset.Close(); newFeatureDataset.Caption = newFeatureDataset.Name; globeControl1.Globe.Layers.Add(newFeatureDataset); string strMessage = "shp文件中共" + features.Length + "个对象,实际入库" + newFeatureDataset.GetAllFeatures().Length + "个对象!\r\n"; if (message == "") { MessageBox.Show(strMessage, "提示"); } else { FrmMessageShow frm = new FrmMessageShow(strMessage + message); frm.ShowDialog(); } this.Close(); } } catch (Exception ex) { Log.PublishTxt(ex); MessageBox.Show(ex.Message); } }
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) { //行索引 int rowIndex = e.RowIndex; //列索引 int columnIndex = e.ColumnIndex; //获得修改的要素 GSOFeature featureEdit = (_layer.Dataset as GSOFeatureDataset).GetFeatureAt(rowIndex); //获得修改的字段名称 string fieldName = dataGridView1.Columns[columnIndex].Name.Trim(); //获得修改过的字段定义 GSOFieldDefn field = featureEdit.GetFieldDefn(fieldName); //获得修改过的值 string cellValue = dataGridView1.Rows[rowIndex].Cells[columnIndex].Value.ToString().Trim(); if (featureEdit == null || field == null) { MessageBox.Show("修改的对象不存在!", "提示"); return; } //进行输入值类型的判断 switch (field.Type) { case EnumFieldType.INT32: int intValue = 0; if (!Int32.TryParse(cellValue, out intValue)) { MessageBox.Show("输入的数据格式不正确,请重新输入!", "提示"); dataGridView1.Rows[rowIndex].Cells[columnIndex].Value = _cellValueBeginCellEdit; return; } //值设置 featureEdit.SetFieldValue(fieldName, intValue); break; case EnumFieldType.Double: double doubleValue = 0; if (!double.TryParse(cellValue, out doubleValue)) { MessageBox.Show("输入的数据格式不正确,请重新输入!", "提示"); dataGridView1.Rows[rowIndex].Cells[columnIndex].Value = _cellValueBeginCellEdit; return; } //值设置 featureEdit.SetFieldValue(fieldName, doubleValue); break; case EnumFieldType.Date: DateTime dateTimeValue = DateTime.Now.Date; if (!DateTime.TryParse(cellValue, out dateTimeValue)) { MessageBox.Show("输入的数据格式不正确,请重新输入!", "提示"); dataGridView1.Rows[rowIndex].Cells[columnIndex].Value = _cellValueBeginCellEdit; return; } //值设置 featureEdit.SetFieldValue(fieldName, dateTimeValue); break; case EnumFieldType.Text: //值设置 featureEdit.SetFieldValue(fieldName, cellValue); break; default: throw new Exception("字段类型不符合条件。"); } _layer.Save(); }
public void SetDataTable() { this.Shown += new EventHandler(Frm_TableAttribute_Shown); GSOFeatureLayer pFeatureLayer = geoLayer as GSOFeatureLayer; GSOFeatureDataset pFeatureDataset = pFeatureLayer.Dataset as GSOFeatureDataset; if (pFeatureLayer == null || pFeatureDataset == null) { MessageBox.Show("该数据不是属性数据,属性表为空!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Error); isShow = false; return; } else { GSOFeatures feats = m_features;// pFeatureLayer.GetAllFeatures(); GSOFeature feat = feats[0]; countLog = 0; GetReallyFeature(feats); try { dataGridView1.Columns.Clear(); dataGridView1.Rows.Clear(); for (int j = 0; j < pFeatureDataset.FieldCount; j++) { GSOFieldAttr field = pFeatureDataset.GetField(j); dataGridView1.Columns.Add(field.Name, field.Name); } for (int i = 0; i < feats.Length; i++) { feat = feats[i]; if (feat == null) { continue; } int rowIndex = dataGridView1.Rows.Add(); dataGridView1.Rows[rowIndex].Tag = feat; for (int j = 0; j < feat.GetFieldCount(); j++) { GSOFieldDefn field = (GSOFieldDefn)feat.GetFieldDefn(j); object fieldValue = feat.GetValue(j); if (fieldValue != null) { dataGridView1.Rows[rowIndex].Cells[j].Value = fieldValue.ToString(); } } } dataGridView1.ReadOnly = !pFeatureLayer.Editable; this.编辑ToolStripMenuItem.BackColor = geoLayer.Editable == true ? Color.Orange : Color.Transparent; if (statusStrip1.Items.Count > 0) { if (dataGridView1.Rows.Count >= countLog) { statusStrip1.Items[0].Text = " 共有 " + dataGridView1.Rows.Count + " 条记录"; } else { statusStrip1.Items[0].Text = " 共有 " + countLog + " 条记录"; } } } catch (System.Exception exp) { Log.PublishTxt(exp); if (statusStrip1.Items.Count > 0) { statusStrip1.Items[0].Text = " 共有 " + 0 + " 条记录"; } } } }
private void btnCreateModel_Click(object sender, EventArgs e) { if (comboBoxDataSourceList.SelectedItem == null) { MessageBox.Show("请选择一个目标数据源!", "提示"); return; } GSODataSource ds = Utility.getDataSourceByFullName(globeControl1, comboBoxDataSourceList.SelectedItem.ToString().Trim()); if (ds == null) { MessageBox.Show("选择的目标数据源为空!", "提示"); return; } if (string.IsNullOrEmpty(textBoxNewLayerName.Text)) { MessageBox.Show("请选择一个Shp图层!", "提示"); return; } if (ds.GetDatasetByName(textBoxNewLayerName.Text) != null) { MessageBox.Show("图层名称已存在!", "提示"); return; } try { GSOLayer ShpSourceLayer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxShpLayerList.SelectedItem.ToString().Trim()); GSOFeatureDataset pipeline = CreateDBFeatureDataset(textBoxNewLayerName.Text.Trim()); if (pipeline == null) { MessageBox.Show("输入的图层名称不符合要求!", "提示"); return; } pipeline.Open(); GSOFeatureDataset pipelineRect = CreateDBFeatureDataset(textBoxNewLayerName.Text.Trim() + "_Rect"); if (pipelineRect == null) { return; } pipelineRect.Open(); GSOFeatures features = ShpSourceLayer.GetAllFeatures(); string message = ""; for (int j = 0; j < features.Length; j++) { GSOFeature f = features[j]; GSOFeature newFeature = pipeline.CreateFeature(); GSOPipeLineStyle3D style = new GSOPipeLineStyle3D(); style.LineColor = Color.FromArgb(Convert.ToByte(numericUpDownLineOpaque.Value), btnPipelineColor.BackColor); double radius = 0; if (cmbRadius.SelectedItem == null) { cmbRadius.SelectedIndex = 0; } GSOFieldDefn diameterfield = (GSOFieldDefn)f.GetFieldDefn(cmbRadius.SelectedItem.ToString()); string fieldText = f.GetFieldAsString(cmbRadius.SelectedItem.ToString()); if (diameterfield.Type == EnumFieldType.Text) { if (double.TryParse(fieldText, out radius)) { radius = radius / 2000; } else { message += "ID为" + f.ID + "的对象的管径字段值不符合要求!\r\n"; continue; } } else { radius = f.GetFieldAsDouble(cmbRadius.SelectedItem.ToString()) / 2000; // 探测数据的单位一般是毫米,需换算为米; 管径一般是 直径, 这个需要半径, 所有除以2000 } if (cmbID.SelectedItem == null) { cmbID.SelectedIndex = 0; } if (cmbWidthNum.SelectedItem == null) { cmbWidthNum.SelectedIndex = 0; } if (cmbHeightNum.SelectedItem == null) { cmbHeightNum.SelectedIndex = 0; } string eventid = f.GetFieldAsString(cmbID.SelectedItem.ToString()); double interval = radius * 2; int num_width = 0; int num_height = 0; if (!int.TryParse(f.GetFieldAsString(cmbWidthNum.SelectedItem.ToString()), out num_width)) { message += "ID为" + f.ID + "的对象的宽度字段值不符合要求!\r\n"; continue; } if (!int.TryParse(f.GetFieldAsString(cmbHeightNum.SelectedItem.ToString()), out num_height)) { message += "ID为" + f.ID + "的对象的高度字段值不符合要求!\r\n"; continue; } double rectWidth = radius * 2 * num_width + 0.08;// 两端空出0.04 double rectHeight = radius * 2 * num_height + 0.08; if (radius == 0) { message += "ID为" + f.ID + "的对象的管径字段值为0!\r\n"; continue; } int intSlice = 0; double cornerSliceAngle = 0; if (!int.TryParse(txtSlice.Text.Trim(), out intSlice)) { message += "ID为" + f.ID + "的对象的截面分段数字段值不符合要求!\r\n"; continue; } if (!double.TryParse(textBoxCornerSliceAngle.Text.Trim(), out cornerSliceAngle)) { message += "ID为" + f.ID + "的对象的拐弯平滑度字段值不符合要求!\r\n"; continue; } style.Radius = radius; style.Slice = intSlice; style.CornerSliceAngle = cornerSliceAngle; f.Geometry.AltitudeMode = EnumAltitudeMode.RelativeToGround; GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; if (line == null) { message += "ID为" + f.ID + "的对象不是一个线对象!\r\n"; continue; } if (cmbFrom.SelectedItem == null) { cmbFrom.SelectedIndex = 0; } if (cmbTo.SelectedItem == null) { cmbTo.SelectedIndex = 0; } double deep1 = 0; double deep2 = 0; if (!double.TryParse(f.GetFieldAsString(cmbFrom.Items[cmbTo.SelectedIndex].ToString().Trim()), out deep1)) { message += "ID为" + f.ID + "的对象的起点埋深字段值不符合要求!\r\n"; continue; } if (!double.TryParse(f.GetFieldAsString(cmbTo.Items[cmbTo.SelectedIndex].ToString().Trim()), out deep2)) { message += "ID为" + f.ID + "的对象的终点埋深字段值不符合要求!\r\n"; continue; } if (chkDeep.Checked) { deep1 = 0 - deep1; deep2 = 0 - deep2; } if (cmbReference.SelectedIndex == 0) //管底 { deep1 = deep1 + radius * 2; deep2 = deep2 + radius * 2; } else if (cmbReference.SelectedIndex == 1) //管顶 { deep1 = deep1 - radius * 2; deep2 = deep2 - radius * 2; } for (int n = 0; n < line[0].Count; n++) { GSOPoint3d pt3d = line[0][n]; int pointcount = line[0].Count; double radio = Math.Sqrt(Math.Pow(pt3d.Y - line[0][0].Y, 2) + Math.Pow(pt3d.X - line[0][0].X, 2)) / Math.Sqrt(Math.Pow(line[0][pointcount - 1].Y - line[0][0].Y, 2) + Math.Pow(line[0][pointcount - 1].X - line[0][0].X, 2)); pt3d.Z = deep1 + (deep2 - deep1) * radio; if (double.IsInfinity(pt3d.Z)) { pt3d.Z = deep2; } line[0][n] = pt3d; } if (num_height == 0 || num_width == 0) // 直埋 { newFeature.Geometry = line; newFeature.Geometry.Style = style; newFeature.Name = eventid; SetFields(f, newFeature); pipeline.AddFeature(newFeature); } else { GSOFeature rectfeat = pipelineRect.CreateFeature(); rectfeat.Geometry = CreatePipeRect(line, rectWidth, rectHeight); if (rectfeat != null) { SetFields(f, rectfeat); pipelineRect.AddFeature(rectfeat); } one2Multi(line, num_width, num_height, interval, style, pipeline, eventid, f); } } globeControl1.Refresh(); pipeline.Save(); pipelineRect.Save(); pipeline.Close(); pipelineRect.Close(); string strMessage = "shp文件中共" + features.Length + "个对象,实际入库" + pipeline.GetAllFeatures().Length + "个对象!\r\n"; if (message == "") { MessageBox.Show(strMessage, "提示"); } else { FrmMessageShow frm = new FrmMessageShow(strMessage + message); frm.ShowDialog(); } this.Close(); } catch (Exception ex) { Log.PublishTxt(ex); MessageBox.Show(ex.Message); } }
private void btnCreateModel_Click(object sender, EventArgs e) { if (comboBoxDataSourceList.SelectedItem == null) { MessageBox.Show("请选择一个目标数据源!", "提示"); return; } GSODataSource ds = Utility.getDataSourceByFullName(globeControl1, comboBoxDataSourceList.SelectedItem.ToString().Trim()); if (ds == null) { MessageBox.Show("选择的目标数据源为空!", "提示"); return; } //判断是数字或者存在特殊字符串 string SuiD = textBoxNewLayerName.Text.ToString().Trim(); Regex reg = new Regex("^[0-9]+$");//判断是不是数据,要不是就表示没有选择。则从隐藏域里读出来 Match ma = reg.Match(SuiD); if (ma.Success) { MessageBox.Show("管线图层名称不能全部为数字!", "警告"); return; } try { // if (valiPipeData()) { if (string.IsNullOrEmpty(textBoxNewLayerName.Text)) { MessageBox.Show("管线图层名称无效!", "提示"); return; } GSODataset dataset = ds.GetDatasetByName(textBoxNewLayerName.Text.Trim()); GSOFeatureDataset newFeatureDataset; if (dataset != null) { DialogResult result = MessageBox.Show("管线图层名称在数据库中已存在!是否向该表追加", "提示", MessageBoxButtons.YesNo); if (result == DialogResult.Yes) { newFeatureDataset = dataset as GSOFeatureDataset; } else { return; } } else { newFeatureDataset = CreateDBFeatureDataset(textBoxNewLayerName.Text.Trim()); } if (newFeatureDataset == null) { return; } GSOLayer sourceLayer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxShpLayerList.SelectedItem.ToString().Trim()); newFeatureDataset.Open(); GSOFeatures features = sourceLayer.GetAllFeatures(true); string message = ""; for (int j = 0; j < features.Length; j++) { GSOFeature f = features[j]; GSOGeoPolyline3D lineeee = f.Geometry as GSOGeoPolyline3D; if (lineeee == null) { message += "ID为" + f.ID + "的对象不是一个线对象\n"; continue; } double length = lineeee.GetSpaceLength(true, 6378137); if (length == 0) { message += "ID为" + f.ID + "的管线长度为0\n"; continue; } GSOFeature newFeature = newFeatureDataset.CreateFeature(); GSOPipeLineStyle3D style = new GSOPipeLineStyle3D(); style.LineColor = Color.FromArgb(Convert.ToByte(numericUpDownLineOpaque.Value), btnPipelineColor.BackColor); double radius = 0; GSOFieldDefn field = (GSOFieldDefn)(f.GetFieldDefn(cmbRadius.SelectedItem.ToString())); if (field.Type == EnumFieldType.Text) { string temp = f.GetFieldAsString(cmbRadius.SelectedItem.ToString()); double outNum = 0; bool num = double.TryParse(temp, out outNum); if (num) { radius = outNum / 2000; } } else if (field.Type == EnumFieldType.INT32 || field.Type == EnumFieldType.Double) { radius = f.GetFieldAsDouble(cmbRadius.SelectedItem.ToString()) / 2000; // 探测数据的单位一般是毫米,需换算为米; 管径一般是 直径, 这个需要半径, 所有除以2000 } string eventid = f.GetFieldAsString(cmbID.SelectedItem.ToString()); if (radius == 0) { message += "ID为" + f.ID + "的管线半径为0\n"; continue; } style.Radius = radius; style.Slice = int.Parse(txtSlice.Text); style.CornerSliceAngle = Convert.ToDouble(textBoxCornerSliceAngle.Text); f.Geometry.AltitudeMode = EnumAltitudeMode.RelativeToGround; GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; if (line == null) { return; } double deep1 = f.GetFieldAsDouble(cmbFrom.SelectedItem.ToString()); double deep2 = f.GetFieldAsDouble(cmbTo.SelectedItem.ToString()); if (chkDeep.Checked) { deep1 = 0 - deep1; deep2 = 0 - deep2; } if (cmbReference.SelectedIndex == 0) //管底 { deep1 = deep1 + radius * 2; deep2 = deep2 + radius * 2; } else if (cmbReference.SelectedIndex == 1) //管顶 { deep1 = deep1 - radius * 2; deep2 = deep2 - radius * 2; } for (int n = 0; n < line[0].Count; n++) { GSOPoint3d pt3d = line[0][n]; int pointcount = line[0].Count; double fenmu = Math.Sqrt(Math.Pow(line[0][pointcount - 1].Y - line[0][0].Y, 2) + Math.Pow(line[0][pointcount - 1].X - line[0][0].X, 2)); if (fenmu == 0) { pt3d.Z = deep1; } else { double radio = Math.Sqrt(Math.Pow(pt3d.Y - line[0][0].Y, 2) + Math.Pow(pt3d.X - line[0][0].X, 2)) / fenmu; pt3d.Z = deep1 + (deep2 - deep1) * radio; } if (double.IsInfinity(pt3d.Z)) { pt3d.Z = deep2; } line[0][n] = pt3d; } newFeature.Geometry = line; // f.Geometry; newFeature.Geometry.Style = style; newFeature.Name = eventid; for (int i = 0; i < f.GetFieldCount(); i++) { GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(f.GetFieldDefn(i)); if (fielddef == null) { continue; } if (!en_cns.Contains(fielddef.Name)) { continue; } object fieldvalue = f.GetValue(fielddef.Name);// convertFieldValue(fielddef.Name, f.GetValue(fielddef.Name)); if (fieldvalue == null) { continue; } string fieldName = en_cns.ContainsKey(fielddef.Name) == true ? en_cns[fielddef.Name].ToString() : fielddef.Name; newFeature.SetValue(fieldName, fieldvalue); } newFeatureDataset.AddFeature(newFeature); } newFeatureDataset.Save(); newFeatureDataset.Caption = newFeatureDataset.Name; globeControl1.Globe.Layers.Add(newFeatureDataset); globeControl1.Refresh(); string strMessage = "shp文件中共" + features.Length + "个对象,实际入库" + newFeatureDataset.GetAllFeatures().Length + "个对象!\n"; if (message == "") { MessageBox.Show(strMessage, "提示"); } else { FrmMessageShow frm = new FrmMessageShow(strMessage + message); frm.ShowDialog(); } this.Close(); } } catch (Exception ex) { Log.PublishTxt(ex); MessageBox.Show(ex.Message); } }
private void btnCreateModel_Click(object sender, EventArgs e) { try { if (string.IsNullOrEmpty(txtModelLayer.Text)) { MessageBox.Show("管线模型文件路径无效!", "提示"); return; } if (File.Exists(txtModelLayer.Text)) { MessageBox.Show("管线模型文件已存在!", "提示"); return; } GSOLayer sourceLayer = ctl.Globe.Layers[cmbLayer.SelectedIndex]; GSOLayer layer = ctl.Globe.Layers.Add(txtModelLayer.Text); lgdFilePath = txtModelLayer.Text; if (layer != null) { GSOFeatures features = sourceLayer.GetAllFeatures(); string message = ""; for (int j = 0; j < features.Length; j++) { GSOFeature f = features[j]; GSOFeature newFeature = new GSOFeature(); GSOExtendSectionLineStyle3D style = new GSOExtendSectionLineStyle3D(); style.LineColor = Color.FromArgb(Convert.ToByte(numericUpDownLineOpaque.Value), btnPipelineColor.BackColor); double width = 0; GSOFieldDefn field = (GSOFieldDefn)(f.GetFieldDefn(cmbWidth.SelectedItem.ToString())); if (field.Type == EnumFieldType.Text) { string temp = f.GetFieldAsString(cmbWidth.SelectedItem.ToString()); double outNum = 0; bool num = double.TryParse(temp, out outNum); if (num) { width = outNum; } } else if (field.Type == EnumFieldType.Double) { width = f.GetFieldAsDouble(cmbWidth.SelectedItem.ToString()); } double height = 0; field = (GSOFieldDefn)(f.GetFieldDefn(cmbHeight.SelectedItem.ToString())); if (field.Type == EnumFieldType.Text) { string temp = f.GetFieldAsString(cmbHeight.SelectedItem.ToString()); double outNum = 0; bool num = double.TryParse(temp, out outNum); if (num) { height = outNum; } } else if (field.Type == EnumFieldType.Double) { height = f.GetFieldAsDouble(cmbHeight.SelectedItem.ToString()); } string eventid = f.GetFieldAsString(cmbID.SelectedItem.ToString()); if (width == 0 || height == 0) { message += "ID为" + f.ID + "的对象的沟宽或者沟高字段的值为0 \n"; continue; } GSOPoint3ds sectionpts = new GSOPoint3ds(); sectionpts.Add(new GSOPoint3d(width / -2, height / 2, 0)); sectionpts.Add(new GSOPoint3d(width / -2, height / -2, 0)); sectionpts.Add(new GSOPoint3d(width / 2, height / -2, 0)); sectionpts.Add(new GSOPoint3d(width / 2, height / 2, 0)); style.SetSectionPoints(sectionpts); style.IsClosed = false; style.SetAnchorByAlign(EnumAlign.BottomCenter); f.Geometry.AltitudeMode = EnumAltitudeMode.RelativeToGround; GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; if (line == null) { message += "ID为" + f.ID + "的对象不是线对象 \n"; continue; } double deep1 = f.GetFieldAsDouble(cmbFrom.SelectedItem.ToString()); double deep2 = f.GetFieldAsDouble(cmbTo.SelectedItem.ToString()); if (chkDeep.Checked) { deep1 = 0 - deep1; deep2 = 0 - deep2; } for (int n = 0; n < line[0].Count; n++) { GSOPoint3d pt3d = line[0][n]; int pointcount = line[0].Count; double radio = Math.Sqrt(Math.Pow(pt3d.Y - line[0][0].Y, 2) + Math.Pow(pt3d.X - line[0][0].X, 2)) / Math.Sqrt(Math.Pow(line[0][pointcount - 1].Y - line[0][0].Y, 2) + Math.Pow(line[0][pointcount - 1].X - line[0][0].X, 2)); pt3d.Z = deep1 + (deep2 - deep1) * radio; line[0][n] = pt3d; } newFeature.Geometry = line; // f.Geometry; newFeature.Geometry.Style = style; newFeature.Name = eventid; layer.AddFeature(newFeature); } ctl.Refresh(); layer.Save(); ctl.Globe.Layers.Remove(layer); string strMessage = "shp文件中共" + features.Length + "个对象,实际生成" + layer.GetAllFeatures().Length + "个对象!\n"; MessageBox.Show(strMessage + message, "提示"); this.Close(); } } catch (Exception ex) { Log.PublishTxt(ex); MessageBox.Show(ex.Message); } }
private void btnCreateModel_Click(object sender, EventArgs e) { try { if (string.IsNullOrEmpty(txtModelLayer.Text)) { MessageBox.Show("kml文件路径无效!", "提示"); return; } if (File.Exists(txtModelLayer.Text)) { MessageBox.Show("kml文件已存在!", "提示"); return; } GSOLayer sourceLayer = ctl.Globe.Layers[cmbLayer.SelectedIndex]; GSOLayer layer = ctl.Globe.Layers.Add(txtModelLayer.Text); lgdFilePath = txtModelLayer.Text; if (layer != null) { GSOFeatures features = sourceLayer.GetAllFeatures(); string message = ""; for (int j = 0; j < features.Length; j++) { GSOFeature f = features[j]; GSOFeature newFeature = new GSOFeature(); GSOPipeLineStyle3D style = new GSOPipeLineStyle3D(); style.LineColor = Color.FromArgb(Convert.ToByte(numericUpDownLineOpaque.Value), btnPipelineColor.BackColor); double radius = 0; GSOFieldDefn field = (GSOFieldDefn)(f.GetFieldDefn(cmbRadius.SelectedItem.ToString())); if (field.Type == EnumFieldType.Text) { string temp = f.GetFieldAsString(cmbRadius.SelectedItem.ToString()); double outNum = 0; bool num = double.TryParse(temp, out outNum); if (num) { radius = outNum / 2000; } } else if (field.Type == EnumFieldType.Double) { radius = f.GetFieldAsDouble(cmbRadius.SelectedItem.ToString()) / 2000; // 探测数据的单位一般是毫米,需换算为米; 管径一般是 直径, 这个需要半径, 所有除以2000 } string eventid = f.GetFieldAsString(cmbID.SelectedItem.ToString()); if (radius == 0) { message += "ID为" + f.ID + "的管线的半径为0 \n "; continue; } style.Radius = radius; style.Slice = int.Parse(txtSlice.Text); style.CornerSliceAngle = Convert.ToDouble(textBoxCornerSliceAngle.Text); f.Geometry.AltitudeMode = EnumAltitudeMode.RelativeToGround; GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; if (line == null) { message += "ID为" + f.ID + "的对象不是线对象 \n"; continue; } double deep1 = f.GetFieldAsDouble(cmbFrom.SelectedItem.ToString()); double deep2 = f.GetFieldAsDouble(cmbTo.SelectedItem.ToString()); if (chkDeep.Checked) { deep1 = 0 - deep1; deep2 = 0 - deep2; } if (cmbReference.SelectedIndex == 0) //管底 { deep1 = deep1 + radius * 2; deep2 = deep2 + radius * 2; } else if (cmbReference.SelectedIndex == 1) //管顶 { deep1 = deep1 - radius * 2; deep2 = deep2 - radius * 2; } for (int n = 0; n < line[0].Count; n++) { GSOPoint3d pt3d = line[0][n]; int pointcount = line[0].Count; double radio = Math.Sqrt(Math.Pow(pt3d.Y - line[0][0].Y, 2) + Math.Pow(pt3d.X - line[0][0].X, 2)) / Math.Sqrt(Math.Pow(line[0][pointcount - 1].Y - line[0][0].Y, 2) + Math.Pow(line[0][pointcount - 1].X - line[0][0].X, 2)); pt3d.Z = deep1 + (deep2 - deep1) * radio; line[0][n] = pt3d; } newFeature.Geometry = line; // f.Geometry; newFeature.Geometry.Style = style; newFeature.Name = eventid; layer.AddFeature(newFeature); } ctl.Refresh(); layer.Save(); ctl.Globe.Layers.Remove(layer); string strMessage = "shp文件中共" + features.Length + "个对象,实际生成" + layer.GetAllFeatures().Length + "个对象!\n"; MessageBox.Show(strMessage + message, "提示"); this.Close(); } } catch (Exception ex) { Log.PublishTxt(ex); MessageBox.Show(ex.Message); } }
private void buttonOK_Click(object sender, EventArgs e) { string fieldName = textBoxFieldName.Text.Trim(); if (fieldName.Equals(string.Empty)) { MessageBox.Show("字段名不能为空!", "提示"); return; } int firstChar = 0; if (int.TryParse(fieldName.Substring(0, 1), out firstChar)) { MessageBox.Show("字段名不能以数字开头!", "提示"); return; } if (fieldName.Length > 10) { MessageBox.Show("字段名长度不能大于10!", "提示"); return; } EnumFieldType fieldType = EnumFieldType.None; int fieldWidth = 0; string type = comboBoxFieldType.Text.Trim(); if (string.IsNullOrEmpty(type)) { MessageBox.Show("字段类型不能为空!", "提示"); return; } else { switch (type) { case "Date": fieldType = EnumFieldType.Date; fieldWidth = 10; break; case "Double": fieldType = EnumFieldType.Double; fieldWidth = 8; break; case "INT32": fieldType = EnumFieldType.INT32; fieldWidth = 4; break; case "Text": fieldType = EnumFieldType.Text; fieldWidth = 8000; break; default: MessageBox.Show("字段类型不匹配!", "提示"); return; } } if (layer != null) { GSOFieldDefn fieldDef = new GSOFieldDefn() { //设置字段名称 Name = fieldName, //设置字段类型 Type = fieldType, //设置字段长度 Width = fieldWidth }; var features = layer.GetAllFeatures(); //遍历图层将字段信息添加到每个feature中 for (int i = 0; i < features.Length; i++) { var feature = features[i]; feature.AddField(fieldDef); } //保存图层 layer.Save(); //将新建列添加到数据表中 dataGridView1.Columns.Add(fieldName, fieldName); } this.Close(); }
private void 检查图层ToolStripMenuItem_Click(object sender, EventArgs e) { GSOLayer layer = globeControl1.Globe.DestLayerFeatureAdd; if (layer != null && layer.ID == globeControl1.Globe.MemoryLayer.ID) { MessageBox.Show("请先设置目标图层!","提示"); return; } if (layer.Dataset != null && layer.Dataset.IsFeatureDataset == true) { GSOFeatureDataset dataset = layer.Dataset as GSOFeatureDataset; for (int i = 0; i < dataset.GetAllFeatures().Length; i++) { GSOFeature feature = dataset.GetFeatureAt(i); if (feature != null && feature.GetFieldCount() < dataset.FieldCount) { for (int j = 0; j < dataset.FieldCount; j++) { GSOFieldAttr field = dataset.GetField(j); if (field != null && feature.GetFieldDefn(field.Name) == null) { GSOFieldDefn defn = new GSOFieldDefn(); defn.Name = field.Name; defn.Type = field.Type; defn.Width = field.Width; feature.AddField(defn); } } } } MessageBox.Show("检查完毕!","提示"); } }