using System; using System.Data; using System.Drawing; using System.Runtime.InteropServices; using GeoScene.Data; using GeoScene.Engine; using GeoScene.Globe; namespace WorldGIS { public class GXBuilder : ModelBuilder { private static double diameter = 0.1; public GXBuilder(GSODataSource ds) : base(ds) { } public override bool validate(GSOLayer layer) { return true; } /// <summary> /// /// </summary> /// <param name="updateMode">追加或修改</param> /// <param name="buildMode">高程入库或埋深入库</param> /// <param name="param"></param> public override bool doBuild(EnumUpdateMode updateMode, EnumBuildMode buildMode, BaseParam param) { LineParam lineParam = param as LineParam; GSOFeatureDataset newFeatureSet = ds.GetDatasetByName(lineParam.layerName) as GSOFeatureDataset; if (newFeatureSet == null) { newFeatureSet = CreateDBFeatureDataset(layer, lineParam.layerName); } newFeatureSet.Open(); GSOFeatures features = layer.GetAllFeatures(true); for (int i = 0; i < features.Length; i++) { GSOFeature f = features[i]; GSOGeoPolyline3D lineeee = f.Geometry as GSOGeoPolyline3D; if (lineeee == null || lineeee.GetSpaceLength(true, 6378137) == 0) { LogHelper.Error("出现数据无法入库:" + f.ID); continue; } GSOFeature newFeature = newFeatureSet.CreateFeature(); double radius = diameter; //创建光纤的半径 newFeature.Geometry = updateGemotry(f, lineParam, radius, buildMode); newFeature.Geometry.Style = getPipeLineStyle(lineParam, f, radius); newFeature.Name = f.GetFieldAsString(lineParam.uniqueIdFieldName); setFeatureValueByShapeFeature(f, newFeature); // newFeatureSet if (newFeatureSet.GetFeatureByName(newFeature.Name, true).Length > 0) { if (!this.UpdateGXDevice(newFeatureSet.GetFeatureByName(newFeature.Name, true)[0], newFeature)) { LogHelper.Error("光纤设备更新失败:" + newFeature.Name+"\r\n"); } continue; } newFeatureSet.AddFeature(newFeature); if (!AddGXDevice(newFeature)) { LogHelper.Error("光纤数据保存Alarm_Device失败:" + newFeature.Name+"\r\n"); } } newFeatureSet.Save(); newFeatureSet.Close(); return true; } private bool AddGXDevice(GSOFeature feature) { //保存数据到设备表 try { String deviceType = feature.GetValue("DEVICETYPE") == null ? "" : feature.GetValue("DEVICETYPE").ToString(); String devCode = feature.GetValue("DEVICEID") == null ? "" : feature.GetValue("DEVICEID").ToString(); String road = feature.GetValue("ROAD") == null ? "" : feature.GetValue("ROAD").ToString(); //TODO LIST: string sqlCount = "select dbid from alarm_device_type where" + " typename = '" + deviceType + "'"; object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, CommandType.Text, sqlCount); if (dbid == null) { return false; } int deviceTypeId = int.Parse(dbid.ToString()); string sql = "Insert into alarm_device (DBID,ACTIVE,DEVCODE,DEVNAME,FACTORY," + "INSTALLDATE,GAOCHENG,HEIGHT,LATITUDE,LONGTITUDE,DEVICETYPE_ID) " + "values (SEQ_DEVICE_ID.NEXTVAL, 1, '" + devCode + "', '" + deviceType + devCode + "', " + "'航天二院', " + "to_date('" + DateTime.Now.ToString() + "','yyyy/MM/dd hh24:mi::ss'), " + "0, 0, 0, 0, " + deviceTypeId + ")"; OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); } catch (Exception e) { throw; } return true; } private bool UpdateGXDevice(GSOFeature feature, GSOFeature newFeature) { String deviceType = newFeature.GetValue("DEVICETYPE") == null ? "" : newFeature.GetValue("DEVICETYPE").ToString(); String devCode = newFeature.GetValue("DEVICEID") == null ? "" : newFeature.GetValue("DEVICEID").ToString(); String road = newFeature.GetValue("ROAD") == null ? "" : newFeature.GetValue("ROAD").ToString(); feature.Geometry = newFeature.Geometry.Clone(); this.setFeatureValueByShapeFeature(newFeature,feature); // feature.Dataset.Save(); string sqlCount = "select dbid from alarm_device_type where" + " typename = '" + deviceType + "'"; object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, CommandType.Text, sqlCount); if (dbid == null) { return false; } int deviceTypeId = int.Parse(dbid.ToString()); string sql = "update alarm_device set FACTORY='" + road + "', DEVICETYPE_ID='" + deviceTypeId + "', DEVNAME='"+deviceType+devCode+"' "+ "where devcode='" + devCode + "'"; OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); return true; } private GSOLineStyle3D getPipeLineStyle(LineParam lineParam, GSOFeature f, double radius) { GSOPipeLineStyle3D style0 = new GSOPipeLineStyle3D(); style0.LineColor = Color.FromArgb(lineParam.transparency, lineParam.lineColor); style0.Slice = lineParam.sliceNum; style0.CornerSliceAngle = lineParam.cornerSliceAngle; style0.Radius = radius; return style0; } private GSOGeometry updateGemotry(GSOFeature f, LineParam lineParam, double radius, EnumBuildMode buildMode) { f.Geometry.AltitudeMode = (buildMode.Equals(EnumBuildMode.Alititude)) ? EnumAltitudeMode.RelativeToGround : EnumAltitudeMode.Absolute; GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; if (line == null) { return null; //log4net 记录错误处理 } double deep1 = 0; double deep2 = 0; GSOPoint3ds pt3ds = new GSOPoint3ds(); for (int n = 0; n < line[0].Count; n++) { GSOPoint3d pt3d = line[0][n]; pt3d.Z = 0; pt3ds.Add(pt3d); } line[0] = pt3ds; return line; } } }