예제 #1
0
파일: Webserver.cs 프로젝트: dh1df/AirScout
        public LocationDesignator LocationFind(string call, string loc = "")
        {
            // check all parameters
            if (!Callsign.Check(call))
            {
                return(null);
            }
            if (!String.IsNullOrEmpty(loc) && !MaidenheadLocator.Check(loc))
            {
                return(null);
            }
            // get location info
            LocationDesignator ld = (String.IsNullOrEmpty(loc)) ? StationData.Database.LocationFind(call) : StationData.Database.LocationFind(call, loc);

            // return null if not found
            if (ld == null)
            {
                return(null);
            }
            // get elevation
            ld.Elevation         = GetElevation(ld.Lat, ld.Lon);
            ld.BestCaseElevation = false;
            // modify location in case of best case elevation is selected --> but do not store in database or settings!
            if (Properties.Settings.Default.Path_BestCaseElevation)
            {
                if (!MaidenheadLocator.IsPrecise(ld.Lat, ld.Lon, 3))
                {
                    ElvMinMaxInfo maxinfo = GetMinMaxElevationLoc(ld.Loc);
                    if (maxinfo != null)
                    {
                        ld.Lat               = maxinfo.MaxLat;
                        ld.Lon               = maxinfo.MaxLon;
                        ld.Elevation         = maxinfo.MaxElv;
                        ld.BestCaseElevation = true;
                    }
                }
            }
            return(ld);
        }
예제 #2
0
        private void tb_Locator_TextChanged(object sender, EventArgs e)
        {
            // update lat/lon
            double mlat, mlon;

            if (tb_Locator.Focused)
            {
                // locator box is focused --> update lat/lon
                if (MaidenheadLocator.Check(tb_Locator.Text) && tb_Locator.Text.Length >= 6)
                {
                    MaidenheadLocator.LatLonFromLoc(tb_Locator.Text, PositionInRectangle.MiddleMiddle, out mlat, out mlon);
                    tb_Latitude.SilentValue  = mlat;
                    tb_Longitude.SilentValue = mlon;
                }
                else
                {
                    tb_Latitude.SilentValue  = double.NaN;
                    tb_Longitude.SilentValue = double.NaN;
                }
            }
            ValidateDetails();
        }
예제 #3
0
파일: Webserver.cs 프로젝트: dh1df/AirScout
        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);
        }
예제 #4
0
파일: Webserver.cs 프로젝트: dh1df/AirScout
        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);
        }
예제 #5
0
파일: Webserver.cs 프로젝트: dh1df/AirScout
        private string DeliverElevationPath(string paramstr)
        {
            string json = "";
            // set default values
            string mycallstr = "";
            string mylocstr  = "";
            string dxcallstr = "";
            string dxlocstr  = "";
            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");
                }
            }
            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!");
            }
            // 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);
            }

            // get or calculate elevation path
            ElevationPathDesignator epath = ElevationData.Database.ElevationPathFindOrCreateFromLatLon(
                this,
                myloc.Lat,
                myloc.Lon,
                dxloc.Lat,
                dxloc.Lon,
                ElevationData.Database.GetDefaultStepWidth(Properties.Settings.Default.ElevationModel),
                Properties.Settings.Default.ElevationModel);

            if (epath == null)
            {
                return(json);
            }
            // add additional info to ppath
            epath.Location1 = myloc;
            epath.Location2 = dxloc;
            epath.QRV1      = myqrv;
            epath.QRV2      = dxqrv;
            // convert path to json
            json = epath.ToJSON();
            return(json);
        }
