using System; using System.Drawing; using System.Windows.Forms; using GeoScene.Data; using GeoScene.Engine; namespace Cyberpipe { class RedLineBuilder:IModelBuilder { public GSOFeatureDataset fetchFeatureDataset(GSODataSource ds, string datasetName, GSOFeature feature) { GSODataset dataset = ds.GetDatasetByName(datasetName); GSOFeatureDataset gsoFeatureDataset; if (dataset != null) { //获取原有的GSOFeatureDataSet gsoFeatureDataset = dataset as GSOFeatureDataset; } else { //创建新的GSOFeatureDataSet,同时要创建各个feature的字段值 gsoFeatureDataset = createFeatureDatasetWithFields(ds, datasetName, feature); } return gsoFeatureDataset; } public GSOFeatureDataset createFeatureDatasetWithFields(GSODataSource ds, string datasetName, GSOFeature feature) { GSOFeatureDataset featDs = ds.CreateFeatureDataset(datasetName); for (int i = 0; i < feature.GetFieldCount(); i++) { GSOFieldDefn fielddef = feature.GetFieldDefn(i); GSOFieldAttr field = new GSOFieldAttr { Name = fielddef.Name }; switch (fielddef.Type) { 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; case EnumFieldType.Text: field.Type = EnumFieldType.Text; field.Width = 100; break; } bool res = featDs.AddField(field); } featDs.Save(); return featDs; } public void batchInsert(GSODataSource ds, string datasetName, GSOFeatures features) { //for (int i = 0; i < features.Length;i++ ) //{ GSOFeatureDataset featdataset = fetchFeatureDataset(ds, datasetName, features[0]); featdataset.Open(); for (int j = 0; j < features.Length; j++) { //TODO LIST:创建管线对象 GSOFeature feature = createFeatureWithModel(features[j], featdataset); featdataset.AddFeature(feature); } featdataset.Save(); //} } private GSOFeature createFeatureWithModel(GSOFeature gsoFeature, GSOFeatureDataset fds) { GSOFeature newfeature = fds.CreateFeature(); GSOSimpleLineStyle3D style = new GSOSimpleLineStyle3D(); style.LineWidth = 12; style.LineColor = Color.FromArgb(Convert.ToByte(255), Color.Red); GSOGeoPolyline3D line = gsoFeature.Geometry.Clone() as GSOGeoPolyline3D; GSOPoint3ds pt3ds = line[0]; for (int n = 0; n < pt3ds.Count; n++) { GSOPoint3d pt3d = pt3ds[n]; pt3d.Z = 0; pt3ds[n] = pt3d; } line[0] = pt3ds; line.Style = style; line.Name = gsoFeature.Dataset.Caption; newfeature.Geometry = line; for (int i = 0; i < newfeature.GetFieldCount(); i++) { try { GSOFieldDefn fielddef = gsoFeature.GetFieldDefn(i); object obu = gsoFeature.GetValue(fielddef.Name); if (obu != null) { newfeature.SetValue(fielddef.Name, obu); } } catch (Exception ex) { MessageBox.Show("新入红线字段缺失!", "提示"); } } return newfeature; } } }