public void WaypointsToGreatArc(IAgAircraft aircraft, List <Waypoint> waypoints, bool useTakeoffLanding) { //Set propagator to GreatArc aircraft.SetRouteType(AgEVePropagatorType.ePropagatorGreatArc); IAgVePropagatorGreatArc route = aircraft.Route as IAgVePropagatorGreatArc; route.ArcGranularity = 51.333; //Set Ref type to WayPtAltRefMSL route.SetAltitudeRefType(AgEVeAltitudeRef.eWayPtAltRefMSL); route.Method = AgEVeWayPtCompMethod.eDetermineTimeAccFromVel; route.Waypoints.RemoveAll(); if (useTakeoffLanding) { waypoints[0].Altitude = waypoints[0].SurfaceAltitude; waypoints[waypoints.Count - 1].Altitude = waypoints[waypoints.Count - 1].SurfaceAltitude; } foreach (Waypoint waypoint in waypoints) { IAgVeWaypointsElement thisWaypoint = route.Waypoints.Add(); thisWaypoint.Latitude = waypoint.Latitude; thisWaypoint.Longitude = waypoint.Longitude; thisWaypoint.Altitude = waypoint.Altitude; thisWaypoint.Speed = waypoint.Speed; thisWaypoint.TurnRadius = waypoint.TurnRadius; } route.Propagate(); }
private void AddRoute(MyWaypoint startPoint, MyWaypoint endPoint, string gvName) { List <MyWaypoint> routePoints = GetRoute(startPoint, endPoint); // create new GV and add the waypoints if (m_root.CurrentScenario.Children.Contains(AgESTKObjectType.eGroundVehicle, gvName)) { MessageBox.Show(gvName + " already exists, please pick a different name"); } else { if (routePoints != null && routePoints.Count > 0) { double turnRadius = 2.0; // meter double granularity = 1.1; // meter m_root.UnitPreferences.SetCurrentUnit("Distance", "m"); switch (speedUnitsComboBox.SelectedItem.ToString()) { case "km/h": //m_root.UnitPreferences.SetCurrentUnit("Distance", "km"); m_root.UnitPreferences.SetCurrentUnit("Time", "hr"); //turnRadius /= 1000.0; //granularity /= 1000.0; speedUnitMultiplier = 1000.0; break; case "mph": //m_root.UnitPreferences.SetCurrentUnit("Distance", "mi"); m_root.UnitPreferences.SetCurrentUnit("Time", "hr"); //turnRadius /= 1609.44; //granularity /= 1609.44; speedUnitMultiplier = 1609.44; break; case "m/s": //m_root.UnitPreferences.SetCurrentUnit("Distance", "m"); m_root.UnitPreferences.SetCurrentUnit("Time", "sec"); speedUnitMultiplier = 1.0; break; } switch (altUnitsComboBox.SelectedItem.ToString()) { case "m": altUnitMultiplier = 1.0; break; case "km": altUnitMultiplier = 1000.0; break; case "ft": altUnitMultiplier = 0.3048; break; } IAgStkObject gvObject = m_root.CurrentScenario.Children.New(AgESTKObjectType.eGroundVehicle, gvName); IAgGroundVehicle gv = gvObject as IAgGroundVehicle; gv.SetRouteType(AgEVePropagatorType.ePropagatorGreatArc); IAgVePropagatorGreatArc prop = gv.Route as IAgVePropagatorGreatArc; foreach (MyWaypoint thisPt in routePoints) { IAgVeWaypointsElement thisVeWaypoint = prop.Waypoints.Add(); thisVeWaypoint.Latitude = thisPt.Latitude; thisVeWaypoint.Longitude = thisPt.Longitude; thisVeWaypoint.Altitude = thisPt.Altitude * altUnitMultiplier; thisVeWaypoint.Speed = Convert.ToDouble(speedTextBox.Text) * speedUnitMultiplier; thisVeWaypoint.TurnRadius = turnRadius; } if (terrainCheckBox.Checked) { prop.SetAltitudeRefType(AgEVeAltitudeRef.eWayPtAltRefTerrain); IAgVeWayPtAltitudeRefTerrain altRef = prop.AltitudeRef as IAgVeWayPtAltitudeRefTerrain; altRef.Granularity = granularity; altRef.InterpMethod = AgEVeWayPtInterpMethod.eWayPtEllipsoidHeight; } prop.Propagate(); } } }
public List <Waypoint> RasterSearchWaypointGenerator( string areaTargetPath, string heading, double speed, double altitude, double turnRadius, SwathWidthType swathType, double swathParameter) { List <Waypoint> waypoints = new List <Waypoint>(); IAgStkObject areaTarget = root.GetObjectFromPath(areaTargetPath); IAgAreaTarget areaTargetObj = (IAgAreaTarget)areaTarget; bool areaTargetElActive = areaTarget.AccessConstraints.IsConstraintActive(AgEAccessConstraints.eCstrElevationAngle); double restoreAngle = 0; if (!areaTargetElActive) { IAgAccessCnstrAngle elevationMin = areaTarget.AccessConstraints.AddConstraint(AgEAccessConstraints.eCstrElevationAngle) as IAgAccessCnstrAngle; root.UnitPreferences["Angle"].SetCurrentUnit("deg"); elevationMin.Angle = 90; } else { IAgAccessCnstrAngle elevationMin = areaTarget.AccessConstraints.GetActiveConstraint(AgEAccessConstraints.eCstrElevationAngle) as IAgAccessCnstrAngle; root.UnitPreferences["Angle"].SetCurrentUnit("deg"); restoreAngle = (double)elevationMin.Angle; elevationMin.Angle = 90; } double minLat = 90; double maxLat = -90; double minLon = 180; double maxLon = -180; root.UnitPreferences["Angle"].SetCurrentUnit("deg"); switch (areaTargetObj.AreaType) { case AgEAreaType.eEllipse: IAgDataProviderGroup boundingProvider = areaTarget.DataProviders["Bounding Rectangle"] as IAgDataProviderGroup; IAgDataPrvFixed dpElements = boundingProvider.Group["Corner Points"] as IAgDataPrvFixed; IAgDrResult atDataPrvResult = dpElements.Exec(); Array atLats = atDataPrvResult.DataSets.GetDataSetByName("Geodetic-Lat").GetValues(); Array atLons = atDataPrvResult.DataSets.GetDataSetByName("Geodetic-Lon").GetValues(); foreach (object item in atLats) { if ((double)item > maxLat) { maxLat = (double)item; } if ((double)item < minLat) { minLat = (double)item; } } foreach (object item in atLons) { if ((double)item > maxLon) { maxLon = (double)item; } if ((double)item < minLon) { minLon = (double)item; } } break; case AgEAreaType.ePattern: IAgAreaTypePatternCollection boundary = areaTargetObj.AreaTypeData as IAgAreaTypePatternCollection; foreach (IAgAreaTypePattern item in boundary) { if ((double)item.Lat > maxLat) { maxLat = (double)item.Lat; } if ((double)item.Lat < minLat) { minLat = (double)item.Lat; } if ((double)item.Lon > maxLon) { maxLon = (double)item.Lon; } if ((double)item.Lon < minLon) { minLon = (double)item.Lon; } } break; default: break; } double deltaLat = maxLat - minLat; double deltaLon = maxLon - minLon; IAgExecCmdResult cmdResult; switch (heading) { case "NorthSouth": cmdResult = root.ExecuteCommand("MeasureSurfaceDistance * " + minLat + " " + minLon + " " + minLat + " " + maxLon); break; case "EastWest": cmdResult = root.ExecuteCommand("MeasureSurfaceDistance * " + minLat + " " + minLon + " " + maxLat + " " + minLon); break; default: cmdResult = root.ExecuteCommand("MeasureSurfaceDistance * " + minLat + " " + minLon + " " + maxLat + " " + minLon); break; } double regionWidth = double.Parse(cmdResult[0]); int numPasses = DetermineNumPasses(swathType, swathParameter, altitude, regionWidth, null); if (numPasses < 1) { MessageBox.Show("No Passes. Try Adjusting Swath Width Parameters"); return(waypoints); } root.BeginUpdate(); string gvName = uniqueName("gridTester", AgESTKObjectType.eGroundVehicle); IAgGroundVehicle groundVehicle = root.CurrentScenario.Children.New(AgESTKObjectType.eGroundVehicle, gvName) as IAgGroundVehicle; groundVehicle.Graphics.SetAttributesType(AgEVeGfxAttributes.eAttributesBasic); IAgVeGfxAttributesBasic gvGfx = groundVehicle.Graphics.Attributes as IAgVeGfxAttributesBasic; gvGfx.Inherit = false; gvGfx.IsVisible = false; IAgVePropagatorGreatArc route = groundVehicle.Route as IAgVePropagatorGreatArc; //route.ArcGranularity = 51.333; route.SetAltitudeRefType(AgEVeAltitudeRef.eWayPtAltRefWGS84); route.Method = AgEVeWayPtCompMethod.eDetermineTimeAccFromVel; Waypoint waypoint1 = new Waypoint(); Waypoint waypoint2 = new Waypoint(); bool headEast = true; double loopMin; double loopMax; double gridAngleStep; switch (heading) { case "NorthSouth": loopMin = minLon; loopMax = maxLon; gridAngleStep = (maxLon - minLon) / numPasses; break; case "EastWest": loopMin = minLat; loopMax = maxLat; gridAngleStep = (maxLat - minLat) / numPasses; break; default: loopMin = minLat; loopMax = maxLat; gridAngleStep = .95 * (maxLat - minLat) / numPasses; break; } for (double eval = loopMin; eval <= loopMax; eval += gridAngleStep) { route.Waypoints.RemoveAll(); IAgVeWaypointsElement thisWaypoint1; IAgVeWaypointsElement thisWaypoint2; switch (heading) { case "NorthSouth": thisWaypoint1 = route.Waypoints.Add(); thisWaypoint1.Latitude = minLat - gridAngleStep; thisWaypoint1.Longitude = eval; thisWaypoint1.Altitude = 0; thisWaypoint2 = route.Waypoints.Add(); thisWaypoint2.Latitude = maxLat + gridAngleStep; thisWaypoint2.Longitude = eval; thisWaypoint2.Altitude = 0; break; case "EastWest": default: thisWaypoint1 = route.Waypoints.Add(); thisWaypoint1.Latitude = eval; thisWaypoint1.Longitude = minLon - gridAngleStep; thisWaypoint1.Altitude = 0; thisWaypoint2 = route.Waypoints.Add(); thisWaypoint2.Latitude = eval; thisWaypoint2.Longitude = maxLon + gridAngleStep; thisWaypoint2.Altitude = 0; break; } route.Propagate(); IAgStkAccess access = areaTarget.GetAccessToObject((IAgStkObject)groundVehicle); access.ComputeAccess(); IAgDataPrvInterval dpAccess = access.DataProviders["Access Data"] as IAgDataPrvInterval; IAgScenario scen = root.CurrentScenario as IAgScenario; IAgDrResult result = dpAccess.Exec(scen.StartTime, scen.StopTime); if (result.DataSets.Count > 0) { Array startTimes = result.DataSets.GetDataSetByName("Start Time").GetValues(); Array stopTimes = result.DataSets.GetDataSetByName("Stop Time").GetValues(); string startTime = (string)startTimes.GetValue(0); string stopTime = (string)stopTimes.GetValue(stopTimes.GetLength(0) - 1); IAgDataProviderGroup dpLLA = ((IAgStkObject)groundVehicle).DataProviders["LLA State"] as IAgDataProviderGroup; IAgDataPrvTimeVar dpElements = dpLLA.Group["Fixed"] as IAgDataPrvTimeVar; IAgDrResult DataPrvResult = dpElements.ExecSingle(startTime); Array Lats = DataPrvResult.DataSets.GetDataSetByName("Lat").GetValues(); Array Lons = DataPrvResult.DataSets.GetDataSetByName("Lon").GetValues(); waypoint1 = new Waypoint(); waypoint1.Latitude = (double)Lats.GetValue(0); waypoint1.Longitude = (double)Lons.GetValue(0); waypoint1.Altitude = altitude; waypoint1.SurfaceAltitude = 0; waypoint1.Speed = speed; waypoint1.TurnRadius = turnRadius; IAgDataProviderGroup dpLLA1 = ((IAgStkObject)groundVehicle).DataProviders["LLA State"] as IAgDataProviderGroup; IAgDataPrvTimeVar dpElements1 = dpLLA1.Group["Fixed"] as IAgDataPrvTimeVar; IAgDrResult DataPrvResult1 = dpElements1.ExecSingle(stopTime); Array Lats1 = DataPrvResult1.DataSets.GetDataSetByName("Lat").GetValues(); Array Lons1 = DataPrvResult1.DataSets.GetDataSetByName("Lon").GetValues(); waypoint2 = new Waypoint(); waypoint2.Latitude = (double)Lats1.GetValue(0); waypoint2.Longitude = (double)Lons1.GetValue(0); waypoint2.Altitude = altitude; waypoint2.SurfaceAltitude = 0; waypoint2.Speed = speed; waypoint2.TurnRadius = turnRadius; if (headEast) { waypoints.Add(waypoint1); waypoints.Add(waypoint2); } else { waypoints.Add(waypoint2); waypoints.Add(waypoint1); } headEast = !headEast; } access.RemoveAccess(); } ((IAgStkObject)groundVehicle).Unload(); if (!areaTargetElActive) { areaTarget.AccessConstraints.RemoveConstraint(AgEAccessConstraints.eCstrElevationAngle); } else { IAgAccessCnstrAngle elevationMin = areaTarget.AccessConstraints.GetActiveConstraint(AgEAccessConstraints.eCstrElevationAngle) as IAgAccessCnstrAngle; root.UnitPreferences["Angle"].SetCurrentUnit("deg"); elevationMin.Angle = restoreAngle; } root.EndUpdate(); root.UnitPreferences.ResetUnits(); return(waypoints); }
// old method /* public List<MyWaypoint> CreateRoute(MyWaypoint startPoint, MyWaypoint endPoint) * { * // create route from waypointString * RouteRequest routeRequest = new RouteRequest(); * * // Set the credentials using a valid Bing Maps key * routeRequest.Credentials = new BingRouteService.Credentials(); * routeRequest.Credentials.ApplicationId = m_bingMapKey; * * // tell them that we want points along the route * routeRequest.Options = new RouteOptions(); * routeRequest.Options.RoutePathType = RoutePathType.Points; * * //Parse user data to create array of waypoints * BingRouteService.Waypoint[] waypoints = new BingRouteService.Waypoint[2]; * * BingRouteService.Waypoint point1 = new BingRouteService.Waypoint(); * BingRouteService.Location location1 = new BingRouteService.Location(); * location1.Latitude = startPoint.Latitude; * location1.Longitude = startPoint.Longitude; * point1.Location = location1; * point1.Description = "Start"; * waypoints[0] = point1; * * BingRouteService.Waypoint point2 = new BingRouteService.Waypoint(); * BingRouteService.Location location2 = new BingRouteService.Location(); * location2.Latitude = endPoint.Latitude; * location2.Longitude = endPoint.Longitude; * point2.Location = location2; * point2.Description = "End"; * waypoints[1] = point2; * * routeRequest.Waypoints = waypoints; * * // Make the calculate route request * RouteServiceClient routeService = new RouteServiceClient("BasicHttpBinding_IRouteService"); * RouteResponse routeResponse = routeService.CalculateRoute(routeRequest); * * // pull out the lat/lon values * List<MyWaypoint> returnPoints = new List<MyWaypoint>(); * if (routeResponse.Result.Legs.Length > 0) * { * //MessageBox.Show("Distance: " + routeResponse.Result.Summary.Distance.ToString() * // + " Time: " + routeResponse.Result.Summary.TimeInSeconds.ToString()); * foreach (BingRouteService.Location thisPt in routeResponse.Result.RoutePath.Points) * { * MyWaypoint thisPoint = new MyWaypoint(); * * thisPoint.Latitude = thisPt.Latitude; * thisPoint.Longitude = thisPt.Longitude; * //thisPoint.Altitude = GetAltitude(thisPoint.Latitude, thisPoint.Longitude); * thisPoint.Altitude = 0.0; * * returnPoints.Add(thisPoint); * } * } * * return returnPoints; * } */ public void PopulateGvRoute(string gvName, List <Directions.MyWaypoint> routePoints, double speedValue, string speedUnits, bool useTerrain) { //MessageBox.Show($"Populate GvRoute method called! Name is {gvName}");// FOR DEBUGGING PURPOSES double turnRadius = 15.0; // meter double granularity = 100; // meter switch (speedUnits) { case "km/h": m_root.UnitPreferences.SetCurrentUnit("Distance", "km"); m_root.UnitPreferences.SetCurrentUnit("Time", "hr"); turnRadius /= 1000.0; granularity /= 1000.0; break; case "mph": m_root.UnitPreferences.SetCurrentUnit("Distance", "mi"); m_root.UnitPreferences.SetCurrentUnit("Time", "hr"); turnRadius /= 1609.44; granularity /= 1609.44; break; case "m/s": m_root.UnitPreferences.SetCurrentUnit("Distance", "m"); m_root.UnitPreferences.SetCurrentUnit("Time", "sec"); break; } IAgStkObject gvObject = m_root.CurrentScenario.Children.New(AgESTKObjectType.eGroundVehicle, gvName); IAgGroundVehicle gv = gvObject as IAgGroundVehicle; gv.Graphics.WaypointMarker.IsWaypointMarkersVisible = false; //gv.Graphics.WaypointMarker.IsTurnMarkersVisible = false; IAgVOModel gvModel = gv.VO.Model; gvModel.ModelType = AgEModelType.eModelFile; IAgVOModelFile modelFile = gvModel.ModelData as IAgVOModelFile; if (File.Exists(installDir + @"Plugins\GreatArcPlugin\Model\mercslk.mdl")) { modelFile.Filename = installDir + @"Plugins\GreatArcPlugin\Model\mercslk.mdl"; } gv.VO.Route.InheritTrackDataFrom2D = true; gv.SetRouteType(AgEVePropagatorType.ePropagatorGreatArc); IAgVePropagatorGreatArc prop = gv.Route as IAgVePropagatorGreatArc; foreach (Directions.MyWaypoint thisPt in routePoints) { IAgVeWaypointsElement thisVeWaypoint = prop.Waypoints.Add(); thisVeWaypoint.Latitude = thisPt.Latitude; thisVeWaypoint.Longitude = thisPt.Longitude; thisVeWaypoint.Altitude = thisPt.Altitude; thisVeWaypoint.Speed = speedValue; thisVeWaypoint.TurnRadius = turnRadius; } if (useTerrain) { prop.SetAltitudeRefType(AgEVeAltitudeRef.eWayPtAltRefTerrain); IAgVeWayPtAltitudeRefTerrain altRef = prop.AltitudeRef as IAgVeWayPtAltitudeRefTerrain; altRef.Granularity = granularity; altRef.InterpMethod = AgEVeWayPtInterpMethod.eWayPtTerrainHeight; } prop.Propagate(); //MessageBox.Show("GV route propagated!");// FOR DEBUGGING PURPOSES }