예제 #6
0
파일: Webserver.cs 프로젝트: dh1df/AirScout
        private string DeliverQRV(string paramstr)
        {
            string json = "";
            // set default values
            string callstr = "";
            string locstr  = "";
            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);
                    callstr = pars.Get("CALL");
                    locstr  = pars.Get("LOC");
                    bandstr = pars.Get("BAND");
                }
            }
            catch (Exception ex)
            {
                // return error
                return("Error while parsing parameters!");
            }
            // check parameters
            if (!Callsign.Check(callstr))
            {
                return("Error: " + callstr + " is not a valid callsign!");
            }
            if (!MaidenheadLocator.Check(locstr))
            {
                return("Error: " + locstr + " 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
            if (band != BAND.BALL)
            {
                QRVDesignator qrv = StationData.Database.QRVFind(callstr, locstr, band);
                if (qrv == null)
                {
                    return("Error: QRV info not found in database!");
                }
                json = qrv.ToJSON();
                return(json);
            }
            List <QRVDesignator> qrvs = StationData.Database.QRVFind(callstr, locstr);

            if ((qrvs == null) || (qrvs.Count() == 0))
            {
                return("Error: QRV info not found in database!");
            }
            JsonSerializerSettings settings = new JsonSerializerSettings();

            settings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
            settings.FloatFormatHandling  = FloatFormatHandling.String;
            settings.Formatting           = Newtonsoft.Json.Formatting.Indented;
            json = JsonConvert.SerializeObject(qrvs, settings);
            return(json);
        }
예제 #7
0
파일: Webserver.cs 프로젝트: dh1df/AirScout
        private string DeliverLocation(string paramstr)
        {
            string json = "";
            // set default values
            string callstr = "";
            string locstr  = "";

            // 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);
                    callstr = pars.Get("CALL");
                    locstr  = pars.Get("LOC");
                }
            }
            catch (Exception ex)
            {
                // return error
                return("Error while parsing parameters!");
            }
            // check parameters
            if (!Callsign.Check(callstr))
            {
                return("Error: " + callstr + " is not a valid callsign!");
            }
            LocationDesignator ld = null;

            // locstr == null or empty --> return last recent location
            if (String.IsNullOrEmpty(locstr))
            {
                ld = LocationFind(callstr);
                if (ld == null)
                {
                    return("Error: Location not found in database!");
                }
                json = ld.ToJSON();
                return(json);
            }
            if (locstr == "ALL")
            {
                List <LocationDesignator> l = LocationFindAll(callstr);
                if (l == null)
                {
                    return("Error: Location not found in database!");
                }
                JsonSerializerSettings settings = new JsonSerializerSettings();
                settings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
                settings.FloatFormatHandling  = FloatFormatHandling.String;
                settings.Formatting           = Newtonsoft.Json.Formatting.Indented;
                settings.Culture = CultureInfo.InvariantCulture;
                json             = JsonConvert.SerializeObject(l, settings);
                return(json);
            }
            if (!MaidenheadLocator.Check(locstr))
            {
                return("Error: " + locstr + " is not a valid Maidenhead locator!");
            }
            // search call in station database, return empty string if not found
            ld = LocationFind(callstr, locstr);
            if (ld == null)
            {
                return("Error: Location not found in database!");
            }
            json = ld.ToJSON();
            return(json);
        }
