private void _SetFlightMapData() { //Create Flight Map Data records _FlightMapData = new FlightMapData { FlightID = _FlightID, BBFlightID = _BBFlightID.ToString(), CreatedTime = DateTime.UtcNow, DroneId = _DroneID, ReadTime = _ReadTime, ReceivedTime = _DroneData.CreatedTime, Distance = 0, PointDistance = 0, IsChecked = true, IsSoftFence = 0, IsOutSide = true, //Initilize these values, but calculate at end of flight only Min_Altitude = 0, Max_Altitude = 0, avg_Altitude = 0, Min_Satellites = 0, Max_Satellites = 0, Avg_Satellites = 0, Min_Speed = 0, Max_Speed = 0, Avg_Speed = 0, //Unused, Just initilize DroneRFID = String.Empty, GCAID = 0, IsActive = true, IsAdsbProcessed = false, OtherFlightIDs = String.Empty, ProductId = 0, ProductQrCode = String.Empty, ProductRFID = String.Empty, ProductRSSI = String.Empty, RecordType = 0, //Parse it from Drone Data Altitude = ToDecimal(_DroneData.Altitude, 100m, true), FixQuality = ToDecimal(_DroneData.FixQuality), Heading = Math.Abs(ToDecimal(_DroneData.Heading, 100m)), Latitude = ToDecimal(_DroneData.Latitude, 1000000m), Longitude = ToDecimal(_DroneData.Longitude, 1000000m), Roll = ToDecimal(_DroneData.Roll, 100m), Pitch = ToDecimal(_DroneData.Pitch, 100m), Satellites = ToInt32(_DroneData.Satellites), Speed = Math.Abs(ToDecimal(_DroneData.Speed, 100m, true)), voltage = ToDecimal(_DroneData.Voltage, 100m), TotalFlightTime = 0 }; /* * if (_FlightMapData.Altitude < _MinFieldValue) * _FlightMapData.Altitude = 0; * if (_FlightMapData.Speed < _MinFieldValue) * _FlightMapData.Speed = 0; */ }
public ActionResult Info(int ID, Int64 lastdataid = 0) { var flightmapdatas = db.FlightMapDatas.Where(x => x.FlightID == ID && (x.Altitude > 0 || x.Speed > 0) && x.FlightMapDataID > lastdataid).OrderBy(x => x.FlightMapDataID).ToList(); int count = flightmapdatas.Count(); MemoryStream ms = new MemoryStream(); var outputStream = new StreamWriter(ms); var cesiumWriter = new CesiumStreamWriter(); var output = new CesiumOutputStream(outputStream) { // Since this is a demo, turning on PrettyFormatting makes the response easier to view // with web browser developer tools. It just adds whitespace and newlines to the response, // so production environments would typically leave this turned off. PrettyFormatting = true }; if (count > 0) { // The whole body of CZML must be wrapped in a JSON array, opened here. output.WriteStartSequence(); FlightMapData firstItem = db.FlightMapDatas.Where(x => x.FlightID == ID && (x.Altitude > 0 || x.Speed > 0)).OrderBy(x => x.FlightMapDataID).ToList().Take(1).FirstOrDefault(); FlightMapData LastItem = db.FlightMapDatas.Where(x => x.FlightID == ID && (x.Altitude > 0 || x.Speed > 0)).OrderBy(x => x.FlightMapDataID).ToList().LastOrDefault(); JulianDate StartTime = new JulianDate(firstItem.ReadTime.Value); JulianDate EndTime = new JulianDate(LastItem.ReadTime.Value); string curFile = @"C:\Cesium\test.czml"; FileInfo info = new FileInfo(curFile); List <Cartographic> pList = new List <Cartographic>(); List <JulianDate> JList = new List <JulianDate>(); List <Double> HList = new List <Double>(); List <Double> PList = new List <Double>(); List <Double> RList = new List <Double>(); // The first packet (JSON object) of CZML must be the document packet. using (var entity = cesiumWriter.OpenPacket(output)) { entity.WriteId("document"); entity.WriteVersion("1.0"); using (var clock = entity.OpenClockProperty()) { clock.WriteInterval(new TimeInterval(StartTime, EndTime)); if (lastdataid == 0) { clock.WriteCurrentTime(StartTime); } else { clock.WriteCurrentTime(EndTime); } clock.WriteMultiplier(2); clock.WriteStep(ClockStep.SystemClockMultiplier); } //} } // Open a new CZML packet for each point. using (var entity = cesiumWriter.OpenPacket(output)) { entity.WriteId("Aircraft"); entity.WriteVersion("1.0"); entity.WriteAvailability(new TimeInterval(StartTime, EndTime)); using (var path = entity.OpenPathProperty()) { using (var show = path.OpenShowProperty()) { //if(lastdataid==0) // show.WriteInterval(new TimeInterval(StartTime, EndTime)); show.WriteBoolean(true); } path.WriteWidthProperty(2); using (var material = path.OpenMaterialProperty()) { using (var sol = material.OpenSolidColorProperty()) { sol.WriteColorProperty(0, 255, 255, 255); } } path.WriteResolutionProperty(1200); } using (var position = entity.OpenPositionProperty()) { foreach (FlightMapData fmp in flightmapdatas) { double lat = Convert.ToDouble(fmp.Latitude); double lon = Convert.ToDouble(fmp.Longitude); double alt = Convert.ToDouble(fmp.Altitude); Cartographic nC = new Cartographic(lon, lat, alt); pList.Add(nC); JulianDate jd = new JulianDate(fmp.ReadTime.Value); JList.Add(jd); var heading = Convert.ToDouble(fmp.Heading); HList.Add(heading); var pitch = Convert.ToDouble(fmp.Pitch); PList.Add(pitch); var roll = Convert.ToDouble(fmp.Roll); RList.Add(roll); } position.WriteCartographicDegrees(JList, pList); } } // Now we generate some sample points and send them down. // Close the JSON array that wraps the entire CZML document. using (var entity = cesiumWriter.OpenPacket(output)) { entity.WriteId("Custom"); entity.WriteVersion("1.0"); entity.WriteAvailability(new TimeInterval(StartTime, EndTime)); var custom = entity.OpenPropertiesProperty(); CustomPropertyCesiumWriter newpro = custom.OpenCustomPropertyProperty("heading"); newpro.AsNumber(); newpro.WriteNumber(JList, HList); newpro.Close(); CustomPropertyCesiumWriter newroll = custom.OpenCustomPropertyProperty("roll"); newroll.AsNumber(); newroll.WriteNumber(JList, RList); newroll.Close(); CustomPropertyCesiumWriter newpitch = custom.OpenCustomPropertyProperty("pitch"); // newpitch.Open(output); newpitch.AsNumber(); newpitch.WriteNumber(JList, PList); newpitch.Close(); CustomPropertyCesiumWriter LastDataID = custom.OpenCustomPropertyProperty("lastdataid"); LastDataID.AsNumber(); LastDataID.WriteNumber(LastItem.FlightMapDataID); LastDataID.Close(); custom.Close(); } output.WriteEndSequence(); //ms.Position = 0; //ms.Seek(0, SeekOrigin.Begin); outputStream.Flush(); // } } ms.Seek(0, SeekOrigin.Begin); return(File(ms, "application/json")); }
public bool ProcessDroneData() { GPSPoint ThisPosition = new GPSPoint((float)_FlightMapData.Latitude, (float)_FlightMapData.Longitude); LastUpdatedOn = DateTime.Now; if (_LastFlightMapData != null) { //Fix sudden change in heading Double ChangeInHeading = (Double)_LastFlightMapData.Heading - (Double)_FlightMapData.Heading; if (ChangeInHeading > 20 || ChangeInHeading < -20) { if (_LastFlightMapData.Heading > 340 && _FlightMapData.Heading < 10) { //then we leave it to rotate } else { _FlightMapData.Heading = _LastFlightMapData.Heading + (ChangeInHeading > 0 ? 1 : -1) * 20; if (_FlightMapData.Heading > 360) { _FlightMapData.Heading = _FlightMapData.Heading - 360; } if (_FlightMapData.Heading < 0) { _FlightMapData.Heading = -1 * _FlightMapData.Heading; } } } if (_FlightMapData.Altitude >= _MinFieldValue || _FlightMapData.Speed >= _MinFieldValue) { DateTime StartTime = (DateTime)(_LastFlightMapData.ReadTime); DateTime EndTime = (DateTime)(_FlightMapData.ReadTime); _TotalFlightTime += (Decimal)Math.Abs(EndTime.Subtract(StartTime).TotalSeconds); //Distance between Last point and this point GPSPoint LastLocation = new GPSPoint((float)_LastFlightMapData.Latitude, (float)_LastFlightMapData.Longitude); _FlightMapData.PointDistance = (Decimal)GPSCalc.GetDistance(ThisPosition, LastLocation); _TotalDistance += (Decimal)_FlightMapData.PointDistance; } } SatelliteSummary.AddTo((Double)_FlightMapData.Satellites); SpeedSummary.AddTo((Double)_FlightMapData.Speed); AltitudeSummary.AddTo((Double)_FlightMapData.Altitude); _FlightMapData.TotalFlightTime = _TotalFlightTime; _FlightMapData.Distance = _TotalDistance; _FlightMapData.avg_Altitude = (Decimal)AltitudeSummary.Avg; _FlightMapData.Max_Altitude = (Decimal)AltitudeSummary.Max; _FlightMapData.Min_Altitude = (Decimal)AltitudeSummary.Min; _FlightMapData.Avg_Satellites = (Decimal)SatelliteSummary.Avg; _FlightMapData.Max_Satellites = (Decimal)SatelliteSummary.Max; _FlightMapData.Min_Satellites = (Decimal)SatelliteSummary.Min; _FlightMapData.Avg_Speed = (Decimal)SpeedSummary.Avg; _FlightMapData.Max_Speed = (Decimal)SpeedSummary.Max; _FlightMapData.Min_Speed = (Decimal)SpeedSummary.Min; _DroneFlight.Longitude = _FlightMapData.Longitude; _DroneFlight.Latitude = _FlightMapData.Latitude; _ExtDroneFlight.Altitude = (Double)_FlightMapData.Altitude; _ExtDroneFlight.LastFlightDate = _ReadTime; //Save the last point for the reference _LastFlightMapData = Cloner <FlightMapData> .Clone(_FlightMapData); return(true); }