/// <summary> /// Return a string in KML format containing all pre animation definitions /// that are required for the aircraft /// </summary> /// <returns></returns> public string KMLSetup() { RDToGeographic converter = new RDToGeographic(); string heatmapSetup = "<Folder>"; for (int i = 1; i < _population.Count; i++) { if (i % 1000 == 0) { Console.WriteLine(i); } double[] row = _population[i]; var point = converter.convertToLatLong(row[0], row[1]); var test = new GeoPoint3D(point.X, point.Y, 0); var upperRight = test.MoveInDirection(DotSize, 45); var lowerLeft = test.MoveInDirection(DotSize, 225); heatmapSetup += @" <GroundOverlay> <name> house" + i + @"</name> <Icon> <href>" + DotFile + @"</href> </Icon> <LatLonBox> <north>" + upperRight.Latitude + @"</north> <south>" + lowerLeft.Latitude + @"</south> <east>" + upperRight.Longitude + @"</east> <west>" + lowerLeft.Longitude + @"</west> </LatLonBox> </GroundOverlay> "; } heatmapSetup += @"</Folder>"; return(heatmapSetup); }
public void t4_GridCoordinateZTest() { Grid grid = noiseModel.TemporalGrid.GetGrid(0); GeoPoint3D point = grid.GridGeoCoordinate(1.5, 4); Assert.AreEqual(0.0, Math.Round(point.Z, 1)); }
public void t3_GridCoordinateYTest() { Grid grid = noiseModel.TemporalGrid.GetGrid(0); GeoPoint3D point = grid.GridGeoCoordinate(1.5, 4); Assert.AreEqual(4.6440, point.Longitude, 0.001); }
/// <summary> /// Return a string in KML format containing all updates /// for the aircraft at the given moment in time /// </summary> /// <returns></returns> public string KMLAnimationStep(int t) { GeoPoint3D animationPoint = _trajectory.GeoPoint(t).MoveInDirection(70, (_trajectory.Heading(t) + 210) % 360); return(@" <Location targetId='model_location'> <latitude>" + animationPoint.Latitude + @"</latitude> <longitude>" + animationPoint.Longitude + @"</longitude> <altitude>" + animationPoint.Z + @"</altitude> </Location> <Orientation targetId='model_orientation'> <heading>" + _trajectory.Heading(t) + @"</heading> <tilt>" + _trajectory.Tilt(t) + @"</tilt> <roll>" + _trajectory.BankAngle(t) + @"</roll> </Orientation> <Placemark targetId='pin'> <name>" + _aircraft.Model.ToString().Remove(_aircraft.Model.ToString().Length - 4) + @" " + Math.Round(animationPoint.Z, 3) + @"</name> </Placemark> <Point targetId='aircraftpin'> <coordinates>" + animationPoint.Longitude + @"," + animationPoint.Latitude + @"," + (animationPoint.Z + 50) + @"</coordinates> </Point> "); }
public void SetPointStyle3D(String name, Boolean enable) { Int32 index = scontrol.Scene.TrackingLayer.IndexOf(m_pointName + name); Int32 indexPoints = 0; if (index >= 0) { GeoPoint3D geoPoint3D = scontrol.Scene.TrackingLayer.Get(index) as GeoPoint3D; //跟踪图层中索引为1的是线对象 if (index > 0) { indexPoints = index - 1; } else { indexPoints = index; } if (enable) { geoPoint3D.Style3D = SelectPointGeoStyle3D(m_point3Ds[indexPoints].Z); } else { geoPoint3D.Style3D = GetPointGeoStyle3D(m_point3Ds[indexPoints].Z); } scontrol.Scene.TrackingLayer.Set(index, geoPoint3D); } }
private void UpdateTrack(string key, GeoPoint3D point) { if (geoPlotCartesian.InvokeRequired) { geoPlotCartesian.Invoke((MethodInvoker) delegate { geoPlotCartesian.UpdateTrack(key, point.Latitude, point.Longitude); geoPlotCartesian.Invalidate(); }); } else { geoPlotCartesian.UpdateTrack(key, point.Latitude, point.Longitude); geoPlotCartesian.Invalidate(); } geoPlotUpdateTimeStamp = DateTime.Now; TracksWritePoint(key, point); if (isAutosnapshot) { InvokeSaveFullSnapshot(); } }
/// <summary> /// 结束空间查询 /// </summary> private void EndSpatialQuery() { string actionStr = SmObjectLocator.getInstance().GlobeObject.Action.ToString().ToLower(); switch (actionStr) { case "createpoint": if (this.TempPoints3Ds.Count == 1) { GeoPoint3D geoPoint3D = new GeoPoint3D(TempPoints3Ds[0]); geoPoint3D.Style3D = GetGeoStyle3D(); SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.Add(geoPoint3D, spatialTag); } break; //此时划线就是为了画圆 case "createline": int index = SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.IndexOf(spatialTempTag); if (index >= 0) { SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.Remove(index); } if (this.TempPoints3Ds.Count == 2) { Point3D point3D = new Point3D(TempPoints3Ds[0].X, TempPoints3Ds[0].Y, TempPoints3Ds[0].Z); double radius = GetLengthBy2Point(TempPoints3Ds[0], TempPoints3Ds[1]); GeoCircle3D geoCircle3D = new GeoCircle3D(point3D, radius); GeoModel geoModel = geoCircle3D.GetGeoModel(72, 72); geoModel.Style3D = GetGeoStyle3D(); SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.Add(geoModel, spatialTag); } break; case "createpolygon": if (this.TempPoints3Ds.Count > 2) { GeoRegion3D geoRegion3D = new GeoRegion3D(TempPoints3Ds); geoRegion3D.Style3D = GetGeoStyle3D(); SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.Add(geoRegion3D, spatialTag); } else { int index1 = SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.IndexOf(spatialTempTag); if (index1 >= 0) { SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.Remove(index1); } } break; default: break; } Point3Ds queryPoints = TempPoints3Ds.Clone(); TempPoints3Ds.Clear(); removeListener(); if (ms != null) { ms.ExecuteQuery(spatialTag, queryPoints, actionStr); } //恢复场景光标形状 SmObjectLocator.getInstance().GlobeObject.IsCursorCustomized = false; }
/// <summary> /// Calculates the bankangle on a given timestep t /// </summary> /// <param name="t"></param> /// <returns></returns> public double BankAngle(int t) { try { if (t < 5) { return(0); } //source: http://www.regentsprep.org/regents/math/geometry/gcg6/RCir.htm GeoPoint3D point1 = GeoPoint(t - 5); GeoPoint3D point2 = GeoPoint(t); GeoPoint3D point3 = GeoPoint(t + 5); double m_r = (point2.Longitude - point1.Longitude) / (point2.Latitude - point1.Latitude); double m_t = (point3.Longitude - point2.Longitude) / (point3.Latitude - point2.Latitude); double x_c = (m_r * m_t * (point3.Longitude - point1.Longitude) + m_r * (point2.Latitude + point3.Latitude) - m_t * (point1.Latitude + point2.Latitude)) / (2 * (m_r - m_t)); double y_c = -(1 / m_r) * (x_c - ((point1.Latitude + point2.Latitude) / 2)) + ((point1.Longitude + point2.Longitude) / 2); if (double.IsInfinity(x_c)) { return(0); } GeoCoordinate c1 = new GeoCoordinate(point1.Latitude, point1.Longitude); GeoCoordinate centroid = new GeoCoordinate(x_c, y_c); double radius = c1.GetDistanceTo(centroid); double TAS = Speed(t); double g = 9.81; return(Math.Atan(((TAS * TAS) / radius) / g) * (180 / Math.PI)); } catch (Exception ex) { return(0); } }
/// <summary> /// Calculates the heading on a given timestep t /// </summary> /// <param name="t"></param> /// <returns></returns> public double Heading(double t) { GeoPoint3D point1 = GeoPoint(t); GeoPoint3D point2 = GeoPoint(t + 1); return(point1.HeadingTo(point2)); }
public void t2_GridCoordinateXTest() { Grid grid = noiseModel.TemporalGrid.GetGrid(0); GeoPoint3D point = grid.GridGeoCoordinate(1.5, 4); Assert.AreEqual(52.2689, point.Latitude, 0.001); }
public void GeoPointHeadingToTest() { GeoPoint3D point = new GeoPoint3D(1.5, 2.3, 4.5); GeoPoint3D destination = new GeoPoint3D(8.5, 4.5, 7.8); double res = point.HeadingTo(destination); Assert.AreEqual(252.523, res, 0.001); }
public void GeoPointHeadingToHighDlonTest() { GeoPoint3D point = new GeoPoint3D(1.5, 2.3, 4.5); GeoPoint3D destination = new GeoPoint3D(850, 4500, 7800); double res = point.HeadingTo(destination); Assert.AreEqual(Double.NaN, res); }
public void GeoPointMoveDirectionTest() { GeoPoint3D point = new GeoPoint3D(1.5, 2.3, 4.5); GeoPoint3D movedPoint = point.MoveInDirection(12.5, 50); GeoPoint3D destination = new GeoPoint3D(0, 100, 100); Assert.AreEqual(1.5, movedPoint.Longitude, 0.001); }
/// <summary> /// Return a string in KML format containing all pre animation definitions /// that are required for the aircraft /// </summary> /// <returns></returns> public string KMLSetup() { GeoPoint3D startingPoint = _trajectory.GeoPoint(0); return(@" <Style id=""pushpin""> <IconStyle> <scale>0</scale> </IconStyle> <LabelStyle> <color>FFFFFFFF</color> <scale>0.45</scale> </LabelStyle> </Style > <Placemark> <name>Aircraft model</name> <Model id='model'> <visibility>0</visibility> <altitudeMode>absolute</altitudeMode> <Location id='model_location'> <latitude>" + startingPoint.Latitude + @"</latitude> <longitude>" + startingPoint.Longitude + @"</longitude> <altitude>" + startingPoint.Z + @"</altitude> </Location> <Orientation id='model_orientation'> <heading>" + _trajectory.Heading(0) + @"</heading> <tilt>" + _trajectory.Tilt(0) + @"</tilt> <roll>" + _trajectory.BankAngle(0) + @"</roll> </Orientation> <Scale id='model_scale'> <x>3.5</x> <y>3.5</y> <z>3.5</z> </Scale> <Link> <href>" + _aircraft.Model + @"</href> </Link> </Model> </Placemark> <Placemark id='pin'> <name>" + _aircraft.Model.ToString().Remove(_aircraft.Model.ToString().Length - 4) + @"</name> <styleUrl>#pushpin</styleUrl> <altitudeMode>absolute</altitudeMode> <MultiGeometry> <Point id='aircraftpin'> <altitudeMode>absolute</altitudeMode> <coordinates>4.73729753494263,52.2891273498535,10.668</coordinates> </Point> <Polygon> </Polygon> </MultiGeometry> </Placemark> "); }
void m_sceneControl_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { // 鼠标左键 if (e.Button == System.Windows.Forms.MouseButtons.Left && !Double.IsNaN(scontrol.Scene.PixelToGlobe(e.Location).X)) { //RouteStop stop = new RouteStop(); //TreeNode treeNode = new TreeNode(); //m_treeView.Nodes[0].Nodes.Add(treeNode); //if (treeNode.Index > 0) //{ // treeNode.Text = GetStopName(treeNode.PrevNode.Text); // //stop.Name = GetStopName(treeNode.PrevNode.Text); //} //else //{ // treeNode.Text = "Stop1"; // //stop.Name = "Stop1"; //} //m_treeView.Nodes[0].ExpandAll(); Point3D point3D = scontrol.Scene.PixelToGlobe(e.Location); point3D.Z = scontrol.Scene.GetAltitude(point3D.X, point3D.Y) + 30; m_point3Ds.Add(point3D); //stop.Camera = new Camera(point3D.X,point3D.Y,point3D.Z); GeoPoint3D geoPoint3D = new GeoPoint3D(point3D); geoPoint3D.Style3D = GetPointGeoStyle3D(geoPoint3D.Z); geoPoint3D.Z = 0; //m_routeStops.Add(stop); scontrol.Scene.TrackingLayer.Add(geoPoint3D, m_pointName); } //鼠标右键,结束绘制,将实时生成的路线加到FlyManager中 else if (e.Button == System.Windows.Forms.MouseButtons.Right) { if (m_point3Ds.Count > 1) { SetGeoLine3DToTrackingLayer(m_point3Ds.ToPoint2Ds(), 20); m_flyManager.Routes.Add(GetRoute()); } else { ResumeDefault(); } RegisterEvents(false); } }
private void mSceneControlRemoveRangeMouseDown(object sender, MouseEventArgs e) { Point3D mPoint3D = new Point3D(); mPoint3D = mSceneControl.Scene.PixelToGlobe(e.Location, PixelToGlobeMode.TerrainAndModel); mPoint3D.Z = 0.5; DrawCirle(mPoint3D); mSceneControl.Action = Action3D.Pan2; mRemovePoint3D = new GeoPoint3D(mPoint3D); DisplayRemovePoint(); }
//获取障碍点 private void btn_GetBarrierPoint_Click(object sender, EventArgs e) { if (m_sightLine != null) { int nCount = m_sightLine.GetTargetPointCount(); for (int i = 0; i < nCount; i++) { Sightline.SightlineResult result = m_sightLine.GetSightlineResult(i); //if (!result.Visible) //{ Point3D pt3D = result.BarrierPoint; GeoPoint3D geoPoint3D = new GeoPoint3D(pt3D); m_style3D.AltitudeMode = AltitudeMode.Absolute; m_style3D.MarkerSize = 10; m_style3D.MarkerFile = @"../../SampleData/Analysis3D/BarrierPoint3D.png"; m_style3D.MarkerAnchorPoint = new Point2D(0.5, 0.5); geoPoint3D.Style3D = m_style3D; String tag = "TargetPoint" + i; int id = m_sceneControl.Scene.TrackingLayer.IndexOf(tag); if (id < 0) { m_sceneControl.Scene.TrackingLayer.Add(geoPoint3D, tag); } else { m_sceneControl.Scene.TrackingLayer.Set(id, geoPoint3D); } // Boolean isVisible = result.Visible; // TextStyle style = new TextStyle(); // style.IsSizeFixed = true; // style.FontName = "隶书"; // style.ForeColor = Color.Red; // style.FontScale = 2; // String str; // if (isVisible) // { // str = "可通视"; // } // else // { // str = "不可通视"; // } // GeoText3D text = new GeoText3D(new TextPart3D(str, m_sightLine.GetTargetPoint(i)), style); // //this.m_sceneControl.Scene.TrackingLayer.Add(text, "test" + i); ////} //} } } }
public void AddModel_Click(Point3D Point3D, int ModelIndex, string strID, string strNOID) { AddPointToDatasets(Point3D, ModelIndex, strID, strNOID); Datasource datasource = m_workspace.Datasources[0]; DatasetVector pointDataset = datasource.Datasets["Point3D"] as DatasetVector; Recordset recordset = pointDataset.GetRecordset(false, CursorType.Dynamic); GeoPoint3D geopoint3D = new GeoPoint3D(Point3D); GeoStyle3D geoStyle = new GeoStyle3D(); geoStyle.MarkerSymbolID = UserHelper.Marker3DSymbolID[ModelIndex]; geoStyle.IsMarkerSizeFixed = false; geoStyle.MarkerSize = 1; geoStyle.Marker3DScaleX = 0.03; geoStyle.Marker3DScaleY = 0.03; geoStyle.Marker3DScaleZ = 0.08; geoStyle.IsMarker3D = true; geoStyle.AltitudeMode = AltitudeMode.RelativeToGround; geopoint3D.Style3D = geoStyle; recordset.MoveLast(); recordset.AddNew(geopoint3D); recordset.SetFieldValue(m_filedName, strID); recordset.Update(); recordset.Dispose(); m_layer3DPoint.IsSelectable = false; m_layer3DPoint.UpdateData(); m_SceneControl.Scene.Refresh(); //AddKmlLayer(); //GeoPlacemark geoPlacemark = new GeoPlacemark(); //m_geoModel = new GeoModel(); //m_geoModel.FromFile(UserHelper.sModelName[ModelIndex]); ////人物模型朝向前进方向,如果原始方向一致则不需要旋转。 //m_geoModel.Style3D = m_style3D; //m_geoModel.RotationZ = 180; //m_geoModel.ScaleX = 0.3; //m_geoModel.ScaleY = 0.3; //m_geoModel.ScaleZ = 0.3; //m_geoModel.Position = new Point3D(Point3D.X, Point3D.Y, Point3D.Z); //geoPlacemark.Geometry = m_geoModel; //Feature3Ds feture3Ds = m_LayerKML.Features; //Feature3D feature = new Feature3D(); //feature.Geometry = geoPlacemark; //feature.Description = strID; //feature.Name = feature.Description; //feture3Ds.Add(feature); //feture3Ds.ToKMLFile(m_LayerKML.DataName); //m_LayerKML.UpdateData(); }
public void TrajectoryGeoPoint() { var reader = new TrajectoryFileReader(CoordinateUnit.metric); var obj = reader.createTrajectoryFromFile(Globals.testdataDirectory + "test_track.dat"); GeoPoint3D geopoint = obj.GeoPoint(2.5); Assert.IsNotNull(geopoint); Assert.AreEqual(52.287, geopoint.Latitude, 0.001); Assert.AreEqual(4.731, geopoint.Longitude, 0.001); Assert.AreEqual(101.974, geopoint.Z, 0.001); }
private void TracksWritePoint(string key, GeoPoint3D point) { if (!tracks.ContainsKey(key)) { tracks.Add(key, new List <GeoPoint3D>()); } tracks[key].Add(point); if (isTracksEmpty) { IsTracksEmpty = false; } }
/// <summary> /// 设置终止点 /// </summary> public void SetEndPoint(Point3D point3D) { try { ClearEndPoint(); mSceneControl.Scene.Refresh(); mEndPoint = new GeoPoint3D(point3D); mEndPoint.Z = 1; } catch (Exception ex) { Trace.WriteLine(ex.Message); } }
public string KMLSetup() { var cameraHeading = (_trajectory.Heading(0) - 40) % 360; GeoPoint3D aircraftLocation = _trajectory.GeoPoint(0); GeoPoint3D cameraLocation = aircraftLocation.MoveInDirection(-1600, cameraHeading); return(@" <LookAt> <latitude>" + cameraLocation.Latitude + @"</latitude> <longitude>" + cameraLocation.Longitude + @"</longitude> <altitude>" + (cameraLocation.Z + 350) + @"</altitude> <altitudeMode>absolute</altitudeMode> <heading>" + cameraHeading + @"</heading> <tilt>" + 75 + @"</tilt> </LookAt> "); }
/// <summary> /// Return a string in KML format containing all pre animation definitions /// that are required for the population annoyance /// </summary> /// <returns></returns> public string KMLSetup() { int houseId = 0; string setupString = ""; foreach (double[] row in _populationData) { houseId++; GeoPoint3D geoPoint = _temporalGrid.GetGrid(0).GridGeoCoordinate(row[0], row[1]); var coordinates = geoPoint.Longitude + "," + geoPoint.Latitude + ",0"; setupString += @" <Placemark> <Style> <IconStyle id=""house_iconstyle_" + houseId + @"""> <scale>0.9</scale> <Icon> <href>" + ImageDefault + @"</href> </Icon> </IconStyle> </Style> <Point> <coordinates>" + coordinates + @"</coordinates> </Point> </Placemark> "; } // Load ImageAnnoyed into Google Earth memory setupString += @" <Placemark> <Style> <IconStyle> <Icon> <href>" + ImageAnnoyed + @"</href> </Icon> </IconStyle> </Style> <Point> <coordinates></coordinates> </Point> </Placemark> "; return(setupString); }
public void ConvertLatLongCustom() { int referenceRdX = 155000; int referenceRdY = 463000; double referenceWgs84X = 52.15517; double referenceWgs84Y = 5.387206; x = 122202; y = 487250; var refPoint = new Point3D(referenceRdX, referenceRdY, 0, CoordinateUnit.metric); var conPoint = new Point3D(x, y, 0, CoordinateUnit.metric); double heading = refPoint.HeadingTo(conPoint); var refGeoPoint = new GeoPoint3D(referenceWgs84Y, referenceWgs84X, 0); var conGeoPoint = refGeoPoint.MoveInDirection(conPoint.DistanceTo(refPoint), heading); Assert.AreEqual(52.37214, conGeoPoint.Latitude, 0.001); Assert.AreEqual(4.905598, conGeoPoint.Longitude, 0.001); }
/// <summary> /// 鼠标单击事件来实现画点的功能 /// </summary> /// <param routestopName="sender"></param> /// <param routestopName="e"></param> private void m_sceneControl_MouseClick(object sender, MouseEventArgs e) { try { if (e.Button == MouseButtons.Left && isDraw) { //画点 if (!flag) { Datasource datasource = m_workspace.Datasources[0]; DatasetVector pointDataset = datasource.Datasets["Point3D"] as DatasetVector; Recordset recordset = pointDataset.GetRecordset(false, CursorType.Dynamic); Point3D pt3d = new Point3D(); pt3d = m_sceneControl.Scene.PixelToGlobe(e.Location, PixelToGlobeMode.TerrainAndModel); GeoPoint3D geopoint3D = new GeoPoint3D(pt3d); GeoStyle3D geoStyle = new GeoStyle3D(); geoStyle.MarkerSymbolID = m_marker3DIndex; geoStyle.IsMarkerSizeFixed = false; geoStyle.MarkerSize = 1; geoStyle.Marker3DScaleX = 1; geoStyle.Marker3DScaleY = 1; geoStyle.Marker3DScaleZ = 1; geoStyle.IsMarker3D = true; geoStyle.AltitudeMode = AltitudeMode.RelativeToGround; geopoint3D.Style3D = geoStyle; recordset.MoveLast(); recordset.AddNew(geopoint3D); recordset.Update(); recordset.Dispose(); m_layer3DPoint.IsSelectable = false; m_layer3DPoint.UpdateData(); m_sceneControl.Scene.Refresh(); } } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
private String GetContourCoordinates(Grid grid, Contour contour) { var coordinateString = ""; GeoPoint3D firstContourPoint = grid.GridGeoCoordinate(contour.Points[0].Location.X, contour.Points[0].Location.Y); GeoPoint3D contourPoint = firstContourPoint; foreach (ContourPoint p in contour.Points) { contourPoint = grid.GridGeoCoordinate(p.Location.X, p.Location.Y); coordinateString += contourPoint.Longitude + "," + contourPoint.Latitude + ","; coordinateString += "0\n"; } if (!contour.IsClosed) { coordinateString += firstContourPoint.Longitude + "," + firstContourPoint.Latitude + ","; coordinateString += "0\n"; } return(coordinateString); }
private void Initialize() { mAnalyst = new TransportationAnalyst(); mAnalystParameter = new TransportationAnalystParameter(); mStartPointTag = String.Empty; mStartPoint = new GeoPoint3D(); mEndPointTag = String.Empty; mEndPoint = new GeoPoint3D(); mStartPointTag = String.Empty; mStartPoint = new GeoPoint3D(); mGeoLineTag = String.Empty; mGeoLine = new GeoLine(); mSceneControl.Action = Action3D.Pan; mSceneControl.Scene.Refresh(); }
public string KMLAnimationStep(int t) { var cameraHeading = (_trajectory.Heading(t) - 40) % 360; GeoPoint3D aircraftLocation = _trajectory.GeoPoint(t); GeoPoint3D cameraLocation = aircraftLocation.MoveInDirection(-1600, cameraHeading); if (t == 0) { return(@" <gx:FlyTo> <gx:duration>1.0</gx:duration> <LookAt> <latitude>" + cameraLocation.Latitude + @"</latitude> <longitude>" + cameraLocation.Longitude + @"</longitude> <altitude>" + (cameraLocation.Z + 350) + @"</altitude> <altitudeMode>absolute</altitudeMode> <heading>" + cameraHeading + @"</heading> <tilt>" + 75 + @"</tilt> </LookAt> </gx:FlyTo> "); } return(@" <gx:FlyTo> <gx:duration>1.0</gx:duration> <gx:flyToMode>smooth</gx:flyToMode> <LookAt> <latitude>" + cameraLocation.Latitude + @"</latitude> <longitude>" + cameraLocation.Longitude + @"</longitude> <altitude>" + (cameraLocation.Z + 350) + @"</altitude> <altitudeMode>absolute</altitudeMode> <heading>" + cameraHeading + @"</heading> <tilt>" + 75 + @"</tilt> </LookAt> </gx:FlyTo> "); }
/// <summary> /// 显示最终量算的结果 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void TrackedHandler(object sender, Tracked3DEventArgs e) { try { // 清空临时结果 m_point3Ds.Clear(); m_curLength = 0.0; Geometry3D geometry = e.Geometry; Point3D textLocation = new Point3D(0, 0, 0); String text = String.Empty; if (SmObjectLocator.getInstance().GlobeObject.Action == Action3D.MeasureDistance || SmObjectLocator.getInstance().GlobeObject.Action == Action3D.MeasureTerrainDistance) { //绘制量算线对象 GeoLine3D geoLine3D = e.Geometry.Clone() as GeoLine3D; geoLine3D.Style3D = m_GeoStyle3D.Clone(); if (SmObjectLocator.getInstance().GlobeObject.Action == Action3D.MeasureDistance) { geoLine3D.Style3D.AltitudeMode = AltitudeMode.Absolute; geoLine3D.Style3D.BottomAltitude = 100; } else { geoLine3D.Style3D.AltitudeMode = AltitudeMode.ClampToGround; } SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.Add(geoLine3D, m_MeasureDistanceTag); //绘制量算点对象 Point3D point3D = Point3D.Empty; for (Int32 i = 0; i < geoLine3D.PartCount; i++) { for (Int32 j = 0; j < geoLine3D[i].Count; j++) { GeoPoint3D geoPoint3D = new GeoPoint3D(geoLine3D[i][j]); geoPoint3D.Style3D = m_GeoStyle3D.Clone(); if (SmObjectLocator.getInstance().GlobeObject.Action == Action3D.MeasureDistance) { geoPoint3D.Style3D.AltitudeMode = AltitudeMode.Absolute; geoPoint3D.Style3D.BottomAltitude = 100; } else if (SmObjectLocator.getInstance().GlobeObject.Action == Action3D.MeasureTerrainDistance) { geoPoint3D.Style3D.AltitudeMode = AltitudeMode.ClampToGround; } SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.Add(geoPoint3D, m_MeasureDistanceTag); point3D = geoLine3D[i][j]; } } //量算结果 int index = SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.IndexOf(m_messageTrackingTag); if (index >= 0) { SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.Remove(index); } // 添加结果文字 if (SmObjectLocator.getInstance().GlobeObject.Action == Action3D.MeasureDistance) { text = String.Format("{0}{1}{2}", "空间距离:", Math.Round(Convert.ToDecimal(e.Length), 2), "米"); } else { text = String.Format("{0}{1}{2}", "依地距离:", Math.Round(Convert.ToDecimal(e.Length), 2), "米"); } textLocation = geoLine3D[0][geoLine3D[0].Count - 1]; GeoText3D geoText = new GeoText3D(new TextPart3D(text, textLocation)); SetResultTextStyle(geoText); SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.Add(geoText, m_MeasureDistanceTag); //计算首尾点高度差 Point3Ds point3Ds = geoLine3D[0]; double height = point3Ds[point3Ds.Count - 1].Z - point3Ds[0].Z; //m_formMain.ClearOutputMessage(); //m_formMain.OutputMessage(text); //String message = string.Format("首尾点高度差为:{0}米。", height.ToString("##.00")); //m_formMain.OutputMessage(message); } else if (SmObjectLocator.getInstance().GlobeObject.Action == Action3D.MeasureArea || SmObjectLocator.getInstance().GlobeObject.Action == Action3D.MeasureTerrainArea) { //绘制量算面对象 GeoRegion3D geoRegion3D = e.Geometry as GeoRegion3D; //绘制量算面对象 geoRegion3D.Style3D = m_GeoStyle3D.Clone(); if (SmObjectLocator.getInstance().GlobeObject.Action == Action3D.MeasureArea) { geoRegion3D.Style3D.AltitudeMode = AltitudeMode.Absolute; geoRegion3D.Style3D.BottomAltitude = 100; } else { geoRegion3D.Style3D.AltitudeMode = AltitudeMode.ClampToGround; } geoRegion3D.Style3D.FillForeColor = Color.FromArgb(120, 250, 250, 50); ClearTextMessageTag(); int index = SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.IndexOf(m_messageTrackingTag); if (index >= 0) { SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.Remove(index); } SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.Add(geoRegion3D, "Measure_geoRegion3D"); //绘制量算点对象 for (Int32 i = 0; i < geoRegion3D.PartCount; i++) { for (Int32 j = 0; j < geoRegion3D[i].Count; j++) { GeoPoint3D geoPoint3D = new GeoPoint3D(geoRegion3D[i][j]); geoPoint3D.Style3D = m_GeoStyle3D.Clone(); if (SmObjectLocator.getInstance().GlobeObject.Action == Action3D.MeasureArea) { geoPoint3D.Style3D.AltitudeMode = AltitudeMode.Absolute; } else if (SmObjectLocator.getInstance().GlobeObject.Action == Action3D.MeasureTerrainArea) { geoPoint3D.Style3D.AltitudeMode = AltitudeMode.ClampToGround; } SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.Add(geoPoint3D, m_MeasureAreaTag + i.ToString() + j.ToString()); } } ClearTextMessageTag(); //量算结果 if (SmObjectLocator.getInstance().GlobeObject.Action == Action3D.MeasureArea) { m_strResult = String.Format("{0}{1}{2}", "空间面积:", Math.Round(Convert.ToDecimal(e.Area), 2), "平方米"); } else { m_strResult = String.Format("{0}{1}{2}", "依地面积:", Math.Round(Convert.ToDecimal(e.Area), 2), "平方米"); } GeoText3D text3d = GetGeoText3DMessage(); text3d[0].Text = m_strResult; text3d[0].X = geoRegion3D.InnerPoint3D.X; text3d[0].Y = geoRegion3D.InnerPoint3D.Y; text3d[0].Z = geoRegion3D.InnerPoint3D.Z; GeoText3D geoText = new GeoText3D(text3d); // 添加结果文字 SetResultTextStyle(geoText); SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.Add(geoText, m_MeasureAreaTag); //m_formMain.ClearOutputMessage(); //m_formMain.OutputMessage(m_strResult); } else if (SmObjectLocator.getInstance().GlobeObject.Action == Action3D.MeasureAltitude) { //绘制量算线对象 GeoLine3D geoLine3D = e.Geometry as GeoLine3D; geoLine3D.Style3D = m_GeoStyle3D.Clone(); geoLine3D.Style3D.AltitudeMode = AltitudeMode.Absolute; SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.Add(geoLine3D, "Measure_Altitude"); // 添加结果文字 text = String.Format("{0}{1}{2}", "高度:", Math.Round(Convert.ToDecimal(e.Height), 2), "米"); textLocation = geoLine3D[0][geoLine3D[0].Count - 1]; GeoText3D geoText = new GeoText3D(new TextPart3D(text, textLocation)); SetResultTextStyle(geoText); SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.Add(geoText, "Measure_Altitude"); //输出首尾点高度 Point3Ds point3Ds = geoLine3D[0]; double startHeight = point3Ds[0].Z; double endHeight = point3Ds[1].Z; string message = string.Format("首点高度为:{0}米。", startHeight.ToString("##.00")); //m_formMain.ClearOutputMessage(); //m_formMain.OutputMessage(message); //message = string.Format("尾点高度为:{0}米。", endHeight.ToString("##.00")); //m_formMain.OutputMessage(message); //绘制量算点对象 for (Int32 i = 0; i < geoLine3D.PartCount; i++) { for (Int32 j = 0; j < geoLine3D[i].Count; j++) { GeoPoint3D geoPoint3D = new GeoPoint3D(geoLine3D[i][j]); geoPoint3D.Style3D = m_GeoStyle3D.Clone(); geoPoint3D.Style3D.AltitudeMode = AltitudeMode.Absolute; SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.Add(geoPoint3D, m_MeasureAltitudeTag + j.ToString()); } } ClearTextMessageTag(); if (!(Toolkit.IsZero(m_curAltitude))) { EndOneMeasure(); } } else if (SmObjectLocator.getInstance().GlobeObject.Action == Action3D.MeasureHorizontalDistance) { // 结果线 GeoLine3D resLine3D = e.Geometry as GeoLine3D; resLine3D.Style3D = m_GeoStyle3D.Clone(); resLine3D.Style3D.AltitudeMode = AltitudeMode.Absolute; // 结果点 Point3Ds resPoints = resLine3D[0]; for (Int32 i = 0; i < resPoints.Count; i++) { GeoPoint3D geoPoint = new GeoPoint3D(resPoints[i]); SetGeometry3DStyle(geoPoint); SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.Add(geoPoint, "Measure_Geometry" + i.ToString()); } EndOneMeasure(); SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.Add(resLine3D, "Measure_Geometry"); // 添加结果文字 text = String.Format("{0}{1}{2}", "总长度: ", Math.Round(Convert.ToDecimal(e.Length), 2), "米"); GeoLine3D line = (geometry as GeoLine3D); textLocation = line[0][line[0].Count - 2]; //ClearTextMessageTag(); int index = SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.IndexOf(m_messageTrackingTag); if (index >= 0) { SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.Remove(index); } GeoText3D geoText = new GeoText3D(new TextPart3D(text, textLocation)); SetResultTextStyle(geoText); SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.Add(geoText, "MeasureResult"); //m_formMain.ClearOutputMessage(); //m_formMain.OutputMessage(text); //计算首尾点高度差 Point3Ds point3Ds = resLine3D[0]; double height = point3Ds[point3Ds.Count - 1].Z - point3Ds[0].Z; string message = string.Format("首尾点高度差为:{0}米。", height.ToString("##.00")); //m_formMain.OutputMessage(message); } } catch (Exception ex) { Trace.WriteLine(ex.Message); } finally { m_label.Visible = false; } }
public CustomMapKMLAnimator(string mapFile, GeoPoint3D bottomLeft, GeoPoint3D upperRight) { _mapFile = mapFile; _bottomLeft = bottomLeft; _upperRight = upperRight; }
//绘制线触发的事件 private void m_sceneControl_Tracked(object sender, Tracked3DEventArgs e) { Recordset recordset; Double lineWidth = 0.0; Double bottomheight = 0; try { if (flag) { if (!isRegion) { GeoLine3D geoLine3D = e.Geometry as GeoLine3D; GeoStyle3D geoStyle = new GeoStyle3D(); geoStyle.LineSymbolID = m_line3DIndex; geoStyle.LineWidth = lineWidth; geoStyle.AltitudeMode = AltitudeMode.RelativeToGround; geoStyle.BottomAltitude = bottomheight; geoLine3D.Style3D = geoStyle; recordset = m_datasetLine3D.GetRecordset(false, CursorType.Dynamic); recordset.AddNew(geoLine3D); recordset.Update(); recordset.Dispose(); m_layer3DLine.UpdateData(); m_sceneControl.Scene.Refresh(); } else { if (ispointRegion) { GeoRegion3D geoRegion3D = e.Geometry as GeoRegion3D; if (geoRegion3D.PartCount > 0) { Rectangle2D rect = geoRegion3D.Bounds; Datasource datasource = m_workspace.Datasources[0]; DatasetVector pointDataset = datasource.Datasets["Point3D"] as DatasetVector; for (double y = geoRegion3D.Bounds.Bottom; y < geoRegion3D.Bounds.Top;) { for (double x = geoRegion3D.Bounds.Left; x < geoRegion3D.Bounds.Right;) { recordset = pointDataset.GetRecordset(false, CursorType.Dynamic); Point3D pt3d = new Point3D(); pt3d.X = x; pt3d.Y = y; pt3d.Z = 0; GeoPoint3D geopoint3D = new GeoPoint3D(pt3d); GeoStyle3D geoStyle = new GeoStyle3D(); geoStyle.MarkerSymbolID = m_marker3DIndex; geoStyle.IsMarkerSizeFixed = false; geoStyle.MarkerSize = 1; geoStyle.Marker3DScaleX = 1; geoStyle.Marker3DScaleY = 1; geoStyle.Marker3DScaleZ = 1; geoStyle.IsMarker3D = true; geoStyle.AltitudeMode = AltitudeMode.RelativeToGround; geopoint3D.Style3D = geoStyle; recordset.MoveLast(); recordset.AddNew(geopoint3D); recordset.Update(); recordset.Dispose(); m_layer3DPoint.IsSelectable = false; m_layer3DPoint.UpdateData(); m_sceneControl.Scene.Refresh(); x += 0.0002; } y += 0.0002; } } } else { Datasource datasource = m_workspace.Datasources[0]; DatasetVector Region3DDataset = datasource.Datasets["Region3D"] as DatasetVector; recordset = Region3DDataset.GetRecordset(false, CursorType.Dynamic); GeoRegion3D geoRegion = e.Geometry as GeoRegion3D; GeoStyle3D geoStyle = new GeoStyle3D(); geoStyle.FillSymbolID = m_region3DIndex; geoStyle.AltitudeMode = AltitudeMode.RelativeToGround; geoStyle.BottomAltitude = 0.5; geoRegion.Style3D = geoStyle; recordset.AddNew(geoRegion); recordset.Update(); recordset.Dispose(); (m_layer3DRegion.AdditionalSetting as Layer3DSettingVector).Style = geoStyle; m_layer3DRegion.UpdateData(); m_sceneControl.Scene.Refresh(); } } } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
public VLBLTDOAMeasurement(double lat, double lon, double dpt, double toaS, GeoPoint3D refPoint) : base(lat, lon, dpt, toaS) { UpdateRefPoint(refPoint); }
/// <summary> /// 高亮显示要素并显示要素详情 /// </summary> /// <param name="p"></param> /// <param name="fid"></param> private void HighLightFeature(GeoPoint3D p, int fid) { if (p != null) { string tag = SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.GetTag(fid); if (this.lastGPot == null) { this.lastGPot = p; this.lastTag = tag; this.lastIndex = fid; } else if (p != this.lastGPot) { this.lastGPot.Style3D = normalStyle; SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.Set(this.lastIndex, this.lastGPot); SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.SetTag(this.lastIndex, this.lastTag); } p.Style3D = highLightStyle; SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.Set(fid, p); SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.SetTag(fid, tag); this.lastGPot = p; this.lastTag = tag; this.lastIndex = fid; //显示要素详情 ShowMarkDetailInfo(tag); //显示要素多媒体信息 LoadFeatureMedias(tag, "IMAGE"); LoadFeatureMedias(tag, "VIDEO"); } }
/// <summary> /// 在地图上初始化显示查询结果列表 /// </summary> private void InitQueryListOnMap() { //清空追踪图层数据 this.measureUtil.ClearAllResult(QUERY); ObservableCollection<QueryRecordVO> recordList = SysModelLocator.getInstance().recordList; if (recordList.Count > 0) { double centerX = 0.0; double centerY = 0.0; double heightZ = defaultHeight; double minX = 0; double minY = 0; double maxX = 0; double maxY = 0; for (int i = 0; i < recordList.Count; i++) { QueryRecordVO vo = vo = recordList[i]; if (Double.TryParse(vo.RecordCenterX, out centerX) == true && Double.TryParse(vo.RecordCenterY, out centerY) == true) { GeoPoint3D gpt = new GeoPoint3D(centerX, centerY, heightZ); gpt.Style3D = normalStyle; SmObjectLocator.getInstance().GlobeObject.Scene.TrackingLayer.Add(gpt, string.Format("{0}#{1}#{2}", vo.RecordName, vo.RecordIndex, QUERY)); if (minX == 0) { minX = centerX; minY = centerY; maxX = centerX; maxY = centerY; } else { minX = Math.Min(minX, centerX); minY = Math.Min(minY, centerY); maxX = Math.Max(maxX, centerX); maxY = Math.Max(maxY, centerY); } } } Rectangle2D rect2D = new Rectangle2D(minX - 0.05, minY - 0.05, maxX + 0.05, maxY + 0.05); SmObjectLocator.getInstance().GlobeObject.Scene.EnsureVisible(rect2D, 500); } }
/// <summary> /// 初始化要素图标样式 /// </summary> private void InitGeoPoint3DParams(bool isReset = false) { if (isReset) { this.lastGPot = null; this.lastTag = ""; this.lastIndex = -1; } else { GeoStyle3D sty3D = new GeoStyle3D(); sty3D.MarkerFile = "Images/point.png"; sty3D.MarkerScale = defaultScale; sty3D.MarkerSize = 32; sty3D.AltitudeMode = AltitudeMode.ClampToGround; normalStyle = sty3D; GeoStyle3D sty3DHigh = new GeoStyle3D(); sty3DHigh.MarkerFile = "Images/bluepot.png"; sty3DHigh.MarkerScale = defaultScale * 1.5; sty3DHigh.MarkerSize = 32; sty3DHigh.AltitudeMode = AltitudeMode.ClampToGround; highLightStyle = sty3DHigh; } }