Newer
Older
LSPipeline / GXBuilder.cs
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;
        }

    }
}