private void LoadDynamicObjectAndLineFromFile() { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(Application.StartupPath + @"\MotionPath.xml"); wkt = xmlDoc.SelectSingleNode("root/WKT").InnerText; // 指定坐标系与xml里的相同 dynamicObject.CrsWKT = xmlDoc.SelectSingleNode("root/WKT").InnerText; point.SpatialCRS = new CRSFactory().CreateFromWKT(dynamicObject.CrsWKT) as ISpatialCRS; line.SpatialCRS = new CRSFactory().CreateFromWKT(dynamicObject.CrsWKT) as ISpatialCRS; XmlNodeList nodes = xmlDoc.SelectNodes("root/Waypoint"); int i = 0; foreach (XmlNode node in nodes) { double x = double.Parse(node.SelectSingleNode("X").InnerText); double y = double.Parse(node.SelectSingleNode("Y").InnerText); double z = double.Parse(node.SelectSingleNode("Z").InnerText); position.Set(x, y, z); point.Position = position; if (line.PointCount == 0) { line.StartPoint = point; } else { line.AddPointAfter(i - 1, point); } i++; double when = double.Parse(node.SelectSingleNode("When").InnerText); dynamicObject.AddWaypoint2(point, when); this.axRenderControl1.ObjectManager.CreateRenderPoint(point, null, rootId); } ICurveSymbol cur = new CurveSymbol(); cur.Color = System.Drawing.Color.Red; cur.Width = -2; rline = this.axRenderControl1.ObjectManager.CreateRenderPolyline(line, cur, rootId); }
/// <summary> /// 轨迹回放 /// </summary> /// <param name="traceInfo">轨迹数据</param> /// <param name="speedTimes">回放倍数</param> /// <param name="traceChanged">轨迹是否改变</param> public void RenderVehicleTrajectory(IList <Trajectory> traceInfos, int speedTimes, bool traceChanged = true) { try { if (traceChanged) { if (traceDynamicObj == null) { traceDynamicObj = _axRenderControl.ObjectManager.CreateDynamicObject(); traceDynamicObj.AutoRepeat = false; traceDynamicObj.CrsWKT = WKT; traceDynamicObj.TurnSpeed = 300; AppendGuidToStringBuilder(traceDynamicObj.Guid); symbol = new SimplePointSymbolClass() { FillColor = 0xff0000ff, Size = 10 }; #region 创建线 IPoint point = _geoFactory.CreatePoint(i3dVertexAttribute.i3dVertexAttributeZ); IPolyline line = (IPolyline)_geoFactory.CreateGeometry(i3dGeometryType.i3dGeometryPolyline, i3dVertexAttribute.i3dVertexAttributeZ); line.SpatialCRS = _spatialCRS; foreach (Trajectory trajectory in traceInfos) { IVector3 position = new Vector3(); position.Set(trajectory.LongitudeWgs84, trajectory.LatitudeWgs84, 1); point.Position = position; point.SpatialCRS = _spatialCRS; line.AppendPoint(point); traceDynamicObj.AddWaypoint2(point, Convert.ToDouble(30 * speedTimes)); var rPoint = _axRenderControl.ObjectManager.CreateRenderPoint(point, symbol); rPoint.MaxVisibleDistance = 12500; rPoint.ViewingDistance = 50; AppendGuidToStringBuilder(rPoint.Guid); //_axRenderControl.Camera.FlyToObject(rPoint.Guid, i3dActionCode.i3dActionFollowBehindAndAbove); } tracePolyline = _axRenderControl.ObjectManager.CreateRenderPolyline(line, new CurveSymbol { Color = 0xFFFFFF00, Width = -2 }); tracePolyline.VisibleMask = i3dViewportMask.i3dViewAllNormalView; tracePolyline.MaxVisibleDistance = 12500; tracePolyline.HeightStyle = i3dHeightStyle.i3dHeightAbsolute; AppendGuidToStringBuilder(tracePolyline.Guid); #endregion } } else { if (traceDynamicObj == null) { return; } traceDynamicObj.Stop(); traceDynamicObj.TurnSpeed = 300 * speedTimes; for (int i = 0; i < traceInfos.Count; i++) { traceDynamicObj.GetWaypoint2(i, out IPoint point, out double speed); traceDynamicObj.ModifyWaypoint2(i, point, 30); } } TraceObjectsPlay("111", traceDynamicObj, true); } catch (Exception ex) { LoggerHelper.Logger.Error(ex, $"执行RenderVehicleTrajectory错误"); throw ex; } }
private void btnNavigate_Click(object sender, EventArgs e) { if (tour != null) { //是否相机跟随 if (cbCameraFollow.Checked) { if (renderModelPoint != null) { this.axRenderControl1.Camera.FlyToObject(renderModelPoint.Guid, gviActionCode.gviActionFollowBehindAndAbove); } else if (skinMesh != null) { this.axRenderControl1.Camera.FlyToObject(skinMesh.Guid, gviActionCode.gviActionFollowBehindAndAbove); } } tour.Play(); return; } tour = this.axRenderControl1.ObjectManager.CreateDynamicObject(rootId); tour.CrsWKT = dataset_Road.SpatialReference.AsWKT(); tour.TurnSpeed = 100000; if (renderLine != null) { IPolyline line = renderLine.GetFdeGeometry() as IPolyline; for (int i = 0; i < line.PointCount; i++) { fdepoint = line.GetPoint(i); if (txtLocationNames.Text.Contains("I'm Here!")) { tour.AddWaypoint2(fdepoint, 30); } else { tour.AddWaypoint2(fdepoint, 100); } } } else if (multiRenderLine != null) { IMultiPolyline mline = multiRenderLine.GetFdeGeometry() as IMultiPolyline; for (int i = 0; i < mline.GeometryCount; i++) { IPolyline line = mline.GetPolyline(i); for (int j = 0; j < line.PointCount; j++) { fdepoint = line.GetPoint(j); if (txtLocationNames.Text.Contains("I'm Here!")) { tour.AddWaypoint2(fdepoint, 30); } else { tour.AddWaypoint2(fdepoint, 100); } } } } if (txtLocationNames.Text.Contains("I'm Here!")) { LoadPeople(tour); } else { LoadCar(tour); } //是否相机跟随 if (cbCameraFollow.Checked) { if (renderModelPoint != null) { this.axRenderControl1.Camera.FlyToObject(renderModelPoint.Guid, gviActionCode.gviActionFollowBehindAndAbove); } else if (skinMesh != null) { this.axRenderControl1.Camera.FlyToObject(skinMesh.Guid, gviActionCode.gviActionFollowBehindAndAbove); } } tour.Play(); }