using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using DevComponents.DotNetBar; using GeoScene.Globe; using GeoScene.Engine; using GeoScene.Data; using System.IO; using System.Collections; using System.Xml; namespace Cyberpipe { public partial class FrmMultiPipelineModelDB : Office2007Form { private GeoScene.Globe.GSOGlobeControl globeControl1; GSODataSource ds = null; public GSOLayer rukuLayer = null; private Hashtable en_cns = new Hashtable(); private Hashtable fields_types = new Hashtable(); public FrmMultiPipelineModelDB(GSOGlobeControl _globeControl,GSODataSource _ds) { globeControl1 = _globeControl; ds = _ds; InitializeComponent(); cmbReference.Text = "管顶"; chkDeep.Checked = true; } private void FrmMultiPipelineModelDB_Load(object sender, EventArgs e) { string pipelinetype = Utility.pipelinetype; string[] pipelinetypes = pipelinetype.Split(','); for (int i = 0; i < pipelinetypes.Length; i++) { pipelineTypeCbo.Items.Add(pipelinetypes[i]); } comboBoxShpLayerList.Items.Clear(); for (int i = 0; i < globeControl1.Globe.Layers.Count; i++) { GSOLayer layer = globeControl1.Globe.Layers[i]; if (layer != null && layer.Name.ToLower().EndsWith(".shp")) { comboBoxShpLayerList.Items.Add(layer.Caption); } } string filename = Application.StartupPath + "\\FormText.xml"; if (File.Exists(filename)) { XmlTextReader XmlReader = new XmlTextReader(filename); try { while (XmlReader.Read()) { if (XmlReader.Name == "Field") { string str1 = XmlReader["label"]; string str3 = XmlReader["type"]; string str2 = XmlReader.ReadElementString(); en_cns.Add(str1, str2); fields_types.Add(str1, str3); } } } catch (Exception ex) { LogError.PublishError(ex); MessageBox.Show(ex.Message); } } } private void cmbLayer_SelectedIndexChanged(object sender, EventArgs e) { if (comboBoxShpLayerList.SelectedItem == null) { return; } GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxShpLayerList.SelectedItem.ToString().Trim()); if (layer == null) { return; } string txtMessage = valiPipeData(layer); if (txtMessage != "") { cmbFrom.Items.Clear(); cmbTo.Items.Clear(); cmbRadius.Items.Clear(); cmbID.Items.Clear(); cmbWidthNum.Items.Clear(); cmbHeightNum.Items.Clear(); FrmValiDataShowErrorMessage showErrorMessage = new FrmValiDataShowErrorMessage(comboBoxShpLayerList.SelectedItem.ToString().Trim(), txtMessage); showErrorMessage.ShowDialog(); return; } else { textBoxNewLayerName.Text = layer.Caption; GSOFeatures features = layer.GetAllFeatures(); if (features.Length == 0) return; cmbFrom.Items.Clear(); cmbTo.Items.Clear(); cmbRadius.Items.Clear(); cmbID.Items.Clear(); cmbWidthNum.Items.Clear(); cmbHeightNum.Items.Clear(); for (int i = 0; i < features[0].GetFieldCount(); i++) { cmbFrom.Items.Add(((GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i))).Name); cmbTo.Items.Add(((GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i))).Name); cmbRadius.Items.Add(((GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i))).Name); cmbID.Items.Add(((GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i))).Name); cmbWidthNum.Items.Add(((GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i))).Name); cmbHeightNum.Items.Add(((GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i))).Name); } cmbFrom.SelectedItem = "Deep1"; cmbTo.SelectedItem = "Deep2"; cmbRadius.SelectedItem = "Diameter"; cmbWidthNum.SelectedItem = "Hor_Num";// "Weight"; cmbHeightNum.SelectedItem = "Ver_Num";// "Height"; cmbID.SelectedItem = "Handle"; } } private void btnPipelineColor_Click(object sender, EventArgs e) { colorDialog1.Color = btnPipelineColor.BackColor; if (colorDialog1.ShowDialog() == DialogResult.OK) { btnPipelineColor.BackColor = colorDialog1.Color; } } private void btnCreateModel_Click(object sender, EventArgs e) { //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 = Math.Round( radius * 2.0 * num_width + 0.08,5);// 两端空出0.04 double rectHeight = Math.Round(radius * 2.0 * num_height + 0.08, 5); 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; } GSOPoint3ds ps = line[0]; for (int n = 0; n < ps.Count; n++) { GSOPoint3d pt3d = ps[n]; int pointcount = ps.Count; double radio = Math.Sqrt(Math.Pow(pt3d.Y - ps[0].Y, 2) + Math.Pow(pt3d.X - ps[0].X, 2)) / Math.Sqrt(Math.Pow(ps[pointcount - 1].Y - ps[0].Y, 2) + Math.Pow(ps[pointcount - 1].X - ps[0].X, 2)); pt3d.Z = deep1 + (deep2 - deep1) * radio; if (double.IsInfinity(pt3d.Z)) { pt3d.Z = deep2; } ps[n] = pt3d; } line[0] = ps; if (num_height == 0 || num_width == 0) // 直埋 { newFeature.Geometry = line; newFeature.Geometry.Style = style; //newFeature.Name = eventid; newFeature.Name = en_cns.ContainsKey(eventid) == true ? en_cns[eventid].ToString() : 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); } } pipeline.Save(); pipelineRect.Save(); string strMessage = "shp文件中共" + features.Length + "个对象,实际入库" + pipeline.GetAllFeatures().Length + "个对象!\r\n"; pipeline.Close(); pipelineRect.Close(); globeControl1.Refresh(); GSOLayer layerRuku = globeControl1.Globe.Layers.Add(textBoxNewLayerName.Text); rukuLayer = layerRuku; if (message == "") { MessageBox.Show(strMessage, "提示"); } else { //FrmMessageShow frm = new FrmMessageShow(strMessage + message); //frm.ShowDialog(); MessageBox.Show(strMessage + message, "提示"); } this.DialogResult = DialogResult.OK; this.Close(); } catch (Exception ex) { //Log.PublishTxt(ex); MessageBox.Show(ex.Message); } } private void SetFields(GSOFeature oldfeat, GSOFeature newFeature) { for (int i = 0; i < oldfeat.GetFieldCount(); i++) { GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(oldfeat.GetFieldDefn(i)); object fieldvalue = oldfeat.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); } } private GSOGeoPolyline3D CreatePipeRect(GSOGeoPolyline3D line, double width, double height) { GSOGeoPolyline3D cloneline = line.Clone() as GSOGeoPolyline3D; GSOExtendSectionLineStyle3D style = createRectStyle(width, height); if (style == null) { return null; } cloneline.Style = style; return cloneline; } private GSOExtendSectionLineStyle3D createRectStyle(double width, double height) { GSOExtendSectionLineStyle3D style = new GSOExtendSectionLineStyle3D(); style.LineColor = Color.FromArgb(Convert.ToByte(numOpaqueRect.Value), btnRectColor.BackColor); if (width == 0 || height == 0) { return null; } 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 = true; style.SetAnchorByAlign(EnumAlign.MiddleCenter); return style; } private void btnClose_Click(object sender, EventArgs e) { this.Close(); } private void one2Multi(GSOGeoPolyline3D line, int num_width, int num_height, double interval, GSOPipeLineStyle3D style, GSOFeatureDataset layer,string name,GSOFeature oldfeat) { line = LatLon2Coord_Line(line); double width_all = interval * (num_width-1); double height_all = interval * (num_height-1); GSOGeoPolyline3D line_1 = line.Clone() as GSOGeoPolyline3D; GSOPoint3d p1 = line[0][0]; GSOPoint3d p2 = line[0][1]; double daltaX = p2.X-p1.X; double daltaY = p2.Y-p1.Y; double agree = Math.Atan(daltaY/daltaX); GSOPoint2d point = new GSOPoint2d((-0.5*width_all-interval)*Math.Sin(agree),(0.5*width_all+interval)*Math.Cos(agree)); line.MoveXY(point.X,point.Y); line.MoveZ(height_all / -2); for (int i = 0; i < num_width; i++) { for (int j = 0; j < num_height; j++) { GSOGeoPolyline3D templine = line.Clone() as GSOGeoPolyline3D; point = new GSOPoint2d((i + 1) * interval * Math.Sin(agree), -1 * (i + 1) * interval * Math.Cos(agree)); templine.MoveXY(point.X,point.Y); templine.MoveZ(interval*j); templine = Coord2LatLon_Line(templine); GSOFeature feat = layer.CreateFeature(); feat.Geometry = templine; feat.Geometry.Style = style; feat.Name = name; SetFields(oldfeat, feat); layer.AddFeature(feat); } } } private GSOGeoPolyline3D LatLon2Coord_Line(GSOGeoPolyline3D line) { GSOGeoPolyline3D newline = line.Clone() as GSOGeoPolyline3D; GSOPoint3ds ps = newline[0]; for (int i = 0; i < ps.Count; i++) { GSOPoint3d pt = ps[i]; GSOPoint2d pt2d = new GSOPoint2d(pt.X, pt.Y); GSOPoint2d pt2dnew = LatLon2Coord(pt2d); GSOPoint3d ptnew = new GSOPoint3d(pt2dnew.X, pt2dnew.Y, pt.Z); ps[i] = ptnew; } newline[0] = ps; return newline; } private GSOGeoPolyline3D Coord2LatLon_Line(GSOGeoPolyline3D line) { GSOGeoPolyline3D newline = line.Clone() as GSOGeoPolyline3D; GSOPoint3ds ps = newline[0]; for (int i = 0; i < ps.Count; i++) { GSOPoint3d pt = ps[i]; GSOPoint2d pt2d = new GSOPoint2d(pt.X, pt.Y); GSOPoint2d pt2dnew = Coord2LatLon(pt2d); GSOPoint3d ptnew = new GSOPoint3d(pt2dnew.X, pt2dnew.Y, pt.Z); ps[i] = ptnew; } newline[0] = ps; return newline; } private GSOPoint2d LatLon2Coord(GeoScene.Data.GSOPoint2d pt2d) { int id = GeoScene.Data.GSOProjectManager.AddProject("+proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=-4869.018 +y_0=-3421238.225 +a=6378140 +b=6356755.288157528 +units=m +no_defs"); GeoScene.Data.GSOPoint2d result = GeoScene.Data.GSOProjectManager.Forward(pt2d, id); return result; } private GSOPoint2d Coord2LatLon(GeoScene.Data.GSOPoint2d pt2d) { int id = GeoScene.Data.GSOProjectManager.AddProject("+proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=-4869.018 +y_0=-3421238.225 +a=6378140 +b=6356755.288157528 +units=m +no_defs"); GeoScene.Data.GSOPoint2d result = GeoScene.Data.GSOProjectManager.Inverse(pt2d, id); return result; //+proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=499885 +y_0=6 +ellps=krass +units=m +no_defs } private GSOFeatureDataset CreateDBFeatureDataset(string name) { if (comboBoxShpLayerList.SelectedItem == null) { MessageBox.Show("请选择一个Shp图层!", "提示"); return null; } GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxShpLayerList.SelectedItem.ToString().Trim()); if (layer == null) { MessageBox.Show("Shp图层为空!", "提示"); return null; } GSOFeatures features = layer.GetAllFeatures(); if (features.Length == 0) { MessageBox.Show("图层要素个数为0!", "提示"); return null; } GSOFeatureDataset featureDataset = layer.Dataset as GSOFeatureDataset; if (featureDataset == null) { MessageBox.Show("Shp图层不是矢量图层!", "提示"); return null; } //GSODataSource ds = Utility.getDataSourceByFullName(globeControl1, comboBoxDataSourceList.SelectedItem.ToString().Trim()); if (ds == null) { MessageBox.Show("选择的目标数据源为空!", "提示"); return null ; } GSOFeatureDataset newFeatureDataset = ds.CreateFeatureDataset(name); if (newFeatureDataset != null) { for (int i = 0; i < featureDataset.FieldCount; i++) { GeoScene.Data.GSOFieldAttr fielddef = featureDataset.GetField(i); GSOFieldAttr field = new GSOFieldAttr(); //field.Name = fielddef.Name; field.Name = en_cns.ContainsKey(fielddef.Name) == true ? en_cns[fielddef.Name].ToString() : fielddef.Name; field.Type = fielddef.Type; field.Width = fielddef.Width; field.Precision = fielddef.Precision; bool res = newFeatureDataset.AddField(field); } newFeatureDataset.Save(); } return newFeatureDataset; } private void pipelineTypeCbo_SelectedIndexChanged(object sender, EventArgs e) { if ((pipelineTypeCbo.Text != "给水") && (pipelineTypeCbo.Text != "天然气") && (pipelineTypeCbo.Text != "燃气") && (pipelineTypeCbo.Text != "中水")) { cmbReference.Text = "管底"; } else { cmbReference.Text = "管顶"; } if (pipelineTypeCbo.Text == "给水") { btnPipelineColor.BackColor = Color.FromArgb(0, 0, 255); } else if (pipelineTypeCbo.Text == "供电") { btnPipelineColor.BackColor = Color.FromArgb(255, 100, 150); } else if (pipelineTypeCbo.Text == "雨水") { btnPipelineColor.BackColor = Color.FromArgb(230, 120, 0); } else if (pipelineTypeCbo.Text == "污水") { btnPipelineColor.BackColor = Color.FromArgb(128, 64, 0); } else if (pipelineTypeCbo.Text == "天然气") { btnPipelineColor.BackColor = Color.FromArgb(215, 0, 64); } else if (pipelineTypeCbo.Text == "共通") { btnPipelineColor.BackColor = Color.FromArgb(0, 255, 0); } else if (pipelineTypeCbo.Text == "电通") { btnPipelineColor.BackColor = Color.FromArgb(0, 255, 0); } else if (pipelineTypeCbo.Text == "有线电视") { btnPipelineColor.BackColor = Color.FromArgb(0, 255, 0); } else if (pipelineTypeCbo.Text == "监控") { btnPipelineColor.BackColor = Color.FromArgb(0, 255, 0); } else if (pipelineTypeCbo.Text == "交通信号") { btnPipelineColor.BackColor = Color.FromArgb(0, 255, 0); } else if (pipelineTypeCbo.Text == "路灯") { btnPipelineColor.BackColor = Color.FromArgb(255, 0, 150); } else if (pipelineTypeCbo.Text == "通讯") { btnPipelineColor.BackColor = Color.FromArgb(0, 255, 0); } else { btnPipelineColor.BackColor = Color.FromArgb(0, 0, 0); } } private object convertFieldValue(string fieldname, object obj) { if (obj == null) return null; try { string type = fields_types[fieldname].ToString(); switch (type) { case "string": return obj.ToString(); case "int": //return 101; int intResult; if (int.TryParse(obj.ToString(), out intResult)) return intResult; else return null; case "double": //return 202.5; double doubleResult; if (double.TryParse(obj.ToString(), out doubleResult)) return doubleResult; else return null; case "date": DateTime dtResult; if (DateTime.TryParse(obj.ToString(), out dtResult)) return dtResult; else return null; } return null; } catch (Exception ex) { LogError.PublishError(ex); return null; } } /// <summary> /// 验证shp格式文件 /// </summary> /// <param name="layer"></param> /// <returns></returns> private string valiPipeData(GSOLayer layer) //验证shp格式文件 { 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 (fields_types.ContainsKey(fieldName)) { string fieldType = fields_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("Deep1")) { txtMessage += "Deep1字段不存在!\r\n"; } else { GSOFieldAttr fieldDeep1 = featDataSet.GetField("Deep1"); if (fieldDeep1.Type != EnumFieldType.Double && fieldDeep1.Type != EnumFieldType.Float && fieldDeep1.Type != EnumFieldType.INT16 && fieldDeep1.Type != EnumFieldType.INT32) { txtMessage += "Deep1字段必须为数值类型\r\n"; } } if (!lstField.Contains("Deep2")) { txtMessage += "Deep2字段不存在!\r\n"; } else { GSOFieldAttr fieldDeep1 = featDataSet.GetField("Deep2"); if (fieldDeep1.Type != EnumFieldType.Double && fieldDeep1.Type != EnumFieldType.Float && fieldDeep1.Type != EnumFieldType.INT16 && fieldDeep1.Type != EnumFieldType.INT32) { txtMessage += "Deep2字段必须为数值类型\r\n"; } } if (!lstField.Contains("Diameter")) { txtMessage += "Diameter字段不存在!\r\n"; } else { GSOFieldAttr fieldDeep1 = featDataSet.GetField("Diameter"); if (fieldDeep1.Type != EnumFieldType.Double && fieldDeep1.Type != EnumFieldType.Float && fieldDeep1.Type != EnumFieldType.INT16 && fieldDeep1.Type != EnumFieldType.INT32) { txtMessage += "Diameter字段必须为数值类型\r\n"; } } if (!lstField.Contains("Handle")) { txtMessage += "Handle字段不存在!\r\n"; } List<string> lstHandle = new List<string>(); 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 (fields_types.ContainsKey(fieldName)) { if (f.GetValue(fieldName).ToString().Trim().Length > 8000) { txtMessage += "ID为" + f.ID + "的要素的字段" + fieldName + "的长度大于8000 !\r\n"; } } } if (f.GetFieldAsFloat("Diameter") <= 0) { txtMessage += "ID为" + f.ID + "\"Diameter\"字段中的值必须大于0 \r\n"; } if (!lstHandle.Contains(f.GetFieldAsString("Handle"))) { lstHandle.Add(f.GetFieldAsString("Handle")); } else { txtMessage += "ID为" + f.ID + "的\"Handle\"字段中的值重复\r\n"; } } } return txtMessage; } } }