diff --git a/public/js/appCesium.js b/public/js/appCesium.js index 2d355aa9dcd1049fde42aa096a8d1a2f39eb1a53..d49aa6edba43e76fb081f677a2a508349b1f6bbf 100644 --- a/public/js/appCesium.js +++ b/public/js/appCesium.js @@ -1,5 +1,25 @@ "use strict"; +// Functions +import { + getDatastreamIdFromBuildingNumber, + getObservationsUrl, + createTemporalFilterString, + formatSTAResponseForHeatMap, + drawHeatMapHC, + formatSTAResponseForLineChart, + drawLineChartHC, + followNextLink, +} from "./appChart.js"; + +// Constants +import { + BASE_URL, + PARAM_RESULT_FORMAT, + PARAM_ORDER_BY, + PARAM_SELECT, +} from "./appChart.js"; + Cesium.Ion.defaultAccessToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIyODgxYzJlNi1kNDZiLTQ3ZmQtYmUxYy0yMWI0OGM3NDA5MzAiLCJpZCI6NDczOSwic2NvcGVzIjpbImFzciIsImdjIl0sImlhdCI6MTU0MTUyMzU0MX0.shj2hM3pvsvcmE_wMb2aBDuk_cKWmFmbolltInGImwU"; @@ -269,6 +289,57 @@ const activate3DTileFeaturePicking = function () { </tbody> </table> `; + + const clickedBuilding = pickedFeature.getProperty("_gebaeude"); + const clickedBuildingDatastreamId = getDatastreamIdFromBuildingNumber( + clickedBuilding, + "vl", + "60min" + ); + + const BASE_URL_OBSERVATIONS = getObservationsUrl( + BASE_URL, + clickedBuildingDatastreamId + ); + const PARAM_FILTER = createTemporalFilterString("2020-01-01", "2021-01-01"); + + const axiosGetRequest = axios.get(BASE_URL_OBSERVATIONS, { + params: { + "$resultFormat": PARAM_RESULT_FORMAT, + "$orderBy": PARAM_ORDER_BY, + "$filter": PARAM_FILTER, + "$select": PARAM_SELECT, + }, + }); + + // Get "ALL" the Observations that satisfy our query + followNextLink(axiosGetRequest) + .then((success) => { + const successValue = success.data.value; + + // Array that will hold the combined observations + const combinedObservations = []; + + successValue.forEach((dataObj) => { + // Each page of results will have a dataArray that holds the observations + const dataArrays = dataObj.dataArray; + + combinedObservations.push(...dataArrays); + }); + // DEBUG: Check total number of observations + console.log(combinedObservations.length); + // DEBUG: Print the array of observations + console.log(combinedObservations); + + return combinedObservations; + }) + .catch((err) => { + console.log(err); + }) + .then((observationArr) => { + drawHeatMapHC(formatSTAResponseForHeatMap(observationArr)); + drawLineChartHC(formatSTAResponseForLineChart(observationArr)); + }); }, Cesium.ScreenSpaceEventType.LEFT_CLICK); }; diff --git a/public/js/appChart.js b/public/js/appChart.js index fcc06e4702eadada37f44b51cef03d10170380e4..22395724b5901b2fd56930b316f30f9ad039e69e 100644 --- a/public/js/appChart.js +++ b/public/js/appChart.js @@ -4,9 +4,9 @@ // Observations WITHOUT data gap - Bau 225 / Datastream ID = 80 // Observations WITH data gap - Bau 112 / Datastream ID = 78 -const BASE_URL = "http://193.196.39.91:8080/frost-icity-tp31/v1.1"; +export const BASE_URL = "http://193.196.39.91:8080/frost-icity-tp31/v1.1"; -const getDatastreamIdFromBuildingNumber = function ( +export const getDatastreamIdFromBuildingNumber = function ( buildingNumber, phenomenon, samplingRate @@ -77,9 +77,9 @@ const getDatastreamIdFromBuildingNumber = function ( * @param {Number} datastreamID - Integer representing the Datastream ID * @returns {String} URL string for fetching the Observations corresponding to a Datastream */ -const getObservationsUrl = function (datastreamID) { +export const getObservationsUrl = function (baseUrl, datastreamID) { if (!datastreamID) return; - const fullDatastreamURL = `${BASE_URL}/Datastreams(${datastreamID})/Observations`; + const fullDatastreamURL = `${baseUrl}/Datastreams(${datastreamID})/Observations`; return fullDatastreamURL; }; @@ -89,33 +89,33 @@ const getObservationsUrl = function (datastreamID) { * @param {String} dateStop Stop date in YYYY-MM-DD format * @returns {String} Temporal filter string */ -const createTemporalFilterString = function (dateStart, dateStop) { +export const createTemporalFilterString = function (dateStart, dateStop) { if (!dateStart || !dateStop) return; const filterString = `resultTime ge ${dateStart}T00:00:00.000Z and resultTime le ${dateStop}T00:00:00.000Z`; return filterString; }; -const BASE_URL_OBSERVATIONS = getObservationsUrl(80); -const PARAM_RESULT_FORMAT = "dataArray"; -const PARAM_ORDER_BY = "phenomenonTime asc"; -const PARAM_FILTER = createTemporalFilterString("2020-01-01", "2021-01-01"); -const PARAM_SELECT = "result,phenomenonTime"; +// const BASE_URL_OBSERVATIONS = getObservationsUrl(80); +export const PARAM_RESULT_FORMAT = "dataArray"; +export const PARAM_ORDER_BY = "phenomenonTime asc"; +// const PARAM_FILTER = createTemporalFilterString("2020-01-01", "2021-01-01"); +export const PARAM_SELECT = "result,phenomenonTime"; -const axiosGetRequest = axios.get(BASE_URL_OBSERVATIONS, { - params: { - "$resultFormat": PARAM_RESULT_FORMAT, - "$orderBy": PARAM_ORDER_BY, - "$filter": PARAM_FILTER, - "$select": PARAM_SELECT, - }, -}); +// const axiosGetRequest = axios.get(BASE_URL_OBSERVATIONS, { +// params: { +// "$resultFormat": PARAM_RESULT_FORMAT, +// "$orderBy": PARAM_ORDER_BY, +// "$filter": PARAM_FILTER, +// "$select": PARAM_SELECT, +// }, +// }); /** * Format the response from SensorThings API to make it suitable for heatmap * @param {Array} obsArray Response from SensorThings API as array * @returns {Array} Array of formatted observations suitable for use in a heatmap */ -const formatSTAResponseForHeatMap = function (obsArray) { +export const formatSTAResponseForHeatMap = function (obsArray) { const dataSTAFormatted = []; obsArray.forEach((obs) => { // Get the date/time string; first element in input array; remove trailing "Z" @@ -141,7 +141,7 @@ const formatSTAResponseForHeatMap = function (obsArray) { * @param {Array} obsArray Response from SensorThings API * @returns {Object} Highcharts library heatmap object */ -const drawHeatMapHC = function (obsArray) { +export const drawHeatMapHC = function (formattedObsArrayForHeatmap) { Highcharts.chart("chart-heatmap", { chart: { type: "heatmap", @@ -215,7 +215,7 @@ const drawHeatMapHC = function (obsArray) { series: [ { - data: formatSTAResponseForHeatMap(obsArray), + data: formattedObsArrayForHeatmap, boostThreshold: 100, borderWidth: 0, nullColor: "#525252", @@ -236,7 +236,7 @@ const drawHeatMapHC = function (obsArray) { * @param {Array} obsArray Response from SensorThings API as array * @returns {Array} Array of formatted observations suitable for use in a line chart */ -const formatSTAResponseForLineChart = function (obsArray) { +export const formatSTAResponseForLineChart = function (obsArray) { const dataSTAFormatted = []; obsArray.forEach((result) => { const timestampObs = new Date(result[0].slice(0, -1)).getTime(); // slice() removes trailing "Z" character in timestamp @@ -251,7 +251,7 @@ const formatSTAResponseForLineChart = function (obsArray) { * @param {Array} obsArray - Response from SensorThings API * @returns {Object} Highcharts library line chart object */ -const drawLineChartHC = function (obsArray) { +export const drawLineChartHC = function (formattedObsArrayForLineChart) { // Create the chart Highcharts.stockChart("chart-line", { chart: { @@ -269,7 +269,7 @@ const drawLineChartHC = function (obsArray) { series: [ { name: "AAPL", - data: formatSTAResponseForLineChart(obsArray), + data: formattedObsArrayForLineChart, tooltip: { valueDecimals: 2, }, @@ -286,7 +286,7 @@ const drawLineChartHC = function (obsArray) { * @param {Object} responsePromise Promise object * @returns {Object} - Object containing results from all the "@iot.nextLink" links */ -const followNextLink = function (responsePromise) { +export const followNextLink = function (responsePromise) { return responsePromise .then(function (lastSuccess) { if (lastSuccess.data["@iot.nextLink"]) { @@ -308,30 +308,30 @@ const followNextLink = function (responsePromise) { }; // Get "ALL" the Observations that satisfy our query -followNextLink(axiosGetRequest) - .then((success) => { - const successValue = success.data.value; +// followNextLink(axiosGetRequest) +// .then((success) => { +// const successValue = success.data.value; - // Array that will hold the combined observations - const combinedObservations = []; +// // Array that will hold the combined observations +// const combinedObservations = []; - successValue.forEach((dataObj) => { - // Each page of results will have a dataArray that holds the observations - const dataArrays = dataObj.dataArray; +// successValue.forEach((dataObj) => { +// // Each page of results will have a dataArray that holds the observations +// const dataArrays = dataObj.dataArray; - combinedObservations.push(...dataArrays); - }); - // DEBUG: Check total number of observations - console.log(combinedObservations.length); - // DEBUG: Print the array of observations - console.log(combinedObservations); +// combinedObservations.push(...dataArrays); +// }); +// // DEBUG: Check total number of observations +// console.log(combinedObservations.length); +// // DEBUG: Print the array of observations +// console.log(combinedObservations); - return combinedObservations; - }) - .catch((err) => { - console.log(err); - }) - .then((observationArr) => { - drawHeatMapHC(observationArr); - drawLineChartHC(observationArr); - }); +// return combinedObservations; +// }) +// .catch((err) => { +// console.log(err); +// }) +// .then((observationArr) => { +// drawHeatMapHC(observationArr); +// drawLineChartHC(observationArr); +// });