//如果kml中已经保存运动轨迹,可以选择已保存好的运动轨迹 private void cb_Track_SelectedIndexChanged(object sender, EventArgs e) { if (cb_Track.SelectedIndex == 0) { return; } this.m_sceneControl.Scene.TrackingLayer.Clear(); String trackName = this.cb_Track.SelectedItem as String; Feature3Ds features = m_layerKML.Features; Feature3D[] feature3Ds = features.FindFeature(trackName, Feature3DSearchOption.AllFeatures); if (feature3Ds.Length > 0) { Feature3D feature3D = feature3Ds[0]; GeoPlacemark geoPlacemark = feature3D.Geometry as GeoPlacemark; m_geoLine3D = geoPlacemark.Geometry as GeoLine3D; if (m_geoLine3D != null && m_geoLine3D.PartCount > 0) { if (m_nodeAnimation != null) { m_nodeAnimation.SetTrack(m_geoLine3D); m_nodeAnimation.TimePostition = 0; } this.btn_AddToKML.Enabled = false; } } }
//指定模型,并设置其节点动画属性 private void cb_Model_SelectedIndexChanged(object sender, EventArgs e) { //如果之前的模型正在运动,则停止运动 if (m_nodeAnimation != null && m_nodeAnimation.IsEnabled == true) { m_nodeAnimation.IsEnabled = false; } //获取当前模型,并设置节点动画 String featureName = this.cb_Model.SelectedItem as String; Feature3Ds features = m_layerKML.Features; Feature3D[] feature3Ds = features.FindFeature(featureName, Feature3DSearchOption.AllFeatures); if (feature3Ds.Length > 0) { Feature3D feature3D = feature3Ds[0]; GeoPlacemark geoPlacemark = feature3D.Geometry as GeoPlacemark; m_geoModel = geoPlacemark.Geometry as GeoModel; if (m_geoModel != null) { m_nodeAnimation = m_geoModel.NodeAnimation; //位置变更事件 m_nodeAnimation.TimePositionChanged -= new TimePositionChangedEventHandler(m_nodeAnimationTimePositionChanged); m_nodeAnimation.TimePositionChanged += new TimePositionChangedEventHandler(m_nodeAnimationTimePositionChanged); if (m_geoLine3D != null && m_geoLine3D.PartCount > 0) { m_nodeAnimation.SetTrack(m_geoLine3D); m_nodeAnimation.TimePostition = 0; } } } }
//保存节点动画 private void btn_AddToKML_Click(object sender, EventArgs e) { if (m_bIsSaveTrack) { Feature3Ds features = m_layerKML.Features; int nCount = this.cb_Track.Items.Count - 1; Feature3D feature3D = new Feature3D(); GeoPlacemark geoPlacemark = new GeoPlacemark(); m_style3D.LineColor = Color.Green; m_style3D.AltitudeMode = AltitudeMode.RelativeToGround; m_style3D.BottomAltitude = 0.5; m_geoLine3D.Style3D = m_style3D; geoPlacemark.Geometry = m_geoLine3D; feature3D.Geometry = geoPlacemark; feature3D.Description = "track" + nCount; feature3D.Name = feature3D.Description; features.Add(feature3D); //刷新图层树 Layer3DsTreeNodeBase node = this.m_layersControl.Layer3DsTree.FindNode(m_layerKML); this.m_layersControl.Layer3DsTree.RefreshNode(node); node.Expand(); //将新保存的运动轨迹添加的轨迹列表中 if (!this.cb_Track.Items.Contains(feature3D.Name)) { this.cb_Track.Items.Add(feature3D.Name); this.cb_Track.SelectedItem = feature3D.Name; } ////保存kml //String kmlPath = m_layerKML.DataName; //m_layerKML.Features.ToKMLFile(kmlPath); } this.m_sceneControl.Scene.TrackingLayer.Clear(); this.btn_AddToKML.Enabled = false; }
//获取KML图层下的模型和运动轨迹,初始化模型列表和轨迹列表 private void InitCombox(Layer3DKML layerKML) { Feature3Ds features = layerKML.Features; if (features.Count > 0) { for (int i = 0; i < features.Count; i++) { Feature3D feature = features[i] as Feature3D; GeoPlacemark geoplacemark = feature.Geometry as GeoPlacemark; if (geoplacemark != null) { Geometry3D geometry3D = geoplacemark.Geometry as Geometry3D; if (geometry3D is GeoModel) { this.cb_Model.Items.Add(feature.Name); } else if (geometry3D is GeoLine3D) { this.cb_Track.Items.Add(feature.Name); } } } } if (this.cb_Model.Items.Count > 0) { this.cb_Model.SelectedIndex = 0; } if (this.cb_Track.Items.Count > 1) { this.cb_Track.SelectedIndex = 1; } else { this.cb_Track.SelectedIndex = 0; } }
/// <summary> /// 由地下飞到地上 /// </summary> public void FlyUndergroud() { try { // 地下飞行时,开启地下 m_sceneControl.Scene.Underground.IsVisible = true; m_sceneControl.Scene.CameraFOV = 60; // 加载飞行路线所需的数据和风格 //为“北京地铁”设置风格 DatasetVector dataSet_ditie = m_workspace.Datasources[0].Datasets["BeijingSubway"] as DatasetVector; Layer3DSettingVector settingvetor = new Layer3DSettingVector(); settingvetor.Style.AltitudeMode = AltitudeMode.RelativeToGround; settingvetor.Style.LineWidth = 3; settingvetor.Style.LineSymbolID = 962046; settingvetor.Style.BottomAltitude = -24; Layer3DDataset layer_ditie1 = m_sceneControl.Scene.Layers.Add(dataSet_ditie, settingvetor, true, "ditie"); layer_ditie1.IsSelectable = false; // 加载 "Subway_Line8"数据集作为地铁八号线的站点 DatasetVector DataSet_ditieLine8 = m_workspace.Datasources[0].Datasets["Subway_Line8"] as DatasetVector; Layer3DSettingVector setvetor_ditieLine8 = new Layer3DSettingVector(); setvetor_ditieLine8.Style = new GeoStyle3D(); setvetor_ditieLine8.Style.AltitudeMode = AltitudeMode.RelativeToGround; setvetor_ditieLine8.Style.BottomAltitude = 10; Layer3DDataset layer_ditieLine8 = m_sceneControl.Scene.Layers.Add(DataSet_ditieLine8, setvetor_ditieLine8, true, "地铁八号线"); layer_ditieLine8.UpdateData(); // 加载"BeijingSubway_Tunnel"数据集作为地铁巷道 DatasetVector DataSet_ditieL_2 = m_workspace.Datasources[0].Datasets["BeijingSubway_Tunnel"] as DatasetVector; Layer3DSettingVector setvetor_ditieL_2 = new Layer3DSettingVector(); setvetor_ditieL_2.Style = new GeoStyle3D(); setvetor_ditieL_2.Style.AltitudeMode = AltitudeMode.RelativeToGround; setvetor_ditieL_2.Style.BottomAltitude = -26.5; setvetor_ditieL_2.Style.LineSymbolID = 962047; setvetor_ditieL_2.Style.LineWidth = 10; Layer3DDataset layer_ditieL_2 = m_sceneControl.Scene.Layers.Add(DataSet_ditieL_2, setvetor_ditieL_2, true, "地铁巷道"); layer_ditieL_2.UpdateData(); // 加载北京地铁动画模型KML文件到场景 String KMLPath = @"..\..\SampleData\Symbol3DDisplay\Model\Subway.kml"; Layer3DKML layer_kml = m_sceneControl.Scene.Layers.Add(KMLPath, Layer3DType.KML, true, "模型动画") as Layer3DKML; Feature3D geofeature = layer_kml.Features.FindFeature(1, Feature3DSearchOption.AllFeatures); GeoPlacemark geoplacemark = geofeature.Geometry as GeoPlacemark; GeoModel geomodel = geoplacemark.Geometry as GeoModel; geomodel.Animation.PlayMode = PlayMode.Once; layer_kml.UpdateData(); //导入飞行路线文件 Boolean i = flyManager.Routes.FromFile(@"..\..\SampleData\Symbol3DDisplay\flyground.fpf"); flyManager.Routes.CurrentRouteIndex = 0; flyManager.Play(); //当飞行结束后触发事件 m_sceneControl.Focus(); m_sceneControl.Scene.Refresh(); } catch (Exception ex) { MessageBox.Show(ex.Message); } }