private string DeliverPropagationPath(string paramstr) { string json = ""; // set default values string mycallstr = ""; string mylocstr = ""; string dxcallstr = ""; string dxlocstr = ""; string bandstr = ""; BAND band = Properties.Settings.Default.Band; // get parameters try { if (paramstr.Contains("?")) { // OK, we have parameters --> cut them out and make all uppercase paramstr = paramstr.Substring(paramstr.IndexOf("?") + 1).ToUpper(); var pars = System.Web.HttpUtility.ParseQueryString(paramstr); mycallstr = pars.Get("MYCALL"); mylocstr = pars.Get("MYLOC"); dxcallstr = pars.Get("DXCALL"); dxlocstr = pars.Get("DXLOC"); bandstr = pars.Get("BAND"); } } catch (Exception ex) { // return error return("Error while parsing parameters!"); } // check parameters if (!Callsign.Check(mycallstr)) { return("Error: " + mycallstr + " is not a valid callsign!"); } if (!Callsign.Check(dxcallstr)) { return("Error: " + dxcallstr + " is not a valid callsign!"); } if (!String.IsNullOrEmpty(mylocstr) && !MaidenheadLocator.Check(mylocstr)) { return("Error: " + mylocstr + " is not a valid Maidenhead locator!"); } if (!String.IsNullOrEmpty(dxlocstr) && !MaidenheadLocator.Check(dxlocstr)) { return("Error: " + dxlocstr + " is not a valid Maidenhead locator!"); } // set band to currently selected if empty if (string.IsNullOrEmpty(bandstr)) { band = Properties.Settings.Default.Band; } else { band = Bands.ParseStringValue(bandstr); } if (band == BAND.BNONE) { return("Error: " + bandstr + " is not a valid band value!"); } // search call in station database, return empty string if not found LocationDesignator myloc = LocationFind(mycallstr, mylocstr); if (myloc == null) { return("Error: MyLocation not found in database!"); } LocationDesignator dxloc = LocationFind(dxcallstr, dxlocstr); if (dxloc == null) { return("Error: DXLocation not found in database!"); } // get qrv info or create default QRVDesignator myqrv = StationData.Database.QRVFindOrCreateDefault(myloc.Call, myloc.Loc, band); // set qrv defaults if zero if (myqrv.AntennaHeight == 0) { myqrv.AntennaHeight = StationData.Database.QRVGetDefaultAntennaHeight(band); } if (myqrv.AntennaGain == 0) { myqrv.AntennaGain = StationData.Database.QRVGetDefaultAntennaGain(band); } if (myqrv.Power == 0) { myqrv.Power = StationData.Database.QRVGetDefaultPower(band); } // get qrv info or create default QRVDesignator dxqrv = StationData.Database.QRVFindOrCreateDefault(dxloc.Call, dxloc.Loc, band); // set qrv defaults if zero if (dxqrv.AntennaHeight == 0) { dxqrv.AntennaHeight = StationData.Database.QRVGetDefaultAntennaHeight(band); } if (dxqrv.AntennaGain == 0) { dxqrv.AntennaGain = StationData.Database.QRVGetDefaultAntennaGain(band); } if (dxqrv.Power == 0) { dxqrv.Power = StationData.Database.QRVGetDefaultPower(band); } // find local obstruction, if any LocalObstructionDesignator o = ElevationData.Database.LocalObstructionFind(myloc.Lat, myloc.Lon, Properties.Settings.Default.ElevationModel); double mybearing = LatLon.Bearing(myloc.Lat, myloc.Lon, dxloc.Lat, dxloc.Lon); double myobstr = (o != null) ? o.GetObstruction(myqrv.AntennaHeight, mybearing) : double.MinValue; // get or calculate propagation path PropagationPathDesignator ppath = PropagationData.Database.PropagationPathFindOrCreateFromLatLon( this, myloc.Lat, myloc.Lon, GetElevation(myloc.Lat, myloc.Lon) + myqrv.AntennaHeight, dxloc.Lat, dxloc.Lon, GetElevation(dxloc.Lat, dxloc.Lon) + dxqrv.AntennaHeight, Bands.ToGHz(band), LatLon.Earth.Radius * Properties.Settings.Default.Path_Band_Settings[band].K_Factor, Properties.Settings.Default.Path_Band_Settings[band].F1_Clearance, ElevationData.Database.GetDefaultStepWidth(Properties.Settings.Default.ElevationModel), Properties.Settings.Default.ElevationModel, myobstr); if (ppath == null) { return(json); } // add additional info to ppath ppath.Location1 = myloc; ppath.Location2 = dxloc; ppath.QRV1 = myqrv; ppath.QRV2 = dxqrv; // convert path to json json = ppath.ToJSON(); return(json); }
private string DeliverNearestPlanes(string paramstr, List <PlaneInfo> allplanes) { string json = ""; // set default values string mycallstr = ""; string mylocstr = ""; string dxcallstr = ""; string dxlocstr = ""; string bandstr = ""; BAND band = Properties.Settings.Default.Band; // get parameters try { if (paramstr.Contains("?")) { // OK, we have parameters --> cut them out and make all uppercase paramstr = paramstr.Substring(paramstr.IndexOf("?") + 1).ToUpper(); var pars = System.Web.HttpUtility.ParseQueryString(paramstr); mycallstr = pars.Get("MYCALL"); mylocstr = pars.Get("MYLOC"); dxcallstr = pars.Get("DXCALL"); dxlocstr = pars.Get("DXLOC"); bandstr = pars.Get("BAND"); } } catch (Exception ex) { // return error return("Error while parsing parameters!"); } // check parameters if (!Callsign.Check(mycallstr)) { return("Error: " + mycallstr + " is not a valid callsign!"); } if (!Callsign.Check(dxcallstr)) { return("Error: " + dxcallstr + " is not a valid callsign!"); } if (!String.IsNullOrEmpty(mylocstr) && !MaidenheadLocator.Check(mylocstr)) { return("Error: " + mylocstr + " is not a valid Maidenhead locator!"); } if (!String.IsNullOrEmpty(dxlocstr) && !MaidenheadLocator.Check(dxlocstr)) { return("Error: " + dxlocstr + " is not a valid Maidenhead locator!"); } // set band to currently selected if empty if (string.IsNullOrEmpty(bandstr)) { band = Properties.Settings.Default.Band; } else { band = Bands.ParseStringValue(bandstr); } if (band == BAND.BNONE) { return("Error: " + bandstr + " is not a valid band value!"); } // search call in station database, return empty string if not found LocationDesignator myloc = LocationFind(mycallstr, mylocstr); if (myloc == null) { return("Error: MyLocation not found in database!"); } LocationDesignator dxloc = LocationFind(dxcallstr, dxlocstr); if (dxloc == null) { return("Error: DXLocation not found in database!"); } // get qrv info or create default QRVDesignator myqrv = StationData.Database.QRVFindOrCreateDefault(myloc.Call, myloc.Loc, band); // set qrv defaults if zero if (myqrv.AntennaHeight == 0) { myqrv.AntennaHeight = StationData.Database.QRVGetDefaultAntennaHeight(band); } if (myqrv.AntennaGain == 0) { myqrv.AntennaGain = StationData.Database.QRVGetDefaultAntennaGain(band); } if (myqrv.Power == 0) { myqrv.Power = StationData.Database.QRVGetDefaultPower(band); } // get qrv info or create default QRVDesignator dxqrv = StationData.Database.QRVFindOrCreateDefault(dxloc.Call, dxloc.Loc, band); // set qrv defaults if zero if (dxqrv.AntennaHeight == 0) { dxqrv.AntennaHeight = StationData.Database.QRVGetDefaultAntennaHeight(band); } if (dxqrv.AntennaGain == 0) { dxqrv.AntennaGain = StationData.Database.QRVGetDefaultAntennaGain(band); } if (dxqrv.Power == 0) { dxqrv.Power = StationData.Database.QRVGetDefaultPower(band); } // find local obstruction, if any LocalObstructionDesignator o = ElevationData.Database.LocalObstructionFind(myloc.Lat, myloc.Lon, Properties.Settings.Default.ElevationModel); double mybearing = LatLon.Bearing(myloc.Lat, myloc.Lon, dxloc.Lat, dxloc.Lon); double myobstr = (o != null) ? o.GetObstruction(myqrv.AntennaHeight, mybearing) : double.MinValue; // get or calculate propagation path PropagationPathDesignator ppath = PropagationData.Database.PropagationPathFindOrCreateFromLatLon( this, myloc.Lat, myloc.Lon, GetElevation(myloc.Lat, myloc.Lon) + myqrv.AntennaHeight, dxloc.Lat, dxloc.Lon, GetElevation(dxloc.Lat, dxloc.Lon) + dxqrv.AntennaHeight, Bands.ToGHz(band), LatLon.Earth.Radius * Properties.Settings.Default.Path_Band_Settings[band].K_Factor, Properties.Settings.Default.Path_Band_Settings[band].F1_Clearance, ElevationData.Database.GetDefaultStepWidth(Properties.Settings.Default.ElevationModel), Properties.Settings.Default.ElevationModel, myobstr); if (ppath == null) { return(json); } // add additional info to ppath ppath.Location1 = myloc; ppath.Location2 = dxloc; ppath.QRV1 = myqrv; ppath.QRV2 = dxqrv; /* * // estimate positions according to time * DateTime time = DateTime.UtcNow; * foreach(PlaneInfo plane in allplanes.Planes) * { * // change speed to km/h * double speed = plane.Speed_kmh; * // calculate distance after timespan * double dist = speed * (time - allplanes.At).TotalHours; * LatLon.GPoint newpos = LatLon.DestinationPoint(plane.Lat, plane.Lon, plane.Track, dist); * plane.Lat = newpos.Lat; * plane.Lon = newpos.Lon; * plane.Time = time; * } */ // get nearest planes List <PlaneInfo> nearestplanes = AircraftData.Database.GetNearestPlanes(DateTime.UtcNow, ppath, allplanes, Properties.Settings.Default.Planes_Filter_Max_Circumcircle, Properties.Settings.Default.Path_Band_Settings[band].MaxDistance, Properties.Settings.Default.Planes_MaxAlt); // convert nearestplanes to json JsonSerializerSettings settings = new JsonSerializerSettings(); settings.DateTimeZoneHandling = DateTimeZoneHandling.Utc; settings.FloatFormatHandling = FloatFormatHandling.String; settings.Formatting = Newtonsoft.Json.Formatting.Indented; json = JsonConvert.SerializeObject(nearestplanes, settings); return(json); }
private void bw_History_DoWork(object sender, DoWorkEventArgs e) { // check that Stepwidth ist positive in any case if (Properties.Settings.Default.Path_History_StepWidth <= 0) { Properties.Settings.Default.Path_History_StepWidth = 1; } bw_History.ReportProgress(0, "Calculating Path...."); LocationDesignator mycall = StationData.Database.LocationFindOrCreate(Properties.Settings.Default.MyCall, MaidenheadLocator.LocFromLatLon(Properties.Settings.Default.MyLat, Properties.Settings.Default.MyLon, false, 3)); QRVDesignator myqrv = StationData.Database.QRVFindOrCreateDefault(mycall.Call, mycall.Loc, Properties.Settings.Default.Band); // set qrv defaults if zero if (myqrv.AntennaHeight == 0) { myqrv.AntennaHeight = StationData.Database.QRVGetDefaultAntennaHeight(Properties.Settings.Default.Band); } if (myqrv.AntennaGain == 0) { myqrv.AntennaGain = StationData.Database.QRVGetDefaultAntennaGain(Properties.Settings.Default.Band); } if (myqrv.Power == 0) { myqrv.Power = StationData.Database.QRVGetDefaultPower(Properties.Settings.Default.Band); } if (Properties.Settings.Default.Path_BestCaseElevation) { if (!MaidenheadLocator.IsPrecise(mycall.Lat, mycall.Lon, 3)) { ElvMinMaxInfo maxinfo = ElevationData.Database.ElevationTileFindMinMaxInfo(mycall.Loc, Properties.Settings.Default.ElevationModel); if (maxinfo != null) { mycall.Lat = maxinfo.MaxLat; mycall.Lon = maxinfo.MaxLon; } } } LocationDesignator dxcall = StationData.Database.LocationFindOrCreate(Properties.Settings.Default.DXCall, MaidenheadLocator.LocFromLatLon(Properties.Settings.Default.DXLat, Properties.Settings.Default.DXLon, false, 3)); QRVDesignator dxqrv = StationData.Database.QRVFindOrCreateDefault(dxcall.Call, dxcall.Loc, Properties.Settings.Default.Band); // set qrv defaults if zero if (dxqrv.AntennaHeight == 0) { dxqrv.AntennaHeight = StationData.Database.QRVGetDefaultAntennaHeight(Properties.Settings.Default.Band); } if (dxqrv.AntennaGain == 0) { dxqrv.AntennaGain = StationData.Database.QRVGetDefaultAntennaGain(Properties.Settings.Default.Band); } if (dxqrv.Power == 0) { dxqrv.Power = StationData.Database.QRVGetDefaultPower(Properties.Settings.Default.Band); } if (Properties.Settings.Default.Path_BestCaseElevation) { if (!MaidenheadLocator.IsPrecise(dxcall.Lat, dxcall.Lon, 3)) { ElvMinMaxInfo maxinfo = ElevationData.Database.ElevationTileFindMinMaxInfo(dxcall.Loc, Properties.Settings.Default.ElevationModel); if (maxinfo != null) { dxcall.Lat = maxinfo.MaxLat; dxcall.Lon = maxinfo.MaxLon; } } } // find local obstruction, if any LocalObstructionDesignator o = ElevationData.Database.LocalObstructionFind(mycall.Lat, mycall.Lon, Properties.Settings.Default.ElevationModel); double mybearing = LatLon.Bearing(mycall.Lat, mycall.Lon, dxcall.Lat, dxcall.Lon); double myobstr = (o != null) ? o.GetObstruction(myqrv.AntennaHeight, mybearing) : double.MinValue; // try to find propagation path in database or create new one and store PPath = PropagationData.Database.PropagationPathFindOrCreateFromLatLon( bw_History, mycall.Lat, mycall.Lon, ElevationData.Database[mycall.Lat, mycall.Lon, Properties.Settings.Default.ElevationModel] + myqrv.AntennaHeight, dxcall.Lat, dxcall.Lon, ElevationData.Database[dxcall.Lat, dxcall.Lon, Properties.Settings.Default.ElevationModel] + dxqrv.AntennaHeight, Bands.ToGHz(Properties.Settings.Default.Band), LatLon.Earth.Radius * Properties.Settings.Default.Path_Band_Settings[Properties.Settings.Default.Band].K_Factor, Properties.Settings.Default.Path_Band_Settings[Properties.Settings.Default.Band].F1_Clearance, ElevationData.Database.GetDefaultStepWidth(Properties.Settings.Default.ElevationModel), Properties.Settings.Default.ElevationModel, myobstr); DateTime time = From; lock (Crossings) { Crossings.Clear(); } lock (NearestPositions) { NearestPositions.Clear(); } // pre-select nearest positions only bw_History.ReportProgress(0, "Pre-selecting nearest positions..."); LatLon.GPoint midpoint = PPath.GetMidPoint(); double maxdist = PPath.Distance / 2; foreach (AircraftPositionDesignator ap in AllPositions) { if ((ap.LastUpdated >= From) && (ap.LastUpdated <= To) && (LatLon.Distance(ap.Lat, ap.Lon, midpoint.Lat, midpoint.Lon) <= maxdist)) { AircraftDesignator ac = null; AircraftTypeDesignator at = null; ac = AircraftData.Database.AircraftFindByHex(ap.Hex); if (ac != null) { at = AircraftData.Database.AircraftTypeFindByICAO(ac.TypeCode); } PlaneInfo plane = new PlaneInfo(ap.LastUpdated, ap.Call, ((ac != null) && (!String.IsNullOrEmpty(ac.TypeCode)))? ac.Reg : "[unknown]", ap.Hex, ap.Lat, ap.Lon, ap.Track, ap.Alt, ap.Speed, (ac != null) && (!String.IsNullOrEmpty(ac.TypeCode)) ? ac.TypeCode : "[unkomwn]", ((at != null) && (!String.IsNullOrEmpty(at.Manufacturer))) ? at.Manufacturer : "[unknown]", ((at != null) && (!String.IsNullOrEmpty(at.Model))) ? at.Model : "[unknown]", (at != null) ? at.Category : PLANECATEGORY.NONE); lock (NearestPositions) { NearestPositions.Add(plane); } if (NearestPositions.Count % 1000 == 0) { bw_History.ReportProgress(0, "Pre-selecting nearest positions..." + "[" + NearestPositions.Count.ToString() + "]"); } } if (bw_History.CancellationPending) { break; } } bw_History.ReportProgress(0, "Pre-selecting nearest positions finished, " + NearestPositions.Count.ToString() + " positions."); // return if no positions left over if (NearestPositions.Count == 0) { return; } int startindex = 0; // set timeline to first reported position time = NearestPositions[0].Time; while ((!bw_History.CancellationPending) && (time <= To)) { if (Crossings.Count % 1000 == 0) { bw_History.ReportProgress(0, "Calculating at " + time.ToString("yyyy-MM-dd HH:mm:ss") + ", " + Crossings.Count.ToString() + " crossings so far."); } // calculate from timestamp DateTime from = time.AddMinutes(-Properties.Settings.Default.Planes_Position_TTL); // fill plane position cache PlaneInfoCache ac = new PlaneInfoCache(); int i = startindex; startindex = -1; while ((!bw_History.CancellationPending) && (i < NearestPositions.Count)) { // update ap in cache if relevant if (NearestPositions[i].Time >= from) { // store first index as startindex for next iteration if (startindex == -1) { startindex = i; } lock (ac) { ac.InsertOrUpdateIfNewer(NearestPositions[i]); } } // stop if position is newer than current time if (NearestPositions[i].Time > time) { break; } i++; } List <PlaneInfo> allplanes = ac.GetAll(time, Properties.Settings.Default.Planes_Position_TTL); // get nearest planes List <PlaneInfo> nearestplanes = AircraftData.Database.GetNearestPlanes(time, PPath, allplanes, Properties.Settings.Default.Planes_Filter_Max_Circumcircle, Properties.Settings.Default.Path_Band_Settings[Properties.Settings.Default.Band].MaxDistance, Properties.Settings.Default.Planes_MaxAlt); if ((nearestplanes != null) && (nearestplanes.Count() > 0)) { // get all planes crossing the path foreach (PlaneInfo plane in nearestplanes) { if (plane.IntQRB <= Properties.Settings.Default.Path_Band_Settings[Properties.Settings.Default.Band].MaxDistance) { // check if level value is available SignalLevelDesignator ad = SignalData.Database.SignalLevelFind(plane.Time); if (ad != null) { plane.SignalStrength = ad.Level; } else { plane.SignalStrength = double.MinValue; } lock (Crossings) { if (!Properties.Settings.Default.Analysis_CrossingHistory_WithSignalLevel || (ad != null)) { Crossings.Add(plane); } } } bw_History.ReportProgress(0, "Calculating at " + time.ToString("yyyy-MM-dd HH:mm:ss") + ", " + Crossings.Count.ToString() + " crossings so far."); } } time = time.AddSeconds(Stepwidth); } bw_History.ReportProgress(100, "Calculation done."); }