예제 #8
0
        private bool ValidateDetails()
        {
            // validates user details and sets position on map
            // enables/disables next button
            double mlat, mlon;

            // colour Textbox if more precise lat/lon information is available
            if (MaidenheadLocator.IsPrecise(tb_Latitude.Value, tb_Longitude.Value, 3))
            {
                if (tb_Locator.BackColor != Color.PaleGreen)
                {
                    tb_Locator.BackColor = Color.PaleGreen;
                }
            }
            else
            {
                if (tb_Locator.BackColor != Color.FloralWhite)
                {
                    tb_Locator.BackColor = Color.FloralWhite;
                }
            }
            if (GeographicalPoint.Check(tb_Latitude.Value, tb_Longitude.Value))
            {
                // update locator text if not focusd
                if (!tb_Locator.Focused)
                {
                    tb_Locator.SilentText = MaidenheadLocator.LocFromLatLon(tb_Latitude.Value, tb_Longitude.Value, Properties.Settings.Default.Locator_SmallLettersForSubsquares, (int)Properties.Settings.Default.Locator_MaxLength / 2, true);
                }
                // get locator polygon
                Callsignpolygons.Clear();
                List <PointLatLng> l = new List <PointLatLng>();
                // add loc bounds to map polygons
                MaidenheadLocator.LatLonFromLoc(tb_Locator.Text, PositionInRectangle.TopLeft, out mlat, out mlon);
                l.Add(new PointLatLng(mlat, mlon));
                MaidenheadLocator.LatLonFromLoc(tb_Locator.Text, PositionInRectangle.TopRight, out mlat, out mlon);
                l.Add(new PointLatLng(mlat, mlon));
                MaidenheadLocator.LatLonFromLoc(tb_Locator.Text, PositionInRectangle.BottomRight, out mlat, out mlon);
                l.Add(new PointLatLng(mlat, mlon));
                MaidenheadLocator.LatLonFromLoc(tb_Locator.Text, PositionInRectangle.BottomLeft, out mlat, out mlon);
                l.Add(new PointLatLng(mlat, mlon));
                GMapPolygon p = new GMapPolygon(l, tb_Locator.Text.ToString());
                p.Stroke = new Pen(Color.FromArgb(255, Color.Magenta), 3);
                p.Fill   = new SolidBrush(Color.FromArgb(0, Color.Magenta));
                Callsignpolygons.Polygons.Add(p);
                // update user position
                UserPos.Position = new PointLatLng(tb_Latitude.Value, tb_Longitude.Value);
                // update map position
                if (!IsDraggingMarker)
                {
                    string loc = MaidenheadLocator.LocFromLatLon(tb_Latitude.Value, tb_Longitude.Value, Properties.Settings.Default.Locator_SmallLettersForSubsquares, (int)Properties.Settings.Default.Locator_MaxLength / 2, true);
                    MaidenheadLocator.LatLonFromLoc(loc, PositionInRectangle.MiddleMiddle, out mlat, out mlon);
                    gm_Callsign.Position = new PointLatLng(mlat, mlon);
                    // adjust map zoom level
                    int zoom = loc.Length;
                    switch (zoom)
                    {
                    case 6:
                        gm_Callsign.Zoom = 12;
                        break;

                    case 8:
                        gm_Callsign.Zoom = 15;
                        break;

                    case 10:
                        gm_Callsign.Zoom = 17;
                        break;
                    }
                }
            }
            // check all values
            if (Callsign.Check(tb_Callsign.Text) && MaidenheadLocator.Check(tb_Locator.Text) && !double.IsNaN(tb_Latitude.Value) && !double.IsNaN(tb_Longitude.Value))
            {
                StationLocation.Lat      = tb_Latitude.Value;
                StationLocation.Lon      = tb_Longitude.Value;
                StationLocation.Source   = MaidenheadLocator.IsPrecise(tb_Latitude.Value, tb_Longitude.Value, 3) ? GEOSOURCE.FROMUSER : GEOSOURCE.FROMLOC;
                StationLocation.Loc      = MaidenheadLocator.LocFromLatLon(StationLocation.Lat, StationLocation.Lon, false, 3);
                tb_Elevation.SilentValue = GetElevation(StationLocation.Lat, StationLocation.Lon);
                return(true);
            }
            else
            {
                return(false);
            }
        }
