diff --git a/assets/src/scripts/mock-gw-field-visits.js b/assets/src/scripts/mock-gw-field-visits.js new file mode 100644 index 0000000000000000000000000000000000000000..cb8ef7d701de790326a9e10d0d5faf6ca5e30e01 --- /dev/null +++ b/assets/src/scripts/mock-gw-field-visits.js @@ -0,0 +1,652 @@ +export const MOCK_GW_FIELD_VISITS = `{ + "type": "Feature", + "geometry": {"type": "point", "coordinates": [-87.3848333000000, 41.61747220000000]}, + "properties": { + "agency": "U.S. Geological Survey", + "monitoringLocationNumber": "413703087230501", + "monitoringLocationName": "USGS WELL P4 AT PINE STATION NP NEAR GARY, IN", + "monitoringLocationType": "Well", + "district": "Indiana", + "state": "Indiana", + "county": "Lake County", + "country": "US", + "monitoringLocationAltitudeLandSurface": "586.81", + "altitudeMethod": "Level or other surveyed method.", + "altitudeAccuracy": ".05", + "altitudeDatum": "North American Vertical Datum of 1988", + "nationalAquifer": "Sand and gravel aquifers (glaciated regions)", + "nationalAquiferCode": "N100GLCIAL", + "localAquifer": "Quaternary System", + "localAquiferType": "Unconfined single aquifer", + "wellDepth": "11.32", + "holeDepth": "11.32", + "holeDepthSource": "S", + "agencyCode": "USGS", + "active": "t", + "districtCode": "18", + "stateFIPS": "18", + "countyFIPS": "089", + "countryFIPS": "US", + "hydrologicUnit": "04040001", + "monitoringLocationUrl": "https://waterdata.usgs.gov/monitoring-location/413703087230501", + "dataStreams": [{ + "observationType": "Discrete", + "observationDomain": "Groundwater levels", + "phenomenonTimeStart": "2019-08-21 22:10:00", + "phenomenonTimeEnd": "2021-12-16 17:04:00", + "observedPropertyName": "Groundwater level above NGVD 1929, feet", + "observedPropertyReference": "https://waterdata.usgs.gov/nwisweb/rdf?parmCd=62610", + "USGSParameterCode": "62610", + "samplingFeatureName": "USGS WELL P4 AT PINE STATION NP NEAR GARY, IN", + "statistic": "Daily random instantaneous values", + "statisticReference": "http://waterdata.usgs.gov/nwisweb/rdf?statCd=00011", + "unitOfMeasureName": "ft", + "unitOfMeasureReference": null, + "observations": [{ + "phenomenonTime": "2021-04-23T16:34", + "phenomenonTimeAccuracy": "minute", + "result": "587.53", + "resultAccuracy": "0.03", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2019-11-01T17:15", + "phenomenonTimeAccuracy": "minute", + "result": "589.30", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2020-01-29T21:20", + "phenomenonTimeAccuracy": "minute", + "result": "589.32", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-08-26T18:08", + "phenomenonTimeAccuracy": "minute", + "result": "587.19", + "resultAccuracy": "0.02", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-10-21T16:26", + "phenomenonTimeAccuracy": "minute", + "result": "586.45", + "resultAccuracy": "0.02", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2020-08-04T14:49", + "phenomenonTimeAccuracy": "minute", + "result": "588.75", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-09-28T15:35", + "phenomenonTimeAccuracy": "minute", + "result": "585.81", + "resultAccuracy": "0.02", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2020-10-23T18:26", + "phenomenonTimeAccuracy": "minute", + "result": "586.88", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2020-05-26T21:15", + "phenomenonTimeAccuracy": "minute", + "result": "589.53", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-07-29T20:31", + "phenomenonTimeAccuracy": "minute", + "result": "587.88", + "resultAccuracy": "0.02", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-01-21T16:35", + "phenomenonTimeAccuracy": "minute", + "result": "587.28", + "resultAccuracy": "0.03", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2019-08-21T22:10", + "phenomenonTimeAccuracy": "minute", + "result": "587.13", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-12-16T17:04", + "phenomenonTimeAccuracy": "minute", + "result": "587.34", + "resultAccuracy": "0.03", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2020-11-20T18:13", + "phenomenonTimeAccuracy": "minute", + "result": "586.71", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-11-16T18:28", + "phenomenonTimeAccuracy": "minute", + "result": "587.29", + "resultAccuracy": "0.03", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-05-26T19:20", + "phenomenonTimeAccuracy": "minute", + "result": "587.32", + "resultAccuracy": "0.03", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2019-09-18T16:00", + "phenomenonTimeAccuracy": "minute", + "result": "587.45", + "resultAccuracy": null, + "resultMethod": "GW level, electric tape", + "approvals": ["Approved"], + "qualifiers": [] + }, { + "phenomenonTime": "2021-06-29T15:14", + "phenomenonTimeAccuracy": "minute", + "result": "588.07", + "resultAccuracy": "0.03", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2020-09-22T14:56", + "phenomenonTimeAccuracy": "minute", + "result": "587.30", + "resultAccuracy": null, + "resultMethod": "GW level, electric tape", + "approvals": ["Approved"], + "qualifiers": [] + }, { + "phenomenonTime": "2020-03-31T17:25", + "phenomenonTimeAccuracy": "minute", + "result": "589.22", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-03-25T15:20", + "phenomenonTimeAccuracy": "minute", + "result": "587.66", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2020-12-22T17:06", + "phenomenonTimeAccuracy": "minute", + "result": "587.01", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-02-19T20:08", + "phenomenonTimeAccuracy": "minute", + "result": null, + "resultAccuracy": "0.10", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["NoMeasurement", "Frozen"] + }, { + "phenomenonTime": "2019-12-30T19:40", + "phenomenonTimeAccuracy": "minute", + "result": "589.13", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }] + }, { + "observationType": "Discrete", + "observationDomain": "Groundwater levels", + "phenomenonTimeStart": "2019-08-21 22:10:00", + "phenomenonTimeEnd": "2021-12-16 17:04:00", + "observedPropertyName": "Groundwater level above NAVD 1988, feet", + "observedPropertyReference": "https://waterdata.usgs.gov/nwisweb/rdf?parmCd=62611", + "USGSParameterCode": "62611", + "samplingFeatureName": "USGS WELL P4 AT PINE STATION NP NEAR GARY, IN", + "statistic": "Daily random instantaneous values", + "statisticReference": "http://waterdata.usgs.gov/nwisweb/rdf?statCd=00011", + "unitOfMeasureName": "ft", + "unitOfMeasureReference": null, + "observations": [{ + "phenomenonTime": "2021-12-16T17:04", + "phenomenonTimeAccuracy": "minute", + "result": "587.00", + "resultAccuracy": "0.03", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-11-16T18:28", + "phenomenonTimeAccuracy": "minute", + "result": "586.95", + "resultAccuracy": "0.03", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-07-29T20:31", + "phenomenonTimeAccuracy": "minute", + "result": "587.54", + "resultAccuracy": "0.02", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-06-29T15:14", + "phenomenonTimeAccuracy": "minute", + "result": "587.73", + "resultAccuracy": "0.03", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-08-26T18:08", + "phenomenonTimeAccuracy": "minute", + "result": "586.85", + "resultAccuracy": "0.02", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2020-12-22T17:06", + "phenomenonTimeAccuracy": "minute", + "result": "586.67", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-02-19T20:08", + "phenomenonTimeAccuracy": "minute", + "result": null, + "resultAccuracy": "0.10", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["NoMeasurement", "Frozen"] + }, { + "phenomenonTime": "2019-12-30T19:40", + "phenomenonTimeAccuracy": "minute", + "result": "588.79", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2020-09-22T14:56", + "phenomenonTimeAccuracy": "minute", + "result": "586.96", + "resultAccuracy": null, + "resultMethod": "GW level, electric tape", + "approvals": ["Approved"], + "qualifiers": [] + }, { + "phenomenonTime": "2020-05-26T21:15", + "phenomenonTimeAccuracy": "minute", + "result": "589.19", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2019-09-18T16:00", + "phenomenonTimeAccuracy": "minute", + "result": "587.11", + "resultAccuracy": null, + "resultMethod": "GW level, electric tape", + "approvals": ["Approved"], + "qualifiers": [] + }, { + "phenomenonTime": "2020-01-29T21:20", + "phenomenonTimeAccuracy": "minute", + "result": "588.98", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2019-08-21T22:10", + "phenomenonTimeAccuracy": "minute", + "result": "586.79", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-04-23T16:34", + "phenomenonTimeAccuracy": "minute", + "result": "587.19", + "resultAccuracy": "0.03", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2020-11-20T18:13", + "phenomenonTimeAccuracy": "minute", + "result": "586.37", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-03-25T15:20", + "phenomenonTimeAccuracy": "minute", + "result": "587.32", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-05-26T19:20", + "phenomenonTimeAccuracy": "minute", + "result": "586.98", + "resultAccuracy": "0.03", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-01-21T16:35", + "phenomenonTimeAccuracy": "minute", + "result": "586.94", + "resultAccuracy": "0.03", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-10-21T16:26", + "phenomenonTimeAccuracy": "minute", + "result": "586.11", + "resultAccuracy": "0.02", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2020-03-31T17:25", + "phenomenonTimeAccuracy": "minute", + "result": "588.88", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2020-10-23T18:26", + "phenomenonTimeAccuracy": "minute", + "result": "586.54", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2019-11-01T17:15", + "phenomenonTimeAccuracy": "minute", + "result": "588.96", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-09-28T15:35", + "phenomenonTimeAccuracy": "minute", + "result": "585.47", + "resultAccuracy": "0.02", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2020-08-04T14:49", + "phenomenonTimeAccuracy": "minute", + "result": "588.41", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }] + }, { + "observationType": "Discrete", + "observationDomain": "Groundwater levels", + "phenomenonTimeStart": "2019-08-21 22:10:00", + "phenomenonTimeEnd": "2021-12-16 17:04:00", + "observedPropertyName": "Depth to water level, feet below land surface", + "observedPropertyReference": "https://waterdata.usgs.gov/nwisweb/rdf?parmCd=72019", + "USGSParameterCode": "72019", + "samplingFeatureName": "USGS WELL P4 AT PINE STATION NP NEAR GARY, IN", + "statistic": "Daily random instantaneous values", + "statisticReference": "http://waterdata.usgs.gov/nwisweb/rdf?statCd=00011", + "unitOfMeasureName": "ft", + "unitOfMeasureReference": null, + "observations": [{ + "phenomenonTime": "2021-05-26T19:20", + "phenomenonTimeAccuracy": "minute", + "result": "-0.17", + "resultAccuracy": "0.03", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-04-23T16:34", + "phenomenonTimeAccuracy": "minute", + "result": "-0.38", + "resultAccuracy": "0.03", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2020-09-22T14:56", + "phenomenonTimeAccuracy": "minute", + "result": "-0.15", + "resultAccuracy": null, + "resultMethod": "GW level, electric tape", + "approvals": ["Approved"], + "qualifiers": [] + }, { + "phenomenonTime": "2020-11-20T18:13", + "phenomenonTimeAccuracy": "minute", + "result": "0.44", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-12-16T17:04", + "phenomenonTimeAccuracy": "minute", + "result": "-0.19", + "resultAccuracy": "0.03", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2020-01-29T21:20", + "phenomenonTimeAccuracy": "minute", + "result": "-2.17", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-09-28T15:35", + "phenomenonTimeAccuracy": "minute", + "result": "1.34", + "resultAccuracy": "0.02", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-08-26T18:08", + "phenomenonTimeAccuracy": "minute", + "result": "-0.04", + "resultAccuracy": "0.02", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-06-29T15:14", + "phenomenonTimeAccuracy": "minute", + "result": "-0.92", + "resultAccuracy": "0.03", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2020-03-31T17:25", + "phenomenonTimeAccuracy": "minute", + "result": "-2.07", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-01-21T16:35", + "phenomenonTimeAccuracy": "minute", + "result": "-0.13", + "resultAccuracy": "0.03", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2019-09-18T16:00", + "phenomenonTimeAccuracy": "minute", + "result": "-0.30", + "resultAccuracy": null, + "resultMethod": "GW level, electric tape", + "approvals": ["Approved"], + "qualifiers": [] + }, { + "phenomenonTime": "2021-11-16T18:28", + "phenomenonTimeAccuracy": "minute", + "result": "-0.14", + "resultAccuracy": "0.03", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2019-08-21T22:10", + "phenomenonTimeAccuracy": "minute", + "result": "0.02", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-03-25T15:20", + "phenomenonTimeAccuracy": "minute", + "result": "-0.51", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2019-12-30T19:40", + "phenomenonTimeAccuracy": "minute", + "result": "-1.98", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-07-29T20:31", + "phenomenonTimeAccuracy": "minute", + "result": "-0.73", + "resultAccuracy": "0.02", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2020-08-04T14:49", + "phenomenonTimeAccuracy": "minute", + "result": "-1.60", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2020-12-22T17:06", + "phenomenonTimeAccuracy": "minute", + "result": "0.14", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2020-05-26T21:15", + "phenomenonTimeAccuracy": "minute", + "result": "-2.38", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-02-19T20:08", + "phenomenonTimeAccuracy": "minute", + "result": null, + "resultAccuracy": "0.10", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["NoMeasurement", "Frozen"] + }, { + "phenomenonTime": "2019-11-01T17:15", + "phenomenonTimeAccuracy": "minute", + "result": "-2.15", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2020-10-23T18:26", + "phenomenonTimeAccuracy": "minute", + "result": "0.27", + "resultAccuracy": "0.01", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Approved"], + "qualifiers": ["Static"] + }, { + "phenomenonTime": "2021-10-21T16:26", + "phenomenonTimeAccuracy": "minute", + "result": "0.70", + "resultAccuracy": "0.02", + "resultMethod": "GW level, calib electric tape", + "approvals": ["Provisional"], + "qualifiers": ["Static"] + }] + }] + } +}`; diff --git a/assets/src/scripts/mock-service-data.js b/assets/src/scripts/mock-service-data.js index 45b77b586d4b36ac47adc09d880463b06c99ddf0..2e7d8fc4c05d0f40863a4199764284fb6fd4f1c5 100644 --- a/assets/src/scripts/mock-service-data.js +++ b/assets/src/scripts/mock-service-data.js @@ -3154,195 +3154,6 @@ export const MOCK_OBSERVATION_ITEM = `{ ] }`; -export const MOCK_GWLEVEL_DATA = -`{ - "name": "ns1:timeSeriesResponseType", - "declaredType": "org.cuahsi.waterml.TimeSeriesResponseType", - "scope": "javax.xml.bind.JAXBElement$GlobalScope", - "value": { - "queryInfo": { - "queryURL": "http://waterservices.usgs.gov/nwis/gwlevels/format=json&sites=354133082042203¶meterCd=72019&startDT=2020-01-01&endDT=2020-11-17", - "criteria": { - "locationParam": "[ALL:354133082042203]", - "variableParam": "[72019]", - "timeParam": { - "beginDateTime": "2020-01-01T00:00:00.000", - "endDateTime": "2020-11-17T23:59:59.000" - }, - "parameter": [] - }, - "note": [ - { - "value": "[ALL:354133082042203]", - "title": "filter:sites" - }, - { - "value": "[mode=RANGE, modifiedSince=null] interval={INTERVAL[2020-01-01T00:00:00.000-05:00/2020-11-17T23:59:59.000Z]}", - "title": "filter:timeRange" - }, - { - "value": "methodIds=[ALL]", - "title": "filter:methodId" - }, - { - "value": "2021-01-07T14:03:54.275Z", - "title": "requestDT" - }, - { - "value": "2d53d020-50f1-11eb-be92-2cea7f58f5ca", - "title": "requestId" - }, - { - "value": "Provisional data are subject to revision. Go to http://waterdata.usgs.gov/nwis/help/?provisional for more information.", - "title": "disclaimer" - }, - { - "value": "vaas01", - "title": "server" - } - ] - }, - "timeSeries": [ - { - "sourceInfo": { - "siteName": "MC-109 NEAR PLEASANT GARDENS, NC (BEDROCK)", - "siteCode": [ - { - "value": "354133082042203", - "network": "NWIS", - "agencyCode": "USGS" - } - ], - "timeZoneInfo": { - "defaultTimeZone": { - "zoneOffset": "-05:00", - "zoneAbbreviation": "EST" - }, - "daylightSavingsTimeZone": { - "zoneOffset": "-04:00", - "zoneAbbreviation": "EDT" - }, - "siteUsesDaylightSavingsTime": true - }, - "geoLocation": { - "geogLocation": { - "srs": "EPSG:4326", - "latitude": 35.6926111, - "longitude": -82.0729444 - }, - "localSiteXY": [] - }, - "note": [], - "siteType": [], - "siteProperty": [ - { - "value": "GW", - "name": "siteTypeCd" - }, - { - "value": "03050101", - "name": "hucCd" - }, - { - "value": "37", - "name": "stateCd" - }, - { - "value": "37111", - "name": "countyCd" - } - ] - }, - "variable": { - "variableCode": [ - { - "value": "72019", - "network": "NWIS", - "vocabulary": "NWIS:UnitValues", - "variableID": 52331280, - "default": true - } - ], - "variableName": "Depth to water level, ft below land surface", - "variableDescription": "Depth to water level, feet below land surface", - "valueType": "Derived Value", - "unit": { - "unitCode": "ft" - }, - "options": { - "option": [ - { - "name": "Statistic", - "optionCode": "00000" - } - ] - }, - "note": [], - "noDataValue": -999999.0, - "variableProperty": [], - "oid": "52331280" - }, - "values": [ - { - "value": [ - { - "value": "26.07", - "qualifiers": ["A", "1"], - "dateTime": "2020-01-23T09:06:00.000" - }, - { - "value": "27.00", - "qualifiers": ["A", "1"], - "dateTime": "2020-03-19T15:11:00.000" - }, - { - "value": "27.000", - "qualifiers": ["A", "1"], - "dateTime": "2020-05-13T11:47:00.000" - }, - { - "value": "29.19", - "qualifiers": ["A", "1"], - "dateTime": "2020-07-23T11:45:00.000" - }, - { - "value": "25.55", - "qualifiers": ["A", "1"], - "dateTime": "2020-08-24T16:04:00.000" - }, - { - "value": "25.03", - "qualifiers": ["A", "1"], - "dateTime": "2020-10-01T18:10:00.000" - }, - { - "value": "24.54", - "qualifiers": ["A", "1"], - "dateTime": "2020-11-17T12:57:00.000" - } - ], - "qualifier": [], - "qualityControlLevel": [], - "method": [ - { - "methodID": 1 - } - ], - "source": [], - "offset": [], - "sample": [], - "censorCode": [] - } - ], - "name": "USGS:354133082042203:72019:00000" - } - ] - }, - "nil": false, - "globalScope": true, - "typeSubstituted": false -}`; - export const MOCK_TEMP_C_IV_DATA = `{ "name": "ns1:timeSeriesResponseType", diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/data-table.js b/assets/src/scripts/monitoring-location/components/hydrograph/data-table.js index f7762c1361d6c7afe29946498a9e98e5437b8a60..e70df0be68eef099b9336e44b1b320450d51f5b1 100644 --- a/assets/src/scripts/monitoring-location/components/hydrograph/data-table.js +++ b/assets/src/scripts/monitoring-location/components/hydrograph/data-table.js @@ -15,12 +15,12 @@ const TABLE_CAPTION = { const COLUMN_HEADINGS = { iv: ['Parameter', 'Time', 'Result', 'Approval', 'Masks'], - gw: ['Parameter', 'Time', 'Result', 'Approval'] + gw: ['Parameter', 'Time', 'Result', 'Accuracy', 'Approval', 'Qualifiers'] }; const VALUE_NAMES = { iv: ['parameterName', 'dateTime', 'result', 'approvals', 'masks'], - gw: ['parameterName', 'dateTime', 'result', 'approvals'] + gw: ['parameterName', 'dateTime', 'result', 'resultAccuracy', 'approvals', 'qualifiers'] }; const CONTAINER_ID = { diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/download-data.js b/assets/src/scripts/monitoring-location/components/hydrograph/download-data.js index e273fd268229892a0393ffc8b4f25e7b06c04e79..b11488c056bb26ac6c93786d9441b980a6d320e8 100644 --- a/assets/src/scripts/monitoring-location/components/hydrograph/download-data.js +++ b/assets/src/scripts/monitoring-location/components/hydrograph/download-data.js @@ -14,9 +14,9 @@ import {getGroundwaterServiceURL} from 'ui/web-services/groundwater-levels'; import {drawErrorAlert} from 'd3render/alerts'; import {isCalculatedTemperature} from 'ml/parameter-code-utils'; -import {getTimeRange, getPrimaryParameter} from 'ml/selectors/hydrograph-data-selector'; +import {getTimeRange} from 'ml/selectors/hydrograph-data-selector'; -import {hasVisibleIVData, hasVisibleMedianStatisticsData, hasVisibleGroundwaterLevels} from './selectors/time-series-data'; +import {hasVisibleIVData, hasVisibleMedianStatisticsData, hasVisibleGroundwaterLevels, getPrimaryParameter} from './selectors/time-series-data'; const INFO_TEXT = ` <div> @@ -68,16 +68,13 @@ const getMedianDataURL = function(store, siteno) { format: 'rdb' }); }; -const getGroundwaterLevelURL = function(store, siteno) { +const getGroundwaterLevelURL = function(store, siteno, agencyCd) { const currentState = store.getState(); const timeRange = getTimeRange('current')(currentState); return getGroundwaterServiceURL({ siteno, - parameterCode: getPrimaryParameter(currentState).parameterCode, - startTime: toISO(timeRange.start), - endTime: toISO(timeRange.end), - format: 'rdb' + agencyCd }); }; const getSiteMetaDataURL = function(siteno) { @@ -142,7 +139,7 @@ const drawRadioButtons = function(container, { * @param {Redux store} store * @param {String} siteno */ -export const drawDownloadForm = function(container, store, siteno) { +export const drawDownloadForm = function(container, store, siteno, agencyCd) { const downloadContainer = container.append('div'); const formContainer = downloadContainer.append('div') .attr('class', 'usa-form') @@ -183,7 +180,7 @@ export const drawDownloadForm = function(container, store, siteno) { downloadUrl = getMedianDataURL(store, siteno); break; case 'groundwater-levels': - downloadUrl = getGroundwaterLevelURL(store, siteno); + downloadUrl = getGroundwaterLevelURL(store, siteno, agencyCd); break; case 'site': downloadUrl = getSiteMetaDataURL(siteno); diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/index.js b/assets/src/scripts/monitoring-location/components/hydrograph/index.js index a35a6362d74f00dd8504084986f075038e9a0c7a..763e75beec466e6bfc382de51a6dfefda29fad9b 100644 --- a/assets/src/scripts/monitoring-location/components/hydrograph/index.js +++ b/assets/src/scripts/monitoring-location/components/hydrograph/index.js @@ -11,7 +11,7 @@ import {renderTimeSeriesUrlParams} from 'ml/url-params'; import {getInputsForRetrieval} from 'ml/selectors/hydrograph-state-selector'; - +import {retrieveGroundwaterLevelData} from 'ml/store/groundwater-level-field-visits'; import {retrieveHydrographData} from 'ml/store/hydrograph-data'; import {retrieveHydrographParameters} from 'ml/store/hydrograph-parameters'; import {setSelectedParameterCode, setCompareDataVisibility, setSelectedTimeSpan, @@ -87,13 +87,18 @@ export const attachToNode = function(store, // Fetch all data needed to render the hydrograph const fetchHydrographDataPromise = store.dispatch(retrieveHydrographData(siteno, agencyCd, getInputsForRetrieval(store.getState()))); + let fetchDataPromises = [fetchHydrographDataPromise]; - // if showing the controls, fetch the parameter meta data - if (!thisShowOnlyGraph) { - store.dispatch(retrieveHydrographParameters(siteno)); + // if showing only graph make a call to retrieve all of the groundwater level data. Otherwise + // this is done when retrieving all hydrograph parameter meta data. + if (thisShowOnlyGraph) { + if (config.gwPeriodOfRecord) { + fetchDataPromises.push(store.dispatch(retrieveGroundwaterLevelData(siteno, agencyCd))); + } + } else { + fetchDataPromises.push(store.dispatch(retrieveHydrographParameters(siteno, agencyCd))); } - let fetchDataPromises = [fetchHydrographDataPromise]; // Fetch flood levels if (config.ivPeriodOfRecord && config.GAGE_HEIGHT_PARAMETER_CODE in config.ivPeriodOfRecord) { const fetchFloodLevelsPromise = store.dispatch(floodDataActions.retrieveFloodLevels(siteno)); diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/select-actions.js b/assets/src/scripts/monitoring-location/components/hydrograph/select-actions.js index c52aade5fc2fb3510d624be629feae782f5c533d..2e9a72764fbe81f9118cb102aa95bd57b023c971 100644 --- a/assets/src/scripts/monitoring-location/components/hydrograph/select-actions.js +++ b/assets/src/scripts/monitoring-location/components/hydrograph/select-actions.js @@ -78,5 +78,5 @@ export const drawSelectActions = function(container, store, siteno, agencyCode) container.append('div') .attr('id', 'download-graph-data-container') .attr('hidden', true) - .call(drawDownloadForm, store, siteno); + .call(drawDownloadForm, store, siteno, agencyCode); }; diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/axes.js b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/axes.js index a4a59e06ff7f20fbf8d6fd579e0884552907b165..d9fefc641820cff172a7ee4a7779c60c1359f926 100644 --- a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/axes.js +++ b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/axes.js @@ -6,11 +6,12 @@ import config from 'ui/config'; import {generateTimeTicks} from 'd3render/tick-marks'; -import {getPrimaryParameter} from 'ml/selectors/hydrograph-data-selector'; import {getYTickDetails} from './domain'; import {getLayout} from './layout'; import {getXScale, getBrushXScale, getYScale} from './scales'; +import {getPrimaryParameter} from './time-series-data'; + const createXAxis = function(xScale) { diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/discrete-data.js b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/discrete-data.js index e7e3f20ef732559e139bdc80f444bd04bbbc0527..fc91d09acd62409453404b599e6a1bb64f1458d3 100644 --- a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/discrete-data.js +++ b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/discrete-data.js @@ -5,15 +5,35 @@ import {createSelector} from 'reselect'; import config from 'ui/config'; -import {getGroundwaterLevels, getPrimaryParameter} from 'ml/selectors/hydrograph-data-selector'; +import {getSelectedGroundwaterLevels} from 'ml/selectors/groundwater-level-field-visits-selector'; const GW_LEVEL_RADIUS = 7; const GW_LEVEL_CLASS = 'gw-level-point'; +const CENSORED_QUALIFIERS = [ + 'Dry', + 'Flowing', + 'Frozen', + 'Obstructed', + 'Measurement unable to be obtained' +]; + +const TIME_FORMAT = { + 'minute': 'y-MM-dd HH:mmZZ', + 'hour': 'y-MM-dd HHZZ', + 'day': 'y-MM-dd', + 'month': 'y-MM', + 'year': 'y' +}; + +const hasCensoredQualifiers = function(qualifiers) { + return qualifiers.findIndex(qualifier => CENSORED_QUALIFIERS.includes(qualifier)) !== -1; +}; + const APPROVAL_QUALIFIERS = { - 'A': {label: 'Approved', class: 'approved'}, - 'P': {label: 'Provisional', class: 'provisional'}, - 'R': {label: 'Revised', class: 'revised'} + 'Approved': {label: 'Approved', class: 'approved'}, + 'Provisional': {label: 'Provisional', class: 'provisional'}, + 'Revised': {label: 'Revised', class: 'revised'} }; const getDetailsForApprovalCode = function(qualifiers) { @@ -21,7 +41,7 @@ const getDetailsForApprovalCode = function(qualifiers) { if (approvalQualifier) { return APPROVAL_QUALIFIERS[approvalQualifier]; } else { - return APPROVAL_QUALIFIERS['P']; + return APPROVAL_QUALIFIERS['Provisional']; } }; @@ -37,22 +57,24 @@ const getDetailsForApprovalCode = function(qualifiers) { * @prop {Number} radius - used to draw the circle marker */ export const getGroundwaterLevelPoints = createSelector( - getGroundwaterLevels, + getSelectedGroundwaterLevels, gwLevels => { if (!gwLevels) { return []; } - return gwLevels.values.map(data => { - const approvalDetails = getDetailsForApprovalCode(data.qualifiers); - return { - displayValue: data.value, - value: data.value ? parseFloat(data.value) : null, - dateTime: data.dateTime, - classes: [GW_LEVEL_CLASS, approvalDetails.class], - label: approvalDetails.label, - radius: GW_LEVEL_RADIUS - }; - }); + return gwLevels.values + .filter(value => !hasCensoredQualifiers(value.qualifiers) || value.result) + .map(value => { + const approvalDetails = getDetailsForApprovalCode(value.approvals); + return { + value: parseFloat(value.result), + displayValue: value.result, + dateTime: value.epochTime, + classes: [GW_LEVEL_CLASS, approvalDetails.class], + label: approvalDetails.label, + radius: GW_LEVEL_RADIUS + }; + }); } ); @@ -64,16 +86,12 @@ export const getGroundwaterLevelPoints = createSelector( export const getGroundwaterLevelDataRange = createSelector( getGroundwaterLevelPoints, points => { - if (!points) { + if (!points || !points.length) { return null; } - const values = points.filter(data => data.value !== null).map(data => data.value); - if (values.length) { - return [Math.min(...values), Math.max(...values)]; - } else { - return null; - } + const values = points.map(data => data.value); + return [Math.min(...values), Math.max(...values)]; } ); @@ -104,25 +122,28 @@ export const getUniqueGWKinds = createSelector( * @return {Function} - Function returns an array of visible ground water values with properties: * @prop {String} parameterName * @prop {String} result + * @prop {String} resultAccuracy + * @prop {Number} epochTime - useful for sorting the data by time * @prop {String} dateTime in site's time zone. * @prop {String} approvals + * @prop {String} qualifiers */ export const getGroundwaterLevelsTableData = createSelector( - getPrimaryParameter, - getGroundwaterLevelPoints, - (parameter, gwLevels) => { - if (!parameter || !gwLevels) { + getSelectedGroundwaterLevels, + gwLevels => { + if (!gwLevels) { return []; } - return gwLevels.map((point) => { + return gwLevels.values.map(value => { return { - parameterName: parameter.name, - result: point.displayValue, - dateTime: DateTime.fromMillis(point.dateTime, {zone: config.locationTimeZone}).toISO({ - suppressMilliseconds: true, - suppressSeconds: true - }), - approvals: point.label + parameterName: gwLevels.parameter.name, + result: hasCensoredQualifiers(value.qualifiers) || !value.result ? 'None' : value.result, + resultAccuracy: value.resultAccuracy ? value.resultAccuracy : 'None', + epochTime: value.epochTime, + dateTime: DateTime.fromMillis(value.epochTime, {zone: config.locationTimeZone}) + .toFormat(TIME_FORMAT[value.phenomenonTimeAccuracy]), + approvals: value.approvals.join(', '), + qualifiers: value.qualifiers.join(', ') }; }); } diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/domain.js b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/domain.js index 286a10d65f6f10a2adc7bf20cea576e0755e3fef..b8401885a55637715465e7540930d1dff3d62c68 100644 --- a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/domain.js +++ b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/domain.js @@ -6,13 +6,12 @@ import config from 'ui/config'; import {mediaQuery} from 'ui/utils'; import { - getPrimaryMedianStatisticsValueRange, - getPrimaryParameter + getPrimaryMedianStatisticsValueRange } from 'ml/selectors/hydrograph-data-selector'; import {getGroundwaterLevelDataRange} from './discrete-data'; import {getIVDataRange} from './iv-data'; -import {isVisible} from './time-series-data'; +import {isVisible, getPrimaryParameter} from './time-series-data'; const Y_TICK_COUNT = 5; diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/iv-data.js b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/iv-data.js index 94927b0a934ff570cfe199f936ce9e94ffbed13f..c8f89fd7c077bca11861a41220a5c59e314b3e67 100644 --- a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/iv-data.js +++ b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/iv-data.js @@ -7,7 +7,7 @@ import {createSelector} from 'reselect'; import config from 'ui/config'; -import {getIVData, getPrimaryParameter} from 'ml/selectors/hydrograph-data-selector'; +import {getIVData, getIVPrimaryParameter} from 'ml/selectors/hydrograph-data-selector'; import {getSelectedIVMethodID} from 'ml/selectors/hydrograph-state-selector'; const MASKED_QUALIFIERS = { @@ -181,7 +181,7 @@ export const getIVDataRange = memoize(dataKind => createSelector( */ export const getIVTableData = memoize(dataKind => createSelector( getIVDataPoints(dataKind), - getPrimaryParameter, + getIVPrimaryParameter, (ivData, parameter) => { if (!ivData) { return []; diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/legend-data.js b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/legend-data.js index abf96b600e0fb263e5e8ba143e3fee4553fd9cb9..d67a8f019683e54d0c8cbed859d937000a259a1c 100644 --- a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/legend-data.js +++ b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/legend-data.js @@ -5,14 +5,14 @@ import config from 'ui/config'; import {defineLineMarker, defineRectangleMarker, defineCircleMarker, defineTextOnlyMarker} from 'd3render/markers'; import {showFloodLevels} from 'ml/selectors/flood-data-selector'; -import {getPrimaryMedianStatisticsData, getPrimaryParameter} from 'ml/selectors/hydrograph-data-selector'; +import {getPrimaryMedianStatisticsData} from 'ml/selectors/hydrograph-data-selector'; import {isCompareIVDataVisible, isMedianDataVisible} from 'ml/selectors/hydrograph-state-selector'; import {getUniqueGWKinds} from './discrete-data'; import {getFloodLevelData} from './flood-level-data'; import {getIVUniqueDataKinds, HASH_ID} from './iv-data'; import {getThresholdsInRange} from './thresholds-data'; - +import {getPrimaryParameter} from './time-series-data'; const TS_LABEL = { diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/scales.js b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/scales.js index a67cbab7079fb4a99d351afe5aaa3e9bfe7676f3..78f18247e7e122668e62b33157a3e04e59959b89 100644 --- a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/scales.js +++ b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/scales.js @@ -3,13 +3,13 @@ import memoize from 'fast-memoize'; import {createSelector} from 'reselect'; import { - getPrimaryParameter, getTimeRange } from 'ml/selectors/hydrograph-data-selector'; import {getGraphBrushOffset} from 'ml/selectors/hydrograph-state-selector'; import {SYMLOG_PARMS, getPrimaryValueRange} from './domain'; import {getLayout} from './layout'; +import {getPrimaryParameter} from './time-series-data'; const REVERSE_AXIS_PARMS = [ diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/time-series-data.js b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/time-series-data.js index cc90da84d196eb8fe46f4696d0aa66215c411693..455dcf444ee500f3b175d3cdae2819aecafe3517 100644 --- a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/time-series-data.js +++ b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/time-series-data.js @@ -4,7 +4,8 @@ import {createSelector} from 'reselect'; import config from 'ui/config'; -import {getIVData, getGroundwaterLevels, getMedianStatisticsData, getPrimaryMethods, getPrimaryParameter, +import {getSelectedGroundwaterLevels} from 'ml/selectors/groundwater-level-field-visits-selector'; +import {getIVData, getMedianStatisticsData, getPrimaryMethods, getIVPrimaryParameter, getTimeRange } from 'ml/selectors/hydrograph-data-selector'; import {getSelectedIVMethodID, isCompareIVDataVisible, isMedianDataVisible} from 'ml/selectors/hydrograph-state-selector'; @@ -12,6 +13,19 @@ import {getSelectedIVMethodID, isCompareIVDataVisible, isMedianDataVisible} from const formatTime = function(timeInMillis) { return DateTime.fromMillis(timeInMillis, {zone: config.locationTimeZone}).toFormat('L/d/yyyy tt ZZZ'); }; + +/* + * Returns a Redux selector function which returns a parameter object that describes the + * parameter that is currently displayed in the hydrograph or null if no data. + */ +export const getPrimaryParameter = createSelector( + getIVPrimaryParameter, + getSelectedGroundwaterLevels, + (ivParameter, gwLevels) => { + return ivParameter ? ivParameter : gwLevels ? gwLevels.parameter : null; + } +); + /** * Returns a Redux selector function which returns whether the dataKind time series is visible * @param {String} dataKind - 'primary', 'compare', 'median' @@ -57,7 +71,7 @@ export const hasVisibleMedianStatisticsData = createSelector( ); export const hasVisibleGroundwaterLevels = createSelector( - getGroundwaterLevels, + getSelectedGroundwaterLevels, gwLevels => gwLevels && gwLevels.values ? gwLevels.values.length > 0 : false ); diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/time-series-graph.js b/assets/src/scripts/monitoring-location/components/hydrograph/time-series-graph.js index 8bcb0586c90968af2197a79ac80b9708fd13626f..34f92f9bd9c1664977919a06206b23d2f4b6bb9c 100644 --- a/assets/src/scripts/monitoring-location/components/hydrograph/time-series-graph.js +++ b/assets/src/scripts/monitoring-location/components/hydrograph/time-series-graph.js @@ -11,7 +11,7 @@ import {renderMaskDefs} from 'd3render/data-masks'; import {appendInfoTooltip} from 'd3render/info-tooltip'; import {showFloodLevels} from 'ml/selectors/flood-data-selector'; -import {getPrimaryParameter, getPrimaryMedianStatisticsData} from 'ml/selectors/hydrograph-data-selector'; +import {getPrimaryMedianStatisticsData} from 'ml/selectors/hydrograph-data-selector'; import {getAxes} from './selectors/axes'; import {getGroundwaterLevelPoints} from './selectors/discrete-data'; @@ -19,7 +19,7 @@ import {getFloodLevelData} from './selectors/flood-level-data'; import {getIVDataSegments, HASH_ID} from './selectors/iv-data'; import {getMainLayout} from './selectors/layout'; import {getMainXScale, getMainYScale} from './selectors/scales'; -import {getTitle, getDescription, isVisible} from './selectors/time-series-data'; +import {getTitle, getDescription, isVisible, getPrimaryParameter} from './selectors/time-series-data'; import {drawGroundwaterLevels} from './discrete-data'; import {drawFloodLevelLines} from './flood-level-lines'; diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/tooltip.js b/assets/src/scripts/monitoring-location/components/hydrograph/tooltip.js index 18bc05080586570fd848933392cbad7d42f291d2..ca29db4af5934f99c6ee75c3d259bc9101842fcb 100644 --- a/assets/src/scripts/monitoring-location/components/hydrograph/tooltip.js +++ b/assets/src/scripts/monitoring-location/components/hydrograph/tooltip.js @@ -6,7 +6,6 @@ import {link} from 'ui/lib/d3-redux'; import {drawFocusOverlay, drawFocusCircles, drawFocusLine} from 'd3render/graph-tooltip'; -import {getPrimaryParameter} from 'ml/selectors/hydrograph-data-selector'; import {setGraphCursorOffset} from 'ml/store/hydrograph-state'; import {getCursorTime, getIVDataCursorPoint, getIVDataTooltipPoint, getGroundwaterLevelCursorPoint, @@ -14,6 +13,8 @@ import {getCursorTime, getIVDataCursorPoint, getIVDataTooltipPoint, getGroundwat } from './selectors/cursor'; import {getMainLayout} from './selectors/layout'; import {getMainXScale, getMainYScale} from './selectors/scales'; +import {getPrimaryParameter} from './selectors/time-series-data'; + import {drawCursorSlider} from './cursor-slider'; diff --git a/assets/src/scripts/monitoring-location/selectors/flood-data-selector.js b/assets/src/scripts/monitoring-location/selectors/flood-data-selector.js index 368d3b54f407c1433e9951b869d7c8d3d407daef..d2134caa530fd22877f80daedead52c227cd338a 100644 --- a/assets/src/scripts/monitoring-location/selectors/flood-data-selector.js +++ b/assets/src/scripts/monitoring-location/selectors/flood-data-selector.js @@ -2,7 +2,7 @@ import {createSelector} from 'reselect'; import config from 'ui/config'; -import {getPrimaryParameter} from './hydrograph-data-selector'; +import {getIVPrimaryParameter} from './hydrograph-data-selector'; export const getFloodStages = state => state.floodData.stages || []; @@ -33,7 +33,7 @@ export const hasFloodLevels = createSelector( */ export const showFloodLevels = createSelector( hasFloodLevels, - getPrimaryParameter, + getIVPrimaryParameter, (hasFloodLevels, parameter) => hasFloodLevels && parameter && parameter.parameterCode === config.GAGE_HEIGHT_PARAMETER_CODE ); diff --git a/assets/src/scripts/monitoring-location/selectors/groundwater-level-field-visits-selector.js b/assets/src/scripts/monitoring-location/selectors/groundwater-level-field-visits-selector.js new file mode 100644 index 0000000000000000000000000000000000000000..53d5aafb8bf1fd6becec742d136f8d72b5ae32f7 --- /dev/null +++ b/assets/src/scripts/monitoring-location/selectors/groundwater-level-field-visits-selector.js @@ -0,0 +1,33 @@ +import {createSelector} from 'reselect'; + +import {getTimeRange} from './hydrograph-data-selector'; +import {getSelectedParameterCode} from './hydrograph-state-selector'; + +export const getAllGroundwaterLevels = state => state.groundwaterLevelData.all; + +export const getSelectedGroundwaterLevels = createSelector( + getSelectedParameterCode, + getTimeRange('current'), + getAllGroundwaterLevels, + (parameterCode, timeRange, groundwaterLevelsData) => { + const parameterCodeDatastream = + groundwaterLevelsData.find(datastream => datastream.USGSParameterCode === parameterCode); + if (parameterCodeDatastream) { + const inTimeRangeObservations = + parameterCodeDatastream.observations.filter(observation => { + return observation.epochTime > timeRange.start && observation.epochTime < timeRange.end; + }); + return { + parameter: { + parameterCode: parameterCodeDatastream.USGSParameterCode, + name: parameterCodeDatastream.observedPropertyName, + description: parameterCodeDatastream.observedPropertyName, + unit: parameterCodeDatastream.unitOfMeasureName + }, + values: inTimeRangeObservations + }; + } else { + return null; + } + } +); diff --git a/assets/src/scripts/monitoring-location/selectors/hydrograph-data-selector.js b/assets/src/scripts/monitoring-location/selectors/hydrograph-data-selector.js index dc8eab8aa818c840e3725a319ce52fab98201b95..4ded7fc1ac3fdd4bad9787ca8f150d40ecc95552 100644 --- a/assets/src/scripts/monitoring-location/selectors/hydrograph-data-selector.js +++ b/assets/src/scripts/monitoring-location/selectors/hydrograph-data-selector.js @@ -33,25 +33,18 @@ export const getIVData = memoize((dataKind) => state => state.hydrographData[`${ */ export const getMedianStatisticsData = state => state.hydrographData.medianStatisticsData || null; -/* - * Returns a selector function which returns the groundwater levels data - * @return {Function} - */ -export const getGroundwaterLevels = state => state.hydrographData.groundwaterLevels || null; + /* * Returns a selector function which returns the parameter that the hydrographData is representing * and is an Object containing the parameter code, name, description, and unit * @return {Function} */ -export const getPrimaryParameter = createSelector( +export const getIVPrimaryParameter = createSelector( getIVData('primary'), - getGroundwaterLevels, - (ivData, gwLevels) => { + (ivData) => { let parameter = null; if (ivData) { parameter = ivData.parameter; - } else if (gwLevels) { - parameter = gwLevels.parameter; } return parameter; } diff --git a/assets/src/scripts/monitoring-location/store/groundwater-level-field-visits.js b/assets/src/scripts/monitoring-location/store/groundwater-level-field-visits.js new file mode 100644 index 0000000000000000000000000000000000000000..1e1b08b87a9d100f61b7bce75ce04412257a2195 --- /dev/null +++ b/assets/src/scripts/monitoring-location/store/groundwater-level-field-visits.js @@ -0,0 +1,88 @@ +import {DateTime} from 'luxon'; + +import config from 'ui/config'; + +import {fetchGroundwaterLevels} from 'ui/web-services/groundwater-levels'; + +const INITIAL_DATA = { + all: [] +}; +/* + * Synchronous Redux action - update the groundwater level data + * @param {Array of Objects} - Each object represents the datastreams property from + * the groundwater level field visit service. + * @return {Function} - Redux action + */ +const updateGroundwaterLevelData = function(datastreams) { + return { + type: 'UPDATE_GROUNDWATER_LEVEL_DATA', + datastreams + }; +}; + +/* + * Asynchronous Redux action - fetches the latest data for groundwater level site visits and + * updates the data + * @param {String} siteno + * @param {String} agencyCd + * @returns {Function} - which returns a Promise + */ +export const retrieveGroundwaterLevelData = function(siteno, agencyCd) { + return function(dispatch) { + return fetchGroundwaterLevels({siteno, agencyCd}).then(resp => { + /* Add Epoch time to each datastream. This way we deal with time is in one place + * Time strings with hour or minute accuracy are interpreted as UTC. + * Time strings with day, month, or year are interpreted as the start of the day in the site's local time zone. + */ + let augmentedDatastreams = []; + if (resp.properties && resp.properties.dataStreams) { + augmentedDatastreams = resp.properties.dataStreams.map(datastream => { + const augmentedObservations = datastream.observations.map(observation => { + let timeZoneToUse; + switch (observation.phenomenonTimeAccuracy) { + case 'minute': + case 'hour': + timeZoneToUse = 'utc'; + break; + case 'day': + case 'month': + case 'year': + timeZoneToUse = config.locationTimeZone; + break; + default: + timeZoneToUse = 'utc'; + } + const epochTime = DateTime.fromISO(observation.phenomenonTime, {zone: timeZoneToUse}) + .startOf(observation.phenomenonTimeAccuracy) + .toMillis(); + return { + ...observation, + epochTime: epochTime + }; + }); + //Sorts in ascending time order + return { + ...datastream, + observations: augmentedObservations.sort((a, b) => a.epochTime - b.epochTime) + }; + }); + } + dispatch(updateGroundwaterLevelData(augmentedDatastreams)); + return augmentedDatastreams; + }); + }; +}; + +/* + * Slice reducer + */ +export const groundwaterLevelDataReducer = function(data=INITIAL_DATA, action) { + switch(action.type) { + case 'UPDATE_GROUNDWATER_LEVEL_DATA': + return { + ...data, + all: action.datastreams + }; + default: return data; + } +}; \ No newline at end of file diff --git a/assets/src/scripts/monitoring-location/store/hydrograph-data.js b/assets/src/scripts/monitoring-location/store/hydrograph-data.js index dc6426be897450d94dbf98107f22a8529c496239..23d492480d13e8bac72e22c6bbedf3dc553bd10c 100644 --- a/assets/src/scripts/monitoring-location/store/hydrograph-data.js +++ b/assets/src/scripts/monitoring-location/store/hydrograph-data.js @@ -4,7 +4,6 @@ import {DateTime, Duration} from 'luxon'; import config from 'ui/config'; import {convertCelsiusToFahrenheit} from 'ui/utils'; -import {fetchGroundwaterLevels} from 'ui/web-services/groundwater-levels'; import {fetchTimeSeries} from 'ui/web-services/instantaneous-values'; import {fetchSiteStatistics} from 'ui/web-services/statistics-data'; import {fetchDataFromSensorThings} from 'ui/web-services/sensor-things'; @@ -70,20 +69,6 @@ const addMedianStatisticsData = function(statsData) { }; }; -/* - * Synchronous Redux action which sets the groundwater levels data - * @param {Object} gwLevels - * @prop {Object} parameter - * @prop {Array} values - * @return {Object} Redux action - */ -const addGroundwaterLevels = function(gwLevels) { - return { - type: 'ADD_GROUNDWATER_LEVELS', - gwLevels - }; -}; - /* * Synchronous Redux action which sets the operational limit data. This will be the maximum and minimum value that a * gage can report with accuracy for a particular observed property @@ -246,50 +231,6 @@ export const retrieveMedianStatistics = function(siteno, parameterCode) { }; }; -/* - * Asynchronous Redux action to fetch the groundwater levels data for siteno, parameterCode, period or startTime/endTime - * for the dataKind - * @param {String} siteno - * @param {String} parameterCode - * @param {String} period - ISO 8601 duration - * @param {String} startTime - ISO 8601 time string - * @param {String} endTie - ISO 8601 time string - * @return {Function} that returns a Promise - */ -const retrieveGroundwaterLevels = function(siteno, {parameterCode, period, startTime, endTime}) { - return function(dispatch) { - return fetchGroundwaterLevels({siteno, parameterCode, period, startTime, endTime}) - .then(data => { - if (data.value && data.value.timeSeries && data.value.timeSeries.length) { - let values; - const timeSeries = data.value.timeSeries[0]; - if (!timeSeries.values.length || !timeSeries.values[0].value.length) { - values = []; - } else { - values = timeSeries.values[0].value.map((v) => { - const dateTime = DateTime.fromISO(v.dateTime, {zone: 'utc'}).toMillis(); - return { - value: v.value, - qualifiers: v.qualifiers, - dateTime: dateTime - }; - }); - } - const parameter = { - parameterCode: timeSeries.variable.variableCode[0].value, - name: timeSeries.variable.variableName, - description: timeSeries.variable.variableDescription, - unit: timeSeries.variable.unit.unitCode - }; - dispatch(addGroundwaterLevels({ - parameter, - values - })); - } - }); - }; -}; - /** * Removes the unneeded data from Sensor Things and returns only the essential information for thresholds * @param {Object} properties - Complex object containing threshold data along with unneeded data returned from Sensor Things @@ -368,7 +309,6 @@ export const retrieveHydrographData = function(siteno, agencyCode, {parameterCod return function(dispatch) { const parameterToFetch = getParameterToFetch(parameterCode); const hasIVData = config.ivPeriodOfRecord && parameterToFetch in config.ivPeriodOfRecord; - const hasGWData = config.gwPeriodOfRecord && parameterToFetch in config.gwPeriodOfRecord; dispatch(clearHydrographData()); let timeRange; @@ -392,10 +332,7 @@ export const retrieveHydrographData = function(siteno, agencyCode, {parameterCod fetchPromises.push(dispatch(retrieveIVData( siteno, 'primary', {parameterCode, period, startTime, endTime}))); } - if (hasGWData) { - fetchPromises.push(dispatch( - retrieveGroundwaterLevels(siteno, {parameterCode, period, startTime, endTime}))); - } + if (hasIVData && loadCompare && ALLOW_COMPARE_FOR_DURATIONS.includes(period)) { fetchPromises.push(dispatch( retrievePriorYearIVData(siteno, { @@ -434,12 +371,6 @@ export const hydrographDataReducer = function(hydrographData = {}, action) { medianStatisticsData: action.statsData }; } - case 'ADD_GROUNDWATER_LEVELS': { - return { - ...hydrographData, - groundwaterLevels: action.gwLevels - }; - } case 'ADD_THRESHOLDS': { return { // add this to general state instead of hydrographData diff --git a/assets/src/scripts/monitoring-location/store/hydrograph-parameters.js b/assets/src/scripts/monitoring-location/store/hydrograph-parameters.js index 64d88eaf4d9e6347288dce547b6987c3eb9999f9..8674f458b48f570c017af54d03d7705090deada7 100644 --- a/assets/src/scripts/monitoring-location/store/hydrograph-parameters.js +++ b/assets/src/scripts/monitoring-location/store/hydrograph-parameters.js @@ -3,14 +3,14 @@ import merge from 'lodash/merge'; import config from 'ui/config'; -import {fetchGroundwaterLevels} from 'ui/web-services/groundwater-levels'; import {fetchTimeSeries} from 'ui/web-services/instantaneous-values'; import {getConvertedTemperatureParameter, hasMeasuredFahrenheitParameter} from 'ml/parameter-code-utils'; import {Actions as floodStateActions} from './flood-data'; +import {retrieveGroundwaterLevelData} from './groundwater-level-field-visits'; /* - * Synchronous Redux action - updatethe hydrograph variables + * Synchronous Redux action - update the hydrograph variables * @param {Object} variables - keys are parameter codes. * @return {Object} - Redux action */ @@ -25,7 +25,7 @@ const updateHydrographParameters = function(parameters) { * Asynchronous Redux action - fetches the latest value for all parameter codes and * updates the store hydrograph parameter codes. */ -export const retrieveHydrographParameters = function(siteno) { +export const retrieveHydrographParameters = function(siteno, agencyCd) { return function(dispatch) { let fetchPromises = []; if (config.ivPeriodOfRecord) { @@ -66,28 +66,21 @@ export const retrieveHydrographParameters = function(siteno) { fetchPromises.push(fetchIVParameters); } if (config.gwPeriodOfRecord) { - const fetchGWLevelParameters = fetchGroundwaterLevels({siteno: siteno}) - .then(series => { - if (series.value && series.value.timeSeries) { - return series.value.timeSeries.reduce((varsByPCode, ts) => { - const parameterCode = ts.variable.variableCode[0].value; - varsByPCode[parameterCode] = { - parameterCode: parameterCode, - name: ts.variable.variableName, - description: ts.variable.variableDescription, - unit: ts.variable.unit.unitCode, - hasGWLevelsData: true - }; - return varsByPCode; - }, {}); - } else { - return null; - } - }) - .catch(reason => { - console.error(reason); - throw reason; + const fetchGWLevelParameters = dispatch(retrieveGroundwaterLevelData(siteno, agencyCd)) + .then(datastreams => { + let gwVars = {}; + datastreams.forEach(datastream => { + gwVars[datastream.USGSParameterCode] = { + parameterCode: datastream.USGSParameterCode, + name: datastream.observedPropertyName, + description: datastream.observedPropertyName, + unit: datastream.unitOfMeasureName, + hasGWLevelsData: true + }; + }); + return gwVars; }); + fetchPromises.push(fetchGWLevelParameters); } if (fetchPromises.length) { diff --git a/assets/src/scripts/monitoring-location/store/index.js b/assets/src/scripts/monitoring-location/store/index.js index 773a32fe5b23616647f30c3bfe746281aa7e04cc..42db029d056010993894a4c1d7edcb509147946f 100644 --- a/assets/src/scripts/monitoring-location/store/index.js +++ b/assets/src/scripts/monitoring-location/store/index.js @@ -6,6 +6,7 @@ import {dailyValueTimeSeriesStateReducer as dailyValueTimeSeriesState} from './d import { floodDataReducer as floodData, floodStateReducer as floodState} from './flood-data'; +import {groundwaterLevelDataReducer as groundwaterLevelData} from './groundwater-level-field-visits'; import {hydrographDataReducer as hydrographData} from './hydrograph-data'; import {hydrographParametersReducer as hydrographParameters, initializeParameters} from './hydrograph-parameters'; @@ -20,6 +21,7 @@ const appReducer = combineReducers({ hydrographData, hydrographParameters, hydrographState, + groundwaterLevelData, dailyValueTimeSeriesData, floodData, nldiData, @@ -37,6 +39,9 @@ export const configureStore = function(initialState) { hydrographData: {}, hydrographParameters: initializeParameters(), hydrographState: HYDROGRAPH_INITIAL_STATE, + groundwaterLevelData: { + all: [] + }, dailyValueTimeSeriesData: {}, floodData: { stages: [], diff --git a/assets/src/scripts/web-services/groundwater-levels.js b/assets/src/scripts/web-services/groundwater-levels.js index 4430eec137476cabcb5cc6bb0a7f52527182bfdc..de63f3c6bc60e7a7a874e673fe4aa8570c3d97e2 100644 --- a/assets/src/scripts/web-services/groundwater-levels.js +++ b/assets/src/scripts/web-services/groundwater-levels.js @@ -1,49 +1,31 @@ import config from 'ui/config'; /** - * Formats a URL for the purpose of downloading groundwater levels data in RDB format + * Formats a URL for the purpose of downloading groundwater levels data in json format * @param {String} siteno - A code that uniquely identifies a monitoring location - * @param {String} parameterCode - USGS five digit parameter code - * @param {String} period - ISO 8601 duration in days - * @param {String} startTime - ISO 8601 time - * @param {String} endTime- ISO 8601 time - * @param {String} format - The format of the data returned from the water services API, such as 'json' or 'rdb' + * @param {String} agencyCd - A code for the agency + * @param {String} format - The format of the data returned from the API, such as 'json' or 'rdb' * @return {String} The URL used to contact waterservices.usgs.gov */ -export const getGroundwaterServiceURL = function({ - siteno, - parameterCode = null, - period = null, - startTime = null, - endTime = null, - format - }) { - const parameterCodeQuery = parameterCode ? `¶meterCd=${parameterCode}` : ''; - let timeQuery; - if (period) { - timeQuery = `&period=${period}`; - } else { - timeQuery = startTime && endTime ? `&startDT=${startTime}&endDT=${endTime}` : ''; - } - return `${config.GROUNDWATER_LEVELS_ENDPOINT}?sites=${siteno}${parameterCodeQuery}${timeQuery}&format=${format}`; +export const getGroundwaterServiceURL = function( + { + siteno, + agencyCd, + format + }) { + return `${config.GROUNDWATER_LEVELS_ENDPOINT}?featureId=${agencyCd}-${siteno}&type=discrete&domain=groundwater_levels&f=${format}`; }; /** * Fetch the groundwater levels for site, parameterCode, and period - * @param {String} sites - * @param {String} parameterCode - * @param {String} period - ISO-8601 Duration in days. - * @param {String} startTime - ISO-8601 time format - * @param {String} endTime - ISO-8601 time format + * @param {String} siteno + * @param {String} agencyCd * @return {Promise} resolves to Object that is retrieved with ground water levels */ -export const fetchGroundwaterLevels = async function({siteno, parameterCode=null, period=null, startTime=null, endTime=null}) { +export const fetchGroundwaterLevels = async function({siteno, agencyCd}) { const url = getGroundwaterServiceURL({ siteno: siteno, - parameterCode: parameterCode, - period: period, - startTime: startTime, - endTime: endTime, + agencyCd: agencyCd, format: 'json' }); const request = new Request(url, { diff --git a/assets/src/scripts/web-services/groundwater-levels.test.js b/assets/src/scripts/web-services/groundwater-levels.test.js index 0c21f5d87228b4d9af1dbe8e81ac25e4c011d20c..ef85901850556ee13a13a8ebdb81fc7a53e83907 100644 --- a/assets/src/scripts/web-services/groundwater-levels.test.js +++ b/assets/src/scripts/web-services/groundwater-levels.test.js @@ -1,7 +1,7 @@ import {enableFetchMocks, disableFetchMocks} from 'jest-fetch-mock'; import mockConsole from 'jest-mock-console'; -import {MOCK_GWLEVEL_DATA} from 'ui/mock-service-data'; +import {MOCK_GW_FIELD_VISITS} from 'ui/mock-gw-field-visits'; import {getGroundwaterServiceURL, fetchGroundwaterLevels} from './groundwater-levels'; @@ -19,74 +19,21 @@ describe('web-services/groundwater-levels', () => { }); describe('getGroundwaterServiceURL', () => { - it('Expects site no and format parameters but no others', () => { + it('Expects site no, agencyCd and format parameters', () => { const result = getGroundwaterServiceURL({ siteno: '11112222', - format: 'rdb' + agencyCd: 'USGS', + format: 'json' }); - expect(result).toContain('sites=11112222'); - expect(result).toContain('format=rdb'); - expect(result).not.toContain('parameterCd'); - expect(result).not.toContain('period'); - expect(result).not.toContain('startDT'); - expect(result).not.toContain('endDT'); - }); - - it('Expects defined parameter code and period will appear in the URL', () => { - const result = getGroundwaterServiceURL({ - siteno: '11112222', - parameterCode: '72019', - period: 'P30D', - format: 'rdb' - }); - expect(result).toContain('sites=11112222'); - expect(result).toContain('format=rdb'); - expect(result).toContain('parameterCd=72019'); - expect(result).toContain('period=P30D'); - expect(result).not.toContain('startDT'); - expect(result).not.toContain('endDT'); - }); - - it('Expects period will appear in the URL even if startTime and endTime are specified', () => { - const result = getGroundwaterServiceURL({ - siteno: '11112222', - parameterCode: '72019', - period: 'P45D', - startTime: '2020-01-03', - endTime: '20202-01-15', - format: 'rdb' - }); - expect(result).toContain('sites=11112222'); - expect(result).toContain('format=rdb'); - expect(result).toContain('parameterCd=72019'); - expect(result).toContain('period=P45D'); - expect(result).not.toContain('startDT'); - expect(result).not.toContain('endDT'); - }); - - it('Expects startTime and endTime in the URL if period is not specified', () => { - const result = getGroundwaterServiceURL({ - siteno: '11112222', - parameterCode: '72019', - startTime: '2020-01-03', - endTime: '2020-01-15', - format: 'rdb' - }); - expect(result).toContain('sites=11112222'); - expect(result).toContain('format=rdb'); - expect(result).toContain('parameterCd=72019'); - expect(result).not.toContain('period'); - expect(result).toContain('startDT=2020-01-03'); - expect(result).toContain('endDT=2020-01-15'); + expect(result).toContain('featureId=USGS-11112222'); + expect(result).toContain('f=json'); }); }); describe('fetchGroundwaterLevels', () => { const fetchParameters = { - siteno: '354133082042203', - parameterCode: '72019', - startTime: '2020-01-01', - endTime: '2020-11-17' + siteno: '413703087230501', + agencyCd: 'USGS' }; beforeEach(() => { @@ -98,44 +45,15 @@ describe('web-services/groundwater-levels', () => { expect(fetch.mock.calls).toHaveLength(1); const url = fetch.mock.calls[0][0].url; - expect(url).toContain(`sites=${fetchParameters.siteno}`); - expect(url).toContain(`parameterCd=${fetchParameters.parameterCode}`); - expect(url).not.toContain('period'); - expect(url).toContain(`startDT=${fetchParameters.startTime}`); - expect(url).toContain(`endDT=${fetchParameters.endTime}`); - expect(url).toContain('format=json'); - }); - - it('expects period to be in query parameters if no startDT and endDT', () => { - fetchGroundwaterLevels({ - siteno: '354133082042203', - parameterCode: '72019', - period: 'P7D' - }); - const url = fetch.mock.calls[0][0].url; - - expect(url).toContain('period=P7D'); - expect(url).not.toContain('startDT'); - expect(url).not.toContain('endDT'); - }); - - it('expect no time parameters if all are null', () => { - fetchGroundwaterLevels({ - site: '354133082042203', - parameterCode: '72019' - }); - - const url = fetch.mock.calls[0][0].url; - expect(url).not.toContain('period'); - expect(url).not.toContain('startDT'); - expect(url).not.toContain('endDT'); + expect(url).toContain(`featureId=${fetchParameters.agencyCd}-${fetchParameters.siteno}`); + expect(url).toContain('f=json'); }); it('Successful fetch returns a JSON object with ground water levels', async() => { - fetch.once(MOCK_GWLEVEL_DATA, {status: 200}); + fetch.once(MOCK_GW_FIELD_VISITS, {status: 200}); const resp = await fetchGroundwaterLevels(fetchParameters); - expect(resp).toEqual(JSON.parse(MOCK_GWLEVEL_DATA)); + expect(resp).toEqual(JSON.parse(MOCK_GW_FIELD_VISITS)); }); it('Bad fetch returns an empty object', async() => { diff --git a/wdfn-server/config.py b/wdfn-server/config.py index c6f71e237e06ce2f8d59d990dd8606eba538fce8..906913e18941aa3bf1b53f8b997cfb4cdb230cd9 100644 --- a/wdfn-server/config.py +++ b/wdfn-server/config.py @@ -23,7 +23,7 @@ PUBLIC_SITE_DATA_ENDPOINT = 'https://waterservices.usgs.gov/nwis/site' IV_DATA_ENDPOINT = 'https://waterservices.usgs.gov/nwis/iv' HISTORICAL_IV_DATA_ENDPOINT = 'https://nwis.waterservices.usgs.gov/nwis/iv' STATISTICS_ENDPOINT = 'https://waterservices.usgs.gov/nwis/stat' -GROUNDWATER_LEVELS_ENDPOINT = 'https://waterservices.usgs.gov/nwis/gwlevels/' +GROUNDWATER_LEVELS_ENDPOINT = 'https://labs.waterdata.usgs.gov/api/observations/data' MONITORING_LOCATIONS_OBSERVATIONS_ENDPOINT = 'https://labs.waterdata.usgs.gov/api/observations/collections/' SENSOR_THINGS_ENDPOINT = 'https://labs.waterdata.usgs.gov/sta/v1.1/' SIMS_ENDPOINT = ''