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.Globe; using GeoScene.Engine; using System.Collections; using GeoScene.Data; using System.Text.RegularExpressions; namespace Cyberpipe { public partial class FrmAddFlagBatch : Office2007Form { GSOGlobeControl globeControl1; GSODataSource ds; GSOLayer layer; string selectLayerName = ""; public GSOLayer flags = null; private Hashtable fm_types = new Hashtable(); private Hashtable fm_cns = new Hashtable(); public FrmAddFlagBatch(GSOGlobeControl _globeControl1, GSODataSource _ds) { InitializeComponent(); this.globeControl1 = _globeControl1; this.ds = _ds; } private void btn_file_select_Click(object sender, EventArgs e) { try { OpenFileDialog dlg = new OpenFileDialog(); dlg.Filter = "*.shp|*.shp"; dlg.Multiselect = false; if (dlg.ShowDialog() == DialogResult.OK) { layer = globeControl1.Globe.Layers.Add(dlg.FileName); string txtMessage = valiValvedata(layer); if (txtMessage != "") { btn_imp.Enabled = false; txt_layer_file.Text = ""; txt_layer_name.Text = ""; combo_model_path.Items.Clear(); combo_z_value.Items.Clear(); combo_model_name.Items.Clear(); globeControl1.Globe.Layers.Remove(layer); FrmValiDataShowErrorMessage showErrorMessage = new FrmValiDataShowErrorMessage(dlg.FileName, txtMessage); showErrorMessage.Show(); return; } else { btn_imp.Enabled = true; txt_layer_file.Text = dlg.FileName; selectLayerName = layer.Caption; txt_layer_name.Text = layer.Caption; GSOFeatures features = layer.GetAllFeatures(); if (features.Length == 0) return; combo_model_path.Items.Clear(); combo_z_value.Items.Clear(); combo_model_name.Items.Clear(); for (int i = 0; i < features[0].GetFieldCount(); i++) { GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i)); combo_model_path.Items.Add(fielddef.Name); combo_z_value.Items.Add(fielddef.Name); combo_model_name.Items.Add(fielddef.Name); } combo_model_name.SelectedItem = "编号"; combo_z_value.SelectedItem = "标识器埋深"; combo_model_path.SelectedItem = "模型路径"; } } } catch (Exception ex) { MessageBox.Show("SHP文件选取失败:" + ex.ToString(), "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void btn_imp_Click(object sender, EventArgs e) { try { if (String.IsNullOrEmpty(txt_layer_file.Text.Trim())) { MessageBox.Show("请选择一个图层文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } if (!Utility.isNetworkConnectionSuccess(FrmFlagDatabase.dbServer)) { MessageBox.Show("网络连接失败!", "提示"); return; } if (String.IsNullOrEmpty(txt_layer_name.Text.Trim())) { MessageBox.Show("图层名称为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } //判断是数字或者存在特殊字符串 string SuiD = txt_layer_name.Text.Trim(); Regex reg = new Regex("^[0-9]");//判断是不是数据,要不是就表示没有选择。则从隐藏域里读出来 Match ma = reg.Match(SuiD); if (ma.Success) { MessageBox.Show("图层名称不能以数字开头!", "警告",MessageBoxButtons.OK,MessageBoxIcon.Warning); return; } GSODataset dataset = ds.GetDatasetByName(txt_layer_name.Text.Trim()); GSOFeatureDataset featdataset = null; if (dataset != null) { DialogResult result = MessageBox.Show("标识器图层名称在数据库中已存在!是否向该表追加", "提示", MessageBoxButtons.YesNo); if (result == DialogResult.Yes) { featdataset = dataset as GSOFeatureDataset; } else { return; } } else { featdataset = CreateDBFeatureDataset(txt_layer_name.Text.Trim()); } this.Cursor = Cursors.WaitCursor; featdataset.Open(); GSOLayer shpLayer = globeControl1.Globe.Layers.GetLayerByCaption(selectLayerName); GSOFeatures features = shpLayer.GetAllFeatures(true); if (dataset != null) { //根据编号删除数据库图层中已经存在的记录即要素 //string sql = "delete from " + txt_layer_name.Text.Trim() + " where 编号 in ("; //for (int j = 0; j < features.Length; j++) //{ // GSOFeature f = features[j]; // if (f != null && f.IsFieldValueNull("编号") == false) // { // string fieldID = f.GetFieldAsString("编号").Trim(); // if (!String.IsNullOrEmpty(fieldID)) // { // sql += "'" + fieldID + "',"; // } // } //} //sql = sql.Substring(0, sql.Length - 1); //sql += ")"; //OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); //根据编号删除数据库图层中已经存在的记录即要素 for (int j = 0; j < features.Length; j++) { GSOFeature f = features[j]; if (f != null && f.IsFieldValueNull("编号") == false) { string fieldID = f.GetFieldAsString("编号").Trim(); if (!String.IsNullOrEmpty(fieldID)) { string sql = "delete from " + txt_layer_name.Text.Trim() + " where 编号 ="+"'" + fieldID + "'"; OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); } } } } featdataset.Close(); featdataset.Open(); for (int j = 0; j < features.Length; j++) { GSOFeature f = features[j]; GSOGeoPoint3D shpPoint = f.Geometry as GSOGeoPoint3D; double z = f.GetFieldAsDouble(combo_z_value.SelectedItem.ToString()); double deep = f.GetFieldAsDouble(combo_z_value.SelectedItem.ToString()); GSOFeature feature = featdataset.CreateFeature(); GSOGeoModel model = new GSOGeoModel(); GSOPoint3d pt = new GSOPoint3d(); pt.X = shpPoint.X; pt.Y = shpPoint.Y; pt.Z = -z; model.Position = pt; //model.Align = EnumEntityAlign.TopCenter; //接口已修复作用 model.AltitudeMode = EnumAltitudeMode.RelativeToGround; model.FilePath = Application.StartupPath + "\\" + f.GetFieldAsString(combo_model_path.SelectedItem.ToString()); model.Name = f.GetValue(combo_model_name.SelectedItem.ToString()).ToString(); feature.Name = f.GetValue(combo_model_name.SelectedItem.ToString()).ToString(); feature.Geometry = model; for (int i = 0; i < feature.GetFieldCount(); i++) { GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(f.GetFieldDefn(i)); if (fielddef == null) continue; object obu = f.GetValue(fielddef.Name); if (obu != null) { string fieldName = fm_cns.ContainsKey(fielddef.Name) == true ? fm_cns[fielddef.Name].ToString() : fielddef.Name; feature.SetValue(fieldName, obu); } } featdataset.AddFeature(feature); } featdataset.Save(); this.Cursor = Cursors.Default; MessageBox.Show("入库成功!", "提示"); if (shpLayer == null) { globeControl1.Globe.Layers.Remove(shpLayer); } GSOLayer layer = globeControl1.Globe.Layers.Add(featdataset); this.layer = layer; this.DialogResult = DialogResult.OK; this.Close(); } catch (Exception ex) { this.Cursor = Cursors.Default; MessageBox.Show("批量导入失败:" + ex.ToString(), "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } #region 自定义方法 private GSOFeatureDataset CreateDBFeatureDataset(string name) { GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(selectLayerName); GSOFeatures features = layer.GetAllFeatures(); if (features.Length == 0) { MessageBox.Show("图层要素个数为0!", "提示"); return null; } GSOFeatureDataset featDs = ds.CreateFeatureDataset(name); if (featDs == null) { MessageBox.Show("图层名称不符合要求!", "提示"); return null; } for (int i = 0; i < features[0].GetFieldCount(); i++) { GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i)); GSOFieldAttr field = new GSOFieldAttr(); field.Name = fm_cns.ContainsKey(fielddef.Name) == true ? fm_cns[fielddef.Name].ToString() : fielddef.Name; switch (fielddef.Type) { case EnumFieldType.Text: field.Type = EnumFieldType.Text; field.Width = 8000; break; case EnumFieldType.INT32: field.Type = EnumFieldType.INT32; field.Width = 4; break; case EnumFieldType.Double: field.Type = EnumFieldType.Double; field.Width = 8; break; case EnumFieldType.Date: field.Type = EnumFieldType.Date; field.Width = 10; break; } bool res = featDs.AddField(field); } featDs.Save(); return featDs; } private string valiValvedata(GSOLayer layer) { string txtMessage = ""; if (layer != null) { GSOFeatureDataset featDataSet = layer.Dataset as GSOFeatureDataset; List<string> lstField = new List<string>(); List<string> listFieldType_Text = new List<string>(); for (int i = 0; i < featDataSet.FieldCount; i++) { string fieldName = featDataSet.GetField(i).Name; lstField.Add(fieldName); if (fm_types.ContainsKey(fieldName)) { string fieldType = fm_types[fieldName].ToString().ToUpper(); switch (featDataSet.GetField(i).Type) { case EnumFieldType.Text: if (fieldType != "string".ToUpper()) { txtMessage += "" + fieldName + "数据类型不正确\r\n"; } listFieldType_Text.Add(fieldName); break; case EnumFieldType.INT32: if (fieldType != "int".ToUpper() && fieldType != "double".ToUpper()) { txtMessage += "" + fieldName + "数据类型不正确\r\n"; } break; case EnumFieldType.INT16: if (fieldType != "int".ToUpper() && fieldType != "double".ToUpper()) { txtMessage += "" + fieldName + "数据类型不正确\r\n"; } break; case EnumFieldType.Double: if (fieldType != "double".ToUpper()) { txtMessage += "" + fieldName + "数据类型不正确\r\n"; } break; case EnumFieldType.Date: if (fieldType != "date".ToUpper()) { txtMessage += "" + fieldName + "数据类型不正确\r\n"; } break; } } } if (!lstField.Contains("编号")) { txtMessage += "编号字段不存在!\r\n"; } if (!lstField.Contains("模型路径")) { txtMessage += "模型路径字段不存在!\r\n"; } if (!lstField.Contains("标识器埋深")) { txtMessage += "标识器埋深字段不存在!\r\n"; } else { GSOFieldAttr fieldZ = featDataSet.GetField("标识器埋深"); if (fieldZ.Type != EnumFieldType.Double && fieldZ.Type != EnumFieldType.Float && fieldZ.Type != EnumFieldType.INT16 && fieldZ.Type != EnumFieldType.INT32) { txtMessage += "\"标识器埋深\"字段必须为数值类型 \r\n"; } } for (int i = 0; i < layer.GetAllFeatures().Length; i++) { GSOFeature f = layer.GetAt(i); for (int j = 0; j < listFieldType_Text.Count; j++) { string fieldName = listFieldType_Text[j]; if (fm_types.ContainsKey(fieldName)) { if (f.GetValue(fieldName).ToString().Trim().Length > 8000) { txtMessage += "名称为" + f.Name + "的要素的字段" + fieldName + "的长度大于8000 !\r\n"; } } } } } return txtMessage; } #endregion } }