public async Task <IActionResult> Get([FromQuery] string regions         = "", [FromQuery] string stationTypes = "", [FromQuery] string agencies = "", [FromQuery] string regressionTypes = "", [FromQuery] string variableTypes = "",
                                              [FromQuery] string statisticGroups = "", [FromQuery] string filterText   = null, [FromQuery] int page      = 1, [FromQuery] int pageCount           = 50, [FromQuery] bool includeStats    = false, [FromQuery] bool geojson = false)
        {
            try
            {
                List <string> regionList         = parse(regions);
                List <string> stationTypeList    = parse(stationTypes);
                List <string> agencyList         = parse(agencies);
                List <string> regressionTypeList = parse(regressionTypes);
                List <string> variableTypeList   = parse(variableTypes);
                List <string> statisticGroupList = parse(statisticGroups);

                IQueryable <Station> entities = agent.GetStations(regionList, stationTypeList, agencyList, regressionTypeList, variableTypeList, statisticGroupList, includeStats, filterText);

                // get number of items to skip for pagination
                var skip = (page - 1) * pageCount;
                sm("Returning page " + page + " of " + (entities.Count() / pageCount + 1) + ".");
                sm("Total Count: " + entities.Count());
                entities = entities.Skip(skip).Take(pageCount);

                if (geojson)
                {
                    return(Ok(GeojsonFormatter.ToGeojson(entities)));         // return as geojson
                }
                return(Ok(entities));
            }
            catch (Exception ex)
            {
                return(HandleException(ex));
            }
        }
        public async Task <IActionResult> WithinBounds([FromQuery] double xmin, [FromQuery] double ymin, [FromQuery] double xmax, [FromQuery] double ymax, [FromQuery] bool geojson = false, [FromQuery] bool includeStats = false, [FromQuery] int?page = null, [FromQuery] int pageCount = 50)
        {
            try
            {
                IEnumerable <Station> stations = agent.GetStationsWithinBounds(xmin, ymin, xmax, ymax, includeStats).AsEnumerable();
                if (geojson)
                {
                    return(Ok(GeojsonFormatter.ToGeojson(stations)));
                }

                // get number of items to skip for pagination
                // checking for page number to be sent for this so it doesn't cause issues in StreamStats for now
                if (page != null)
                {
                    var skip = (Convert.ToInt32(page) - 1) * pageCount;
                    sm("Returning page " + page + " of " + (stations.Count() / pageCount + 1) + ".");
                    sm("Total Count: " + stations.Count());
                    stations = stations.Skip(skip).Take(pageCount);
                }

                return(Ok(stations));
            }
            catch (Exception ex)
            {
                return(await HandleExceptionAsync(ex));
            }
        }
        public async Task <IActionResult> Nearest([FromQuery] double lat, [FromQuery] double lon, [FromQuery] double radius, [FromQuery] bool includeStats = false, [FromQuery] bool geojson = false, [FromQuery] int?page = null, [FromQuery] int pageCount = 50)
        {
            try
            {
                IQueryable <Station> stations = agent.GetNearest(lat, lon, radius, includeStats);
                if (stations.Count() == 0)
                {
                    sm("No stations located within search distance.", MessageType.warning);
                }

                // get number of items to skip for pagination
                // checking for page number to be sent for this so it doesn't cause issues in StreamStats for now
                if (page != null)
                {
                    var skip = (Convert.ToInt32(page) - 1) * pageCount;
                    sm("Returning page " + page + " of " + (stations.Count() / pageCount + 1) + ".");
                    sm("Total Count: " + stations.Count());
                    stations = stations.Skip(skip).Take(pageCount);
                }

                if (geojson)
                {
                    return(Ok(GeojsonFormatter.ToGeojson(stations)));
                }
                return(Ok(stations));
            }
            catch (Exception ex)
            {
                return(await HandleExceptionAsync(ex));
            }
        }
        public async Task <IActionResult> Network([FromQuery] double lat, [FromQuery] double lon, [FromQuery] double distance, [FromQuery] bool includeStats = false, [FromQuery] bool geojson = false, [FromQuery] int?page = null, [FromQuery] int pageCount = 50)
        {
            try
            {
                var nldi_sa = new NLDIServiceAgent(this.NLDIsettings, this.Navigationsettings);
                var isOk    = await nldi_sa.ReadNLDIAsync(lat, lon, distance);

                if (!isOk)
                {
                    throw new Exception("Failed to retrieve NLDI data");
                }

                JObject nldi_stations = (JObject)nldi_sa.getStations();
                var     stationCodes  = new List <string>();
                if (nldi_stations["features"] != null)
                {
                    var count = nldi_stations["features"].Count();
                    if (count == 0)
                    {
                        sm("No stations located within search distance.", MessageType.warning);
                    }
                    foreach (var feat in nldi_stations["features"].Children())
                    {
                        var    id      = (string)feat["properties"]["identifier"];
                        string splitID = id.Split(new string[] { "-" }, StringSplitOptions.None)[1];
                        stationCodes.Add(splitID);
                    }

                    if (count > 0)
                    {
                        var stations = agent.GetStations(null, null, null, null, null, null, includeStats, null, stationCodes);
                        // need to pull in geojson changes and use that
                        if (geojson)
                        {
                            return(Ok(GeojsonFormatter.ToGeojson(stations)));
                        }

                        // get number of items to skip for pagination
                        // checking for page number to be sent for this so it doesn't cause issues in StreamStats for now
                        if (page != null)
                        {
                            var skip = (Convert.ToInt32(page) - 1) * pageCount;
                            sm("Returning page " + page + " of " + (stations.Count() / pageCount + 1) + ".");
                            sm("Total Count: " + stations.Count());
                            stations = stations.Skip(skip).Take(pageCount);
                        }

                        return(Ok(stations));
                    }
                }

                sm("No stations located within search distance.", MessageType.warning);
                return(Ok(nldi_stations));
            }
            catch (Exception ex)
            {
                return(await HandleExceptionAsync(ex));
            }
        }