예제 #9
0
파일: Callsigns.cs 프로젝트: dh1df/AirScout
        public DataTableCallsigns FromCSV(string filename)
        {
            // imports a variable csv format with autodetect of callsign, loc and timestamp
            DataTableCallsigns dt = new DataTableCallsigns();

            if (!File.Exists(filename))
            {
                return(dt);
            }
            try
            {
                string s = "";
                using (StreamReader sr = new StreamReader(File.OpenRead(filename)))
                {
                    while (!sr.EndOfStream)
                    {
                        s = sr.ReadLine();
                        if (!String.IsNullOrEmpty(s) && !s.StartsWith("//"))
                        {
                            string[] a = s.Split(';');
                            if (a.Length < 2)
                            {
                                a = s.Split(',');
                            }
                            string    call   = "";
                            double    lat    = double.NaN;
                            double    lon    = double.NaN;
                            string    loc    = "";
                            GEOSOURCE source = GEOSOURCE.FROMLOC;
                            // set lastupdated to filetime if no timestamp is found on file
                            string filetime    = File.GetCreationTimeUtc(filename).ToString("u");
                            string lastupdated = filetime;
                            foreach (string entry in a)
                            {
                                // search for 1st locator in line
                                if (MaidenheadLocator.Check(entry) && (entry.Length == 6) && String.IsNullOrEmpty(loc))
                                {
                                    MaidenheadLocator.LatLonFromLoc(entry, PositionInRectangle.MiddleMiddle, out lat, out lon);
                                    break;
                                }
                                // search for 1st callsign in line
                                if (Callsign.Check(entry) && String.IsNullOrEmpty(call))
                                {
                                    call = entry.Trim().ToUpper();
                                }
                                DateTime timestamp;
                                if (DateTime.TryParseExact(entry, "yyyy-MM-dd HH:mm:ssZ", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out timestamp))
                                {
                                    lastupdated = timestamp.ToString("u");
                                }
                            }
                            if (GeographicalPoint.Check(lat, lon))
                            {
                                // store array values in DataTable
                                DataRow row = dt.NewRow();
                                row["Call"]        = call;
                                row["Lat"]         = lat;
                                row["Lon"]         = lon;
                                row["Source"]      = source.ToString();
                                row["LastUpdated"] = lastupdated;
                                DataRow oldrow = dt.Rows.Find(row["Call"].ToString());
                                if (oldrow != null)
                                {
                                    // call found --> check for update
                                    if (String.Compare(row["LastUpdated"].ToString(), oldrow["LastUpdated"].ToString()) > 0)
                                    {
                                        oldrow["Lat"]         = row["Lat"];
                                        oldrow["Lon"]         = row["Lon"];
                                        oldrow["Source"]      = row["Source"];
                                        oldrow["LastUpdated"] = row["LastUpdated"];
                                    }
                                }
                                else
                                {
                                    // add new row
                                    dt.Rows.Add(row);
                                }
                            }
                        }
                    }
                }
            }
            catch
            {
            }
            return(dt);
        }
예제 #10
0
파일: Callsigns.cs 프로젝트: dh1df/AirScout
        public DataTableCallsigns FromDTB(string filename)
        {
            // imports DTB database from Win-Test

            DataTableCallsigns dt = new DataTableCallsigns();

            if (!File.Exists(filename))
            {
                return(dt);
            }
            try
            {
                using (StreamReader sr = new StreamReader(File.OpenRead(filename)))
                {
                    while (!sr.EndOfStream)
                    {
                        char[] buffer = new char[26];
                        sr.ReadBlock(buffer, 0, 14);
                        sr.ReadBlock(buffer, 14, 12);
                        if (!sr.EndOfStream)
                        {
                            string call        = "";
                            string loc         = "";
                            string lastupdated = "";
                            double lat         = double.NaN;
                            double lon         = double.NaN;
                            int    i           = 0;
                            while ((buffer[i] != 0) && (i < 14))
                            {
                                call += (char)buffer[i];
                                i++;
                            }
                            i = 14;
                            while ((i < 21) && (buffer[i] != 0))
                            {
                                loc += (char)buffer[i];
                                i++;
                            }
                            i = 21;
                            while ((i < 26) && (buffer[i] != 0))
                            {
                                lastupdated += (char)buffer[i];
                                i++;
                            }

                            call = call.Trim().ToUpper();
                            loc  = loc.Trim().ToUpper();
                            try
                            {
                                if (lastupdated[2] < '5')
                                {
                                    lastupdated = "20" + lastupdated[2] + lastupdated[3] + "-" + lastupdated[0] + lastupdated[1] + "-01 00:00:00Z";
                                }
                                else
                                {
                                    lastupdated = "19" + lastupdated[2] + lastupdated[3] + "-" + lastupdated[0] + lastupdated[1] + "-01 00:00:00Z";
                                }
                            }
                            catch
                            {
                            }
                            if (MaidenheadLocator.Check(loc))
                            {
                                MaidenheadLocator.LatLonFromLoc(loc, PositionInRectangle.MiddleMiddle, out lat, out lon);
                            }
                            GEOSOURCE source = GEOSOURCE.FROMLOC;
                            if (GeographicalPoint.Check(lat, lon))
                            {
                                DataRow row = dt.NewRow();
                                row["Call"]        = call;
                                row["Lat"]         = lat;
                                row["Lon"]         = lon;
                                row["Source"]      = source.ToString();
                                row["LastUpdated"] = lastupdated;
                                DataRow oldrow = dt.Rows.Find(row["Call"].ToString());
                                if (oldrow != null)
                                {
                                    // call found --> check for update
                                    if (String.Compare(row["LastUpdated"].ToString(), oldrow["LastUpdated"].ToString()) > 0)
                                    {
                                        oldrow["Lat"]         = row["Lat"];
                                        oldrow["Lon"]         = row["Lon"];
                                        oldrow["Source"]      = row["Source"];
                                        oldrow["LastUpdated"] = row["LastUpdated"];
                                    }
                                }
                                else
                                {
                                    // add new row
                                    dt.Rows.Add(row);
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
            }
            return(dt);
        }
예제 #11
0
파일: Callsigns.cs 프로젝트: dh1df/AirScout
        public DataTableCallsigns FromCALL3(string filename)
        {
            // imports CALL3.TXT as used by WSJT
            // fields are
            // CALLSIGN, LOCATOR, EME FLAG, (these first three fields are used by WSJT)
            // plus optional fields:
            // STATE, FIRST NAME, EMAIL ADDRESS, NOTES, REVISION DATE

            DataTableCallsigns dt = new DataTableCallsigns();

            if (!File.Exists(filename))
            {
                return(dt);
            }
            try
            {
                string s = "";
                using (StreamReader sr = new StreamReader(File.OpenRead(filename)))
                {
                    while (!sr.EndOfStream)
                    {
                        s = sr.ReadLine();
                        if (!String.IsNullOrEmpty(s) && !s.StartsWith("//"))
                        {
                            string[] a = s.Split(',');
                            // store array values in DataTable
                            string call = a[0];
                            string loc  = a[1];
                            double lat  = double.NaN;
                            double lon  = double.NaN;
                            if (MaidenheadLocator.Check(loc))
                            {
                                MaidenheadLocator.LatLonFromLoc(loc, PositionInRectangle.MiddleMiddle, out lat, out lon);
                            }
                            GEOSOURCE source      = GEOSOURCE.FROMLOC;
                            DateTime  lastupdated = DateTime.MinValue.ToUniversalTime();
                            if (a.Length >= 7)
                            {
                                // try to get an revision date maybe in various formats
                                // MMMonVHF
                                try
                                {
                                    lastupdated = DateTime.ParseExact(a[7], "MM/yy", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
                                }
                                catch (Exception ex)
                                {
                                }
                            }
                            if (GeographicalPoint.Check(lat, lon))
                            {
                                DataRow row = dt.NewRow();
                                row["Call"]        = call;
                                row["Lat"]         = lat;
                                row["Lon"]         = lon;
                                row["Source"]      = source.ToString();
                                row["LastUpdated"] = lastupdated.ToString("u");
                                DataRow oldrow = dt.Rows.Find(row["Call"].ToString());
                                if (oldrow != null)
                                {
                                    // call found --> check for update
                                    if (String.Compare(row["LastUpdated"].ToString(), oldrow["LastUpdated"].ToString()) > 0)
                                    {
                                        oldrow["Lat"]         = row["Lat"];
                                        oldrow["Lon"]         = row["Lon"];
                                        oldrow["Source"]      = row["Source"];
                                        oldrow["LastUpdated"] = row["LastUpdated"];
                                    }
                                }
                                else
                                {
                                    // add new row
                                    dt.Rows.Add(row);
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
            }
            return(dt);
        }