public void SetRegionPoint()
        {
            try
            {
                if (m_workspace.Datasources[0].Datasets.Contains("New_Point3D"))
                {
                    DatasetVector datasetPoint3D = m_workspace.Datasources[0].Datasets["New_Point3D"] as DatasetVector;

                    if (m_sceneControl.Scene.Layers.Contains("New_Point3D@gongyuan"))
                    {
                        m_sceneControl.Scene.Layers.Remove("New_Point3D@gongyuan");
                    }

                    {
                        Layer3DSettingVector pointSetting = new Layer3DSettingVector();
                        pointSetting.Style.AltitudeMode      = AltitudeMode.RelativeToGround;
                        pointSetting.Style.MarkerSize        = 1;
                        pointSetting.Style.IsMarkerSizeFixed = true;
                        pointSetting.Style.MarkerScale       = 1;
                        pointSetting.Style.MarkerSymbolID    = m_marker3DIndex;
                        pointSetting.Style.IsMarker3D        = true;
                        m_layer3DRegionPoint = m_sceneControl.Scene.Layers.Add(datasetPoint3D, pointSetting, true, "New_Point3D@gongyuan");
                    }

                    m_layer3DRegionPoint.UpdateData();
                    m_sceneControl.Scene.Refresh();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        //刷新风格
        private void RefreshStyle()
        {
            if (m_layer3D == null)
            {
                return;
            }

            if (m_bSelection)
            {
                m_layer3D.Selection.Style = m_style3D;
                m_layer3D.Selection.UpdateData();
            }
            else
            {
                if (m_layer3D.Type == Layer3DType.Dataset)
                {
                    Layer3DDataset layer3DDataset = m_layer3D as Layer3DDataset;
                    //layer3DDataset.IsEditable = true;
                    Layer3DSettingVector layerSetting = layer3DDataset.AdditionalSetting as Layer3DSettingVector;
                    layerSetting.Style = m_style3D;
                    layer3DDataset.AdditionalSetting = layerSetting;
                    layer3DDataset.UpdateData();
                }
                else if (m_layer3D.Type == Layer3DType.VectorFile)
                {
                    Layer3DVectorFile    layer3DFile  = m_layer3D as Layer3DVectorFile;
                    Layer3DSettingVector layerSetting = layer3DFile.AdditionalSetting as Layer3DSettingVector;
                    layerSetting.Style            = m_style3D;
                    layer3DFile.AdditionalSetting = layerSetting;
                    layer3DFile.UpdateData();
                }
                this.m_sceneControl.Scene.Refresh();
            }
        }
        /// <summary>
        /// 加载北京地铁数据
        /// </summary>
        public void LoadSubway()
        {
            try
            {
                if (!m_sceneControl.Scene.Layers.Contains("ditie3"))
                {
                    //加载北京地铁数据集
                    DatasetVector        dataset_subway = m_workspace.Datasources["Pipeline3D"].Datasets["BeijingSubway"] as DatasetVector;
                    DatasetVector        dataset_label  = m_workspace.Datasources["Pipeline3D"].Datasets["StopsName"] as DatasetVector;
                    Layer3DSettingVector setvetor       = new Layer3DSettingVector();
                    setvetor.Style.AltitudeMode   = AltitudeMode.RelativeToGround;
                    setvetor.Style.BottomAltitude = 5;
                    setvetor.Style.LineWidth      = 100;
                    setvetor.Style.LineSymbolID   = 962046;
                    //setvetor.Style.MarkerColor = Color.Blue; ;

                    Layer3DSettingVector pointSetting = new Layer3DSettingVector();
                    pointSetting.Style.AltitudeMode            = AltitudeMode.ClampToGround;
                    pointSetting.Style.MarkerSize              = 1;
                    pointSetting.Style.MarkerFile              = @"..\..\SampleData\Symbol3DDisplay\SubwayMarkerLibrary.png";
                    pointSetting.Style.IsMarkerSizeFixed       = true;
                    pointSetting.Style.MarkerScale             = 1;
                    m_sceneControl.Scene.Underground.IsVisible = false;
                    Layer3D layer_ditie = m_sceneControl.Scene.Layers.Add(dataset_subway, setvetor, true, "ditie3");

                    //标签专题图
                    Theme3DLabel themeLabel = new Theme3DLabel();
                    themeLabel.LabelExpression          = "Name";
                    themeLabel.UniformStyle.IsSizeFixed = true;
                    themeLabel.UniformStyle.ForeColor   = Color.Yellow;
                    themeLabel.UniformStyle.BackColor   = Color.Black;
                    themeLabel.UniformStyle.Outline     = true;
                    themeLabel.UniformStyle.FontScale   = 1;
                    themeLabel.UniformStyle.Weight      = 7;
                    themeLabel.UniformStyle.FontScale   = 1.0;
                    themeLabel.UniformStyle.Alignment   = TextAlignment.MiddleRight;
                    themeLabel.UniformStyle.IsSizeFixed = true;


                    Layer3D layer1      = m_sceneControl.Scene.Layers.Add(dataset_label, pointSetting, true);
                    Layer3D layer_label = m_sceneControl.Scene.Layers.Add(dataset_label, themeLabel, true);

                    Camera camera = m_sceneControl.Scene.Camera;
                    camera.AltitudeMode = AltitudeMode.RelativeToGround;
                    camera.Altitude     = 5508.4005263671279;
                    camera.Latitude     = 39.908042501262457;
                    camera.Longitude    = 116.39138653936693;
                    camera.Tilt         = 45.45877650025642;
                    camera.Heading      = 0.016679026847733185;
                    m_sceneControl.Scene.Fly(camera, 2);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="sceneControl"></param>
        /// <param name="layer3D"></param>
        /// <param name="isSelection"></param>
        public void Initialize(SceneControl sceneControl, Layer3D layer3D, bool isSelection)
        {
            m_sceneControl = sceneControl;
            m_layer3D      = layer3D;
            m_bSelection   = isSelection;

            this.cb_AltitudeMode.Items.Clear();

            //初始化高度模式列表
            if (m_bSelection)
            {
                this.cb_AltitudeMode.Items.Add("贴地");
                this.cb_AltitudeMode.Items.Add("贴对象");
            }
            else
            {
                this.cb_AltitudeMode.Items.Add("贴地");
                this.cb_AltitudeMode.Items.Add("贴对象");
                this.cb_AltitudeMode.Items.Add("相对地面");
                this.cb_AltitudeMode.Items.Add("绝对高度");
                this.cb_AltitudeMode.Items.Add("相对地下");
            }

            //初始化m_style3D
            if (m_bSelection)
            {
                m_style3D = m_layer3D.Selection.Style;
            }
            else
            {
                if (m_layer3D.Type == Layer3DType.Dataset)
                {
                    Layer3DDataset       layer3DDataset = m_layer3D as Layer3DDataset;
                    Layer3DSettingVector layerSetting   = layer3DDataset.AdditionalSetting as Layer3DSettingVector;
                    m_style3D = layerSetting.Style;
                }
                else if (m_layer3D.Type == Layer3DType.VectorFile)
                {
                    Layer3DVectorFile    layer3DFile  = m_layer3D as Layer3DVectorFile;
                    Layer3DSettingVector layerSetting = layer3DFile.AdditionalSetting as Layer3DSettingVector;
                    m_style3D = layerSetting.Style;
                }
            }

            this.UpdateData();
        }
        /// <summary>
        /// 加载地下管道线
        /// </summary>
        public void LoadPipeLine3D()
        {
            try
            {
                m_SelectedGeoNetwork = new List <NetworkGeometry>();
                DatasetVector dataset_PipeLine  = m_workspace.Datasources["Pipeline3D"].Datasets["PipeLine3D"] as DatasetVector;
                DatasetVector dataset_PipePoint = m_workspace.Datasources["Pipeline3D"].Datasets["PipePoint3D"] as DatasetVector;

                Layer3DSettingVector setvetor = new Layer3DSettingVector();
                setvetor.Style.AltitudeMode = AltitudeMode.RelativeToGround;
                setvetor.Style.LineSymbolID = 962048;
                setvetor.Style.LineWidth    = 0.35;


                Layer3DDataset layer_ditie     = m_sceneControl.Scene.Layers.Add(dataset_PipeLine, setvetor, true, "PipeLine3D");
                Layer3DDataset layer_pipepoint = m_sceneControl.Scene.Layers.Add(dataset_PipePoint, setvetor, true, "PipePoint3D");

                if (dataset_PipePoint != null)
                {
                    Theme3DUnique theme = new Theme3DUnique();
                    theme.UniqueExpression = "SmID";
                    GeoStyle3D style3D = new GeoStyle3D();
                    style3D.AltitudeMode   = AltitudeMode.RelativeToGround;
                    style3D.Marker3DScaleX = 2.2;
                    style3D.Marker3DScaleY = 2.2;
                    style3D.Marker3DScaleZ = 2.2;

                    style3D.IsMarker3D = true;
                    theme.DefaultStyle = style3D;
                    Recordset rs = dataset_PipePoint.Query("", CursorType.Static);
                    rs.MoveFirst();
                    while (!rs.IsEOF)
                    {
                        Theme3DUniqueItem item = new Theme3DUniqueItem();
                        item.Unique = rs.GetID().ToString();
                        item.IsModellingStyleEnabled = true;
                        GeoStyle3D tempStyle = new GeoStyle3D(style3D);
                        PickNodeToLine(rs.GetID());
                        GeoPoint3D geoPoint3D = rs.GetGeometry() as GeoPoint3D;

                        List <Vector3d> arrVector3d = new List <Vector3d>();
                        for (Int32 curIndex = 0; curIndex < m_SelectedGeoNetwork.Count; curIndex++)
                        {
                            NetworkGeometry geoNetWork = m_SelectedGeoNetwork[curIndex];

                            if (geoNetWork != null)
                            {
                                Vector3d  vec     = new Vector3d();
                                GeoLine3D geoLine = geoNetWork.geometry as GeoLine3D;
                                if (geoNetWork.bIsIn)
                                {
                                    if (geoLine != null)
                                    {
                                        Point3Ds point3D  = geoLine[0];
                                        Point3D  pntTNode = point3D[1];
                                        Point3D  pntFNode = point3D[0];
                                        Vector3d vecTNode = SphericalToCartesian(pntTNode.X * DTOR, pntTNode.Y * DTOR, pntTNode.Z);
                                        Vector3d vecFNode = SphericalToCartesian(pntFNode.X * DTOR, pntFNode.Y * DTOR, pntFNode.Z);

                                        vec = new Vector3d(vecFNode.x - vecTNode.x, vecFNode.y - vecTNode.y, vecFNode.z - vecTNode.z);
                                        vec.Normalize();
                                    }
                                }
                                else
                                {
                                    if (geoLine != null)
                                    {
                                        Point3Ds point3D  = geoLine[0];
                                        Point3D  pntFNode = point3D[0];
                                        Point3D  pntTNode = point3D[1];
                                        Vector3d vecTNode = SphericalToCartesian(pntTNode.X * DTOR, pntTNode.Y * DTOR, pntTNode.Z);
                                        Vector3d vecFNode = SphericalToCartesian(pntFNode.X * DTOR, pntFNode.Y * DTOR, pntFNode.Z);

                                        vec = new Vector3d(vecTNode.x - vecFNode.x, vecTNode.y - vecFNode.y, vecTNode.z - vecFNode.z);
                                        vec.Normalize();
                                    }
                                }

                                vec = FromAngleAxis(vec, -geoPoint3D.X * DTOR, new Vector3d(0, 1, 0));
                                vec = FromAngleAxis(vec, geoPoint3D.Y * DTOR, new Vector3d(1, 0, 0));
                                vec.Normalize();
                                arrVector3d.Add(vec);
                            }
                        }

                        Vector3d vecX = new Vector3d();
                        Vector3d vecY = new Vector3d();
                        Vector3d vecZ = new Vector3d();
                        switch (m_SelectedGeoNetwork.Count)
                        {
                        case 2:    //弯头或阀门
                        {
                            if (arrVector3d.Count == 2)
                            {
                                vecX = arrVector3d[0].Normalize().Sub();
                                vecY = arrVector3d[1].Normalize();
                            }

                            double dAngle1_2 = vecX.DotProduct(vecY);
                            if (Math.Abs(dAngle1_2) < 0.3)
                            {
                                tempStyle.MarkerSymbolID = 54441;
                            }
                            else if (-1 < dAngle1_2 && dAngle1_2 < 0.7)
                            {
                                tempStyle.MarkerSymbolID = 54442;
                            }
                            else
                            {
                                vecY.z = 0;
                                Vector3d vec = new Vector3d(0, 0, 1);
                                vecX = vecY.CrossProduct(vec);
                                tempStyle.MarkerSymbolID = 54435;
                            }
                        }
                        break;

                        case 3:    //三通
                        {
                            tempStyle.MarkerSymbolID = 54437;

                            if (arrVector3d.Count == 3)
                            {
                                Vector3d vec1 = arrVector3d[0];
                                Vector3d vec2 = arrVector3d[1];
                                Vector3d vec3 = arrVector3d[2];

                                double dAngle1_2 = vec1.DotProduct(vec2);
                                double dAngle1_3 = vec1.DotProduct(vec3);
                                double dAngle2_3 = vec2.DotProduct(vec3);
                                if (Math.Abs(dAngle1_2) < 0.3)
                                {
                                    if (Math.Abs(dAngle1_3) < 0.3)
                                    {
                                        vecX = vec1.Normalize().Sub();
                                        vecY = vec2.Normalize();
                                    }
                                    else
                                    {
                                        vecX = vec2.Normalize().Sub();
                                        vecY = vec1.Normalize();
                                    }
                                }
                                else
                                {
                                    vecX = vec3.Normalize().Sub();
                                    vecY = vec1.Normalize();
                                }
                            }
                        }
                        break;

                        case 4:    //四通
                        {
                            tempStyle.MarkerSymbolID = 54438;
                            if (arrVector3d.Count == 4)
                            {
                                Vector3d vec1 = arrVector3d[0];
                                Vector3d vec2 = arrVector3d[1];
                                Vector3d vec3 = arrVector3d[2];

                                double dAngle1_2 = vec1.DotProduct(vec2);
                                double dAngle1_3 = vec1.DotProduct(vec3);

                                vecX = vec1;
                                if (Math.Abs(dAngle1_2) < 0.3)
                                {
                                    vecY = vec2.Normalize();
                                }
                                else
                                {
                                    vecY = vec3.Normalize();
                                }
                            }
                        }
                        break;

                        default:    //结点
                        {
                            tempStyle.MarkerSymbolID = 330101;
                        }
                        break;
                        }

                        if (m_SelectedGeoNetwork.Count > 1)
                        {
                            vecZ = vecX.CrossProduct(vecY);
                            vecZ.Normalize();

                            Vector3d vecRotate = ToEulerAnglesXYZ(vecX, vecY, vecZ);

                            tempStyle.Marker3DRotateX = -vecRotate.x * RTOD;
                            tempStyle.Marker3DRotateY = -vecRotate.y * RTOD;
                            tempStyle.Marker3DRotateZ = -vecRotate.z * RTOD;
                        }
                        item.Style = tempStyle;
                        theme.Add(item);
                        rs.MoveNext();
                    }
                    rs.Dispose();
                    Layer3D layer_theme = m_sceneControl.Scene.Layers.Add(dataset_PipePoint, theme, true, "underPipeLine3D");
                    layer_theme.IsSelectable = false;
                    if (m_sceneControl.Scene.Layers.Contains("PipePoint3D"))
                    {
                        m_sceneControl.Scene.Layers.Remove("PipePoint3D");
                    }

                    Camera camera = m_sceneControl.Scene.Camera;
                    camera.AltitudeMode = AltitudeMode.RelativeToGround;
                    camera.Altitude     = 26.978640816174448;
                    camera.Latitude     = 39.992608337161023;
                    camera.Longitude    = 116.3898561529368;
                    camera.Tilt         = 59.567389444384283;
                    camera.Heading      = 300.19323029928478;
                    m_sceneControl.Scene.Fly(camera, 1);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }