const http = require('http'); const fs = require('fs'); const express = require('express') const app = express(); // const bodyParser = require('body-parser') // const soap = require('soap'); // app.use(bodyParser.urlencoded({ extended: false })) // app.use(bodyParser.json()) // const request_ajax = require('ajax-request'); // const request = require('request'); // const got = require('got'); const axios = require('axios'); const polycalc = require('./codepoly.js'); // const { isEmptyObject } = require('jquery'); //console.log(polycalc) app.use(express.static('vcm')); app.listen(process.env.PORT || 8081); console.log("on 8081"); var minutesDifference var hoursDifference var secondsDifference var daysDifference function timeDifference(date11, date22) { var date2 = new Date(date11); var date1 = new Date(date22); var difference = date1 - date2 daysDifference = Math.floor(difference / 1000 / 60 / 60 / 24); difference -= daysDifference * 1000 * 60 * 60 * 24 hoursDifference = Math.floor(difference / 1000 / 60 / 60); difference -= hoursDifference * 1000 * 60 * 60 minutesDifference = Math.floor(difference / 1000 / 60); difference -= minutesDifference * 1000 * 60 secondsDifference = Math.floor(difference / 1000); console.log('difference = ' + daysDifference + ' day/s ' + hoursDifference + ' hour/s ' + minutesDifference + ' minute/s ' + secondsDifference + ' second/s '); } function timeDifference1(date11, date22) { var date2 = new Date(date11); var date1 = new Date(date22); var difference = date1 - date2 var minutesDifference1 var hoursDifference1 var secondsDifference1 var daysDifference1 daysDifference1 = Math.floor(difference / 1000 / 60 / 60 / 24); difference -= daysDifference1 * 1000 * 60 * 60 * 24 hoursDifference1 = Math.floor(difference / 1000 / 60 / 60); difference -= hoursDifference1 * 1000 * 60 * 60 minutesDifference1 = Math.floor(difference / 1000 / 60); difference -= minutesDifference1 * 1000 * 60 secondsDifference1 = Math.floor(difference / 1000); console.log('difference = ' + daysDifference1 + ' day/s ' + hoursDifference1 + ' hour/s ' + minutesDifference1 + ' minute/s ' + secondsDifference1 + ' second/s '); var result = { "daysDifference": daysDifference1, "hoursDifference": hoursDifference1, "minutesDifference": minutesDifference1, "secondsDifference": secondsDifference1 } return (result); } //=========================================================================================================================== //Final Version //=========================================================================================================================== // ---- Traffic Flow ---- // - 3Parts - 48.7823,9.1807,919 // - get request from the html page app.get('/TrafficFlow', async (req, res) => { console.log('command angekommen!') try { let APIout = await flow_getApiResponse('https://traffic.ls.hereapi.com/traffic/6.2/flow.json?prox=48.7544,9.1768,8745&responseattributes=sh%2Cfc&apiKey=9Grm-6B7VRvxAnbf2eKw29gR-9uuJP8VaXXYR8LK93Y'); console.log(APIout) let json_tf = await flow_buildTFLOWJson(APIout); console.log(json_tf) var json_tfs = { "name": "flow" + "01", "type": "FeatureCollection", "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, "features": json_tf }; res.json(json_tfs) } catch (error) { console.log(error) } }); // - request from the here API function flow_getApiResponse(url) { return new Promise(function (resolve, reject) { axios.get(url) .then(function (response) { // handle success console.log(response.data); resolve(response.data); }) .catch(function (error) { // handle error console.log(error); reject(error); }); }); } // - build geojson from response function flow_buildTFLOWJson(inputData) { return new Promise(function (resolve, reject) { try { var json_tflow = inputData var JsonFeature = []; console.log(json_tflow.RWS[0].RW.length + "---- in flow func") var length = json_tflow.RWS[0].RW.length; var fik // console.log(length); for (var i = 0; i <= length - 1; i++) { var FIlength = json_tflow.RWS[0].RW[i].FIS[0].FI.length console.log("i - " + i) var mid = json_tflow.RWS[0].RW[i].mid; var LI = json_tflow.RWS[0].RW[i].LI; var DE = json_tflow.RWS[0].RW[i].DE; var PBT = json_tflow.RWS[0].RW[i].PBT; for (var m = 0; m <= FIlength - 1; m++) { console.log("k - " + m) var shplength = json_tflow.RWS[0].RW[i].FIS[0].FI[m].SHP.length; console.log("FI - " + json_tflow.RWS[0].RW[i].FIS[0].FI[m]) fik = json_tflow.RWS[0].RW[i].FIS[0].FI[m] // var type = accident.body.TRAFFIC_ITEMS.TRAFFIC_ITEM[i].TRAFFIC_ITEM_TYPE_DESC; var TMC = json_tflow.RWS[0].RW[i].FIS[0].FI[m].TMC; var CF = json_tflow.RWS[0].RW[i].FIS[0].FI[m].CF[0]; console.log("Shp length - " + json_tflow.RWS[0].RW[i].FIS[0].FI[m].SHP.length) console.log("Shp length - " + shplength) var locationshp = []; for (var j = 0; j <= shplength - 1; j++) { console.log("j - " + j) console.log("RWS - " + json_tflow.RWS[0]) console.log("RW - " + json_tflow.RWS[0].RW[i]) console.log("FIS - " + json_tflow.RWS[0].RW[i].FIS[0]) console.log("FIk - " + fik) console.log("FI - " + json_tflow.RWS[0].RW[i].FIS[0].FI[m]) console.log("shape j - " + fik.SHP[j]) var value = fik.SHP[j].value[0]; // console.log(value[0]) var splitvalue = []; splitvalue = value.split(" "); // console.log(splitvalue.length) var coord = []; for (var k = 0; k <= splitvalue.length - 2; k++) { var latlon = []; latlon = splitvalue[k].split(","); var lat = latlon[0]; var lon = latlon[1]; coord.push([parseFloat(lon), parseFloat(lat)]) } // var FC = accident.body.TRAFFIC_ITEMS.TRAFFIC_ITEM[i].LOCATION.GEOLOC.ORIGIN.LONGITUDE; locationshp.push(coord) // console.log(value) } if (CF.JF) { // console.log("CF.JF -- " + CF.JF) } if ((CF.JF >= 3)) { JsonFeature.push({ "type": "Feature", "properties": { "id": mid, "name": "linestring", "LI": LI, "DE": DE, "PBT": PBT, "TMC": TMC, "CF": CF }, "geometry": { "type": "MultiLineString", "coordinates": locationshp }, "vcsMeta": { "style": { "type": "vector", "stroke": { "color": [ 153, 0, 0, 1 ], "width": 2, "lineDash": null } } } }) } else if ((CF.JF < 3 && CF.JF >= 2)) { JsonFeature.push({ "type": "Feature", "properties": { "id": mid, "name": "linestring", "LI": LI, "DE": DE, "PBT": PBT, "TMC": TMC, "CF": CF }, "geometry": { "type": "MultiLineString", "coordinates": locationshp }, "vcsMeta": { "style": { "type": "vector", "stroke": { "color": [ 255, 153, 51, 1 ], "width": 2, "lineDash": null } } } }) } else if ((CF.JF < 2 && CF.JF >= 1)) { JsonFeature.push({ "type": "Feature", "properties": { "id": mid, "name": "linestring", "LI": LI, "DE": DE, "PBT": PBT, "TMC": TMC, "CF": CF }, "geometry": { "type": "MultiLineString", "coordinates": locationshp }, "vcsMeta": { "style": { "type": "vector", "stroke": { "color": [ 230, 230, 0, 1 ], "width": 2, "lineDash": null } } } }) } else if ((CF.JF < 1)) { JsonFeature.push({ "type": "Feature", "properties": { "id": mid, "name": "linestring", "LI": LI, "DE": DE, "PBT": PBT, "TMC": TMC, "CF": CF }, "geometry": { "type": "MultiLineString", "coordinates": locationshp }, "vcsMeta": { "style": { "type": "vector", "stroke": { "color": [ 0, 153, 0, 1 ], "width": 2, "lineDash": null } } } }) } }; }; resolve(JsonFeature) } catch (error) { reject(error) } }); }; // ---- Accidents ---- // - 3Parts - // - get request from the html page app.get('/CONSTRUCTION', async (req, res) => { console.log('Construction angekommen!') try { let APIout = await CON_getApiResponse('https://traffic.ls.hereapi.com/traffic/6.3/incidents.json?apiKey=9Grm-6B7VRvxAnbf2eKw29gR-9uuJP8VaXXYR8LK93Y&bbox=48.790,9.139;48.771,9.239'); let json_con = await CON_buildTFLOWJson(APIout, "CONSTRUCTION"); // console.log(json_con) var json_cons = { "name": "incident" + "01", "type": "FeatureCollection", "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, "features": json_con }; res.json(json_cons) } catch (error) { console.log(error) } }); app.get('/ROAD_CLOSURE', async (req, res) => { console.log('Construction angekommen!') try { let APIout = await CON_getApiResponse('https://traffic.ls.hereapi.com/traffic/6.3/incidents.json?apiKey=9Grm-6B7VRvxAnbf2eKw29gR-9uuJP8VaXXYR8LK93Y&bbox=48.790,9.139;48.771,9.239'); let json_con = await CON_buildTFLOWJson(APIout, "ROAD_CLOSURE"); // console.log(json_con) var json_cons = { "name": "incident" + "01", "type": "FeatureCollection", "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, "features": json_con }; res.json(json_cons) } catch (error) { console.log(error) } }); // - request from the here API function CON_getApiResponse(url) { return new Promise(function (resolve, reject) { console.log(url) axios.get(url) .then(function (response) { // handle success // console.log(response.data); resolve(response.data); }) .catch(function (error) { // handle error // console.log(error); reject(error); }); }); } // - build geojson from response function CON_buildTFLOWJson(inputData, type) { return new Promise(function (resolve, reject) { try { var JsonFeature = []; var json_acc = inputData var length = json_acc.TRAFFIC_ITEMS.TRAFFIC_ITEM.length; // console.log(length) for (var i = 0; i <= length - 1; i++) { //console.log(json_acc.TRAFFIC_ITEMS.TRAFFIC_ITEM[i]) var lat = json_acc.TRAFFIC_ITEMS.TRAFFIC_ITEM[i].LOCATION.GEOLOC.ORIGIN.LATITUDE; var lon = json_acc.TRAFFIC_ITEMS.TRAFFIC_ITEM[i].LOCATION.GEOLOC.ORIGIN.LONGITUDE; // var type = json_acc.TRAFFIC_ITEMS.TRAFFIC_ITEM[i].TRAFFIC_ITEM_TYPE_DESC; var id = json_acc.TRAFFIC_ITEMS.TRAFFIC_ITEM[i].TRAFFIC_ITEM_ID; var origid = json_acc.TRAFFIC_ITEMS.TRAFFIC_ITEM[i].ORIGINAL_TRAFFIC_ITEM_ID; var TRAFFIC_ITEM_DESCRIPTION = json_acc.TRAFFIC_ITEMS.TRAFFIC_ITEM[i].TRAFFIC_ITEM_DESCRIPTION; var COMMENTS = json_acc.TRAFFIC_ITEMS.TRAFFIC_ITEM[i].COMMENTS; var CRITICALITY = json_acc.TRAFFIC_ITEMS.TRAFFIC_ITEM[i].CRITICALITY; var VERIFIED = json_acc.TRAFFIC_ITEMS.TRAFFIC_ITEM[i].VERIFIED; var TRAFFIC_ITEM_TYPE_DESC = json_acc.TRAFFIC_ITEMS.TRAFFIC_ITEM[i].TRAFFIC_ITEM_TYPE_DESC; console.log(TRAFFIC_ITEM_TYPE_DESC) var TRAFFIC_ITEM_STATUS_SHORT_DESC = json_acc.TRAFFIC_ITEMS.TRAFFIC_ITEM[i].TRAFFIC_ITEM_STATUS_SHORT_DESC; var TRAFFIC_ITEM_DETAIL = json_acc.TRAFFIC_ITEMS.TRAFFIC_ITEM[i].TRAFFIC_ITEM_DETAIL; var START_TIME = json_acc.TRAFFIC_ITEMS.TRAFFIC_ITEM[i].START_TIME; var LOCATION = json_acc.TRAFFIC_ITEMS.TRAFFIC_ITEM[i].LOCATION; var ENTRY_TIME = json_acc.TRAFFIC_ITEMS.TRAFFIC_ITEM[i].ENTRY_TIME; var END_TIME = json_acc.TRAFFIC_ITEMS.TRAFFIC_ITEM[i].END_TIME; var ABBREVIATION = json_acc.TRAFFIC_ITEMS.TRAFFIC_ITEM[i].ABBREVIATION; if (type == 'CONSTRUCTION') { // console.log(i) if (TRAFFIC_ITEM_TYPE_DESC == "CONSTRUCTION") { JsonFeature.push({ "type": "Feature", "properties": { "id": id, "name": "datapoint", "original_traffic_id": origid, "TRAFFIC_ITEM_DESCRIPTION": TRAFFIC_ITEM_DESCRIPTION, "COMMENTS": COMMENTS, "CRITICALITY": CRITICALITY, "VERIFIED": VERIFIED, "TRAFFIC_ITEM_TYPE_DESC": TRAFFIC_ITEM_TYPE_DESC, "TRAFFIC_ITEM_STATUS_SHORT_DESC": TRAFFIC_ITEM_STATUS_SHORT_DESC, "TRAFFIC_ITEM_DETAIL": TRAFFIC_ITEM_DETAIL, "START_TIME": START_TIME, "LOCATION": LOCATION, "ENTRY_TIME": ENTRY_TIME, "END_TIME": END_TIME, "ABBREVIATION": ABBREVIATION }, "geometry": { "type": "MultiPoint", "coordinates": [ [lon, lat] ] } }) } } else if (type == "ROAD_CLOSURE") { if (TRAFFIC_ITEM_TYPE_DESC == "ROAD_CLOSURE") { JsonFeature.push({ "type": "Feature", "properties": { "id": id, "name": "datapoint", "original_traffic_id": origid, "TRAFFIC_ITEM_DESCRIPTION": TRAFFIC_ITEM_DESCRIPTION, "COMMENTS": COMMENTS, "CRITICALITY": CRITICALITY, "VERIFIED": VERIFIED, "TRAFFIC_ITEM_TYPE_DESC": TRAFFIC_ITEM_TYPE_DESC, "TRAFFIC_ITEM_STATUS_SHORT_DESC": TRAFFIC_ITEM_STATUS_SHORT_DESC, "TRAFFIC_ITEM_DETAIL": TRAFFIC_ITEM_DETAIL, "START_TIME": START_TIME, "LOCATION": LOCATION, "ENTRY_TIME": ENTRY_TIME, "END_TIME": END_TIME, "ABBREVIATION": ABBREVIATION }, "geometry": { "type": "MultiPoint", "coordinates": [ [lon, lat] ] } }) } } } resolve(JsonFeature) } catch (error) { reject(error) } }); }; // ---- Navpoint ---- // - receive coordinates and return a geojson app.get('/addPoint', async (req, res) => { try { var data = req.query; console.log(data) var Punktadd = { "type": "FeatureCollection", "name": "data_point", "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, "features": [{ "type": "Feature", "properties": { "id": null, "name": "datapoint", "loc": data.sloc }, "geometry": { "type": "Point", "coordinates": [ parseFloat(parseFloat(data.slon).toFixed(7)), parseFloat(parseFloat(data.slat).toFixed(7)) ] } }] } res.json(Punktadd); } catch (error) { console.log(error) } }); // http://localhost:8083/Routecalc2?slat=48.68997020356071&slon=9.202611390575258&sloc=Start&elat=48.726559406813294&elon=9.113775973868089&eloc=End // ---- Route Berechnen Test ---- app.get('/Routecalc2', async (req, res) => { console.log('command angekommen ////// Route/////!') const pointData = req.query; console.log(pointData); try { let APIout = await CON_getApiResponse('https://router.hereapi.com/v8/routes?transportMode=car&origin=' + pointData.slat + ',' + pointData.slon + '&destination=' + pointData.elat + ',' + pointData.elon + '&return=polyline&apiKey=9Grm-6B7VRvxAnbf2eKw29gR-9uuJP8VaXXYR8LK93Y'); console.log(APIout) let json_route = await Route_buildJson(APIout); console.log(json_route) var json_routes = { "name": "navcar" + "01", "type": "FeatureCollection", "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, "features": json_route }; console.log(json_routes); console.log('.../route calc successful!'); res.json(json_routes); } catch (err) { console.log('.../loadSetP failed!\n' + err); } }); // - build geojson for Car Routing function Route_buildJson(inputData) { return new Promise(function (resolve, reject) { try { var JsonFeature = []; var json_route = inputData var pol = polycalc.decode(json_route.routes[0].sections[0].polyline) var length = pol.polyline.length; // console.log(length); var id = json_route.routes[0].id; var mid = json_route.routes[0].sections[0].id; var transport = json_route.routes[0].sections[0].transport.mode; var departureTime = json_route.routes[0].sections[0].departure.time; var departureOriglat = json_route.routes[0].sections[0].departure.place.originalLocation.lat; // console.log(departureOriglat) var departureOriglon = json_route.routes[0].sections[0].departure.place.originalLocation.lng; // console.log(departureOriglon) var departurelat = json_route.routes[0].sections[0].departure.place.location.lat; var departurelon = json_route.routes[0].sections[0].departure.place.location.lng; var arrivalTime = json_route.routes[0].sections[0].arrival.time; var arrivalOriglat = json_route.routes[0].sections[0].arrival.place.originalLocation.lat; var arrivalOriglon = json_route.routes[0].sections[0].arrival.place.originalLocation.lng; var arrivallat = json_route.routes[0].sections[0].arrival.place.location.lat; var arrivallon = json_route.routes[0].sections[0].arrival.place.location.lng; var departure = []; departure.push([parseFloat(parseFloat(departureOriglon).toFixed(5)), parseFloat(parseFloat(departureOriglat).toFixed(5))]); departure.push([parseFloat(parseFloat(departurelon).toFixed(5)), parseFloat(parseFloat(departurelat).toFixed(5))]) timeDifference(departureTime, arrivalTime); JsonFeature.push({ "type": "Feature", "properties": { "id": id, "name": "linestring", "transport": transport, "departureTime": departureTime, "daysDifference": daysDifference, "hoursDifference": hoursDifference, "minutesDifference": minutesDifference, "secondsDifference": secondsDifference }, "geometry": { "type": "LineString", "coordinates": departure }, "vcsMeta": { "style": { "type": "vector", "stroke": { "color": [ 30, 144, 255, 1 ], "width": 3, "lineDash": null } } } }) var arrival = []; arrival.push([parseFloat(parseFloat(arrivalOriglon).toFixed(5)), parseFloat(parseFloat(arrivalOriglat).toFixed(5))]); arrival.push([parseFloat(parseFloat(arrivallon).toFixed(5)), parseFloat(parseFloat(arrivallat).toFixed(5))]) // console.log(arrival) JsonFeature.push({ "type": "Feature", "properties": { "id": id, "name": "linestring", "transport": transport, "arrivalTime": arrivalTime, "departureTime": departureTime, "daysDifference": daysDifference, "hoursDifference": hoursDifference, "minutesDifference": minutesDifference, "secondsDifference": secondsDifference }, "geometry": { "type": "LineString", "coordinates": arrival }, "vcsMeta": { "style": { "type": "vector", "stroke": { "color": [ 30, 144, 255, 1 ], "width": 3, "lineDash": null } } } }) var pline = []; var length = pol.polyline.length; for (var i = 0; i <= length - 1; i++) { pline.push([parseFloat(parseFloat(pol.polyline[i][1]).toFixed(5)), parseFloat(parseFloat(pol.polyline[i][0]).toFixed(5))]) } JsonFeature.push({ "type": "Feature", "properties": { "id": id, "name": "linestring", "transport": transport, "departureTime": departureTime, "daysDifference": daysDifference, "hoursDifference": hoursDifference, "minutesDifference": minutesDifference, "secondsDifference": secondsDifference }, "geometry": { "type": "LineString", "coordinates": pline }, "vcsMeta": { "style": { "type": "vector", "stroke": { "color": [ 199, 21, 133, 1 ], "width": 4, "lineDash": null } } } }) // console.log(JsonFeature) resolve(JsonFeature) } catch (error) { reject(error) } }); }; // ---- Route Offis Berechnen Test ---- app.get('/navPublicT2', async (req, res) => { console.log('command angekommen ////// Route/////!') const pointData = req.query; console.log(pointData); try { let APIout = await CON_getApiResponse('https://transit.router.hereapi.com/v8/routes?origin=' + parseFloat(parseFloat(pointData.slat).toFixed(5)) + ',' + parseFloat(parseFloat(pointData.slon).toFixed(5)) + '&destination=' + parseFloat(parseFloat(pointData.elat).toFixed(5)) + ',' + parseFloat(parseFloat(pointData.elon).toFixed(5)) + '&return=polyline&apiKey=9Grm-6B7VRvxAnbf2eKw29gR-9uuJP8VaXXYR8LK93Y'); console.log(APIout) let json_pub = await Route_PublicbuildJson(APIout); console.log(json_pub) // navPublicjson = { // "name":"navPublic" + "01", // "type":"FeatureCollection", // "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, // "features": buildNavPublic() // }; var json_public = { "name": "navPublic" + "01", "type": "FeatureCollection", "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, "features": json_pub }; console.log(json_public); console.log('.../route calc successful!'); res.json(json_public); } catch (err) { console.log('.../loadSetP failed!\n' + err); } }); // - build geojson for Public Routing function Route_PublicbuildJson(inputData) { return new Promise(function (resolve, reject) { try { var JsonFeature = []; // var pol = polycalc.decode(navcar.body.routes[0].sections[0].polyline) // var length = pol.polyline.length; // console.log(length); var json_public = inputData var id = json_public.routes[0].id; var length = json_public.routes[0].sections.length; console.log("length of Sections: " + length) for (var i = 0; i <= length - 1; i++) { console.log(i) if (json_public.routes[0].sections[i].type == "pedestrian") { console.log("pedestrian") var section = json_public.routes[0].sections[i] var agencyid = section.id; var agencyname = section.name; var arrivaltime = section.arrival.time; var arrivalplace = section.arrival.place; var departuretime = section.departure.time; var departureplace = section.departure.place; var transportInfo = section.transport; var pol = polycalc.decode(section.polyline) var pollength = pol.polyline.length; var timedifference = timeDifference1(departuretime, arrivaltime); var pline = []; for (var j = 0; j <= pollength - 1; j++) { pline.push([parseFloat(parseFloat(pol.polyline[j][1]).toFixed(5)), parseFloat(parseFloat(pol.polyline[j][0]).toFixed(5))]) } JsonFeature.push({ "type": "Feature", "properties": { "id": agencyid, "agencyName": agencyname, "name": "linestring", "type": "pedestrian", "transportInfo": transportInfo, "arrivalTime": arrivaltime, "arrivalPlace": arrivalplace, "departureTime": departuretime, "departurePlace": departureplace, "daysDifference": timedifference.daysDifference, "hoursDifference": timedifference.hoursDifference, "minutesDifference": timedifference.minutesDifference, "secondsDifference": timedifference.secondsDifference }, "geometry": { "type": "LineString", "coordinates": pline }, "vcsMeta": { "style": { "type": "vector", "stroke": { "color": [ 30, 144, 255, 1 ], "width": 3, "lineDash": null } } } }) console.log(JsonFeature) } else if (json_public.routes[0].sections[i].type == "transit") { console.log("transit") var section = json_public.routes[0].sections[i] var agencyid = section.id; var agencyname = section.name; var arrivaltime = section.arrival.time; var arrivalplace = section.arrival.place; var departuretime = section.departure.time; var departureplace = section.departure.place; var transportInfo = section.transport; var pol = polycalc.decode(section.polyline) var pollength = pol.polyline.length; var timedifference = timeDifference1(departuretime, arrivaltime); var pline = []; for (var j = 0; j <= pollength - 1; j++) { pline.push([parseFloat(parseFloat(pol.polyline[j][1]).toFixed(5)), parseFloat(parseFloat(pol.polyline[j][0]).toFixed(5))]) } JsonFeature.push({ "type": "Feature", "properties": { "id": agencyid, "agencyName": agencyname, "name": "linestring", "type": "transit", "transportInfo": transportInfo, "arrivalTime": arrivaltime, "arrivalPlace": arrivalplace, "departureTime": departuretime, "departurePlace": departureplace, "daysDifference": timedifference.daysDifference, "hoursDifference": timedifference.hoursDifference, "minutesDifference": timedifference.minutesDifference, "secondsDifference": timedifference.secondsDifference }, "geometry": { "type": "LineString", "coordinates": pline }, "vcsMeta": { "style": { "type": "vector", "stroke": { "color": [ 255, 140, 0, 1 ], "width": 4, "lineDash": null } } } }) console.log(JsonFeature) } } resolve(JsonFeature) } catch (error) { reject(error) } }); }; // ---- Noise Real Time ---- // - 3Parts - // - get request from the html page app.get('/NoiseRealTime', async (req, res) => { console.log('command angekommen!') try { console.log('https://data.sensor.community/airrohr/v1/sensor/' + req.query.id + '/') let APIout = await flow_getApiResponse('https://data.sensor.community/airrohr/v1/sensor/' + req.query.id + '/'); console.log(APIout); res.json((APIout)); } catch (error) { console.log(error) } }); // ---- Historic Noise Data ---- // ---- Trial Version from PostgreSQL ---- const pgp = require('pg-promise')({ // Initialization Options }); const connection = { user: 'postgres', // name of the user account database: 'NoiseSensorData', // name of the database -- NoiseSensorData password: 'ahpk94meteor', // env var: PGPASSWORD -- ahpk94meteor host: '193.196.38.112', // Server hosting the postgres database (host: '35.187.21.114') -- 193.196.38.112 port: 5432, // env var: PGPORT max: 10, // max number of clients in the pool idleTimeoutMillis: 30000 // how long a client is allowed to remain idle before being closed } const db = pgp(connection); console.log('successful connected to DB: NoiseSensorData!') app.post('/getNoiseHist', function (req, res) { try { const data = req.body; // = "select sensor_id from public.noisesensor;" // let query_string = " SELECT * FROM noisesensors ORDER BY timestamp ASC;" let query_string = "SELECT * FROM (SELECT *, row_number() over() rn FROM noisesensors) foo WHERE foo.rn % 12 = 0 ORDER BY timestamp ASC;" // query_string += "from noisesensor;"; console.log(query_string) // request the data rsr db.result(query_string) .then(result => { res.json(result.rows); }) .catch(error => { console.log('ERROR:', error); }); console.log('.../getNoiseHist successful!'); } catch (err) { console.log('.../getNoiseHist failed!\n' + err); } }); app.post('/getSTANoiseHist', async (req, res) => { console.log('command angekommen ////// STANoise/////!') const pointData = req.query; // console.log(pointData); try { let origURL = 'http://193.196.138.56/frost-noise-api/v1.1/Datastreams(1)/Observations?$orderby=phenomenonTime%20asc' let STALAeq = await STA_getApiResponse(origURL); let STALAeqColl = []; // let origURLmin = 'http://193.196.138.56/frost-noise-api/v1.1/Datastreams(2)/Observations?$orderby=phenomenonTime%20asc' // let STALAeqmin = await STA_getApiResponse(origURLmin); // let origURLmax = 'http://193.196.138.56/frost-noise-api/v1.1/Datastreams(3)/Observations?$orderby=phenomenonTime%20asc' // let STALAeqmax = await STA_getApiResponse(origURLmax); //eq for (var i = 0; i <= STALAeq.value.length - 1; i++) { var newNum = "noise"; var newVal = "LAeq"; STALAeq.value[i][newNum] = newVal; STALAeqColl.push(STALAeq.value[i]); } do { STALAeq = await STA_getApiResponse(STALAeq["@iot.nextLink"]); for (var j = 0; j <= STALAeq.value.length - 1; j++) { STALAeqColl.push(STALAeq.value[j]); } } while ("@iot.nextLink" in STALAeq); console.log(STALAeqColl.length) res.json(STALAeqColl); } catch (err) { console.log('.../loadSetP failed!\n' + err); } }); function STA_getApiResponse(url) { return new Promise(function (resolve, reject) { // console.log(url) axios.get(url) .then(function (response) { // handle success // console.log(response.data); resolve(response.data); }) .catch(function (error) { // handle error // console.log(error); reject(error); }); }); } const connectionFav = { user: 'postgres', // name of the user account database: 'FavoritPlaces', // name of the database password: 'ahpk94meteor', // env var: PGPASSWORD host: '193.196.38.112', // Server hosting the postgres database (host: '35.187.21.114') port: 5432, // env var: PGPORT max: 10, // max number of clients in the pool idleTimeoutMillis: 30000 // how long a client is allowed to remain idle before being closed } const dbFav = pgp(connectionFav); console.log('successful connected to DB: FavoritPlaces!') // ---- FavPlaces ---- // - 3Parts - // - get request from the html page app.get('/FavPlacesDB', async (req, res) => { console.log('FavPlacesDB angekommen!') try { let APIout = await getDBResult(''); console.log(APIout) let json_con = await buildFavJson(APIout, "CONSTRUCTION"); // console.log(json_con) var json_cons = { "name": "FavouritePlaces" + "01", "type": "FeatureCollection", "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, "features": json_con }; res.json(json_cons) } catch (error) { console.log(error) } }); // - request from the here API function getDBResult(url) { return new Promise(function (resolve, reject) { let query_string = " SELECT id, lat, lon, contenttext, approved, timestamp FROM public.places WHERE approved = true;" // query_string += "from noisesensor;"; console.log(query_string) // request the data rsr dbFav.result(query_string) .then(result => { // res.json(result.rows); console.log((result.rows)); resolve((result.rows)); }) .catch(function (error) { // handle error // console.log(error); reject(error); }); }); } // - build geojson from response function buildFavJson(inputData, type) { return new Promise(function (resolve, reject) { try { var JsonFeature = []; var json_acc = inputData var length = json_acc.length; // console.log(length) for (var i = 0; i <= length - 1; i++) { //console.log(json_acc.TRAFFIC_ITEMS.TRAFFIC_ITEM[i]) var lat = json_acc[i].lat; var lon = json_acc[i].lon; // var type = json_acc.TRAFFIC_ITEMS.TRAFFIC_ITEM[i].TRAFFIC_ITEM_TYPE_DESC; var id = json_acc[i].id; var contenttext = json_acc[i].contenttext; var timestamp = json_acc[i].timestamp; // console.log(i) JsonFeature.push({ "type": "Feature", "properties": { "id": id, "name": "datapoint", "contenttext": contenttext, "timestamp": timestamp, "date": timestamp.getUTCDate(), "month": timestamp.getMonth(), "year": timestamp.getUTCFullYear(), "lat": lat, "lon": lon }, "geometry": { "type": "MultiPoint", "coordinates": [ [parseFloat(lon), parseFloat(lat)] ] } }) } resolve(JsonFeature) } catch (error) { reject(error) } }); }; app.post('/saveFavPoint', function (req, res) { try { const data = req.body; // = "select sensor_id from public.noisesensor;" let query_string = " INSERT INTO public.places( lat, lon, contenttext, approved, timestamp) VALUES (" + data.lat + ", " + data.lon + ", '" + data.contentext + "', 'false' , NOW()); " // query_string += "from noisesensor;"; console.log(query_string) // request the data rsr dbFav.result(query_string) .then(result => { res.json(result.rows); }) .catch(error => { console.log('ERROR:', error); }); console.log('.../saveFavPoint successful!'); } catch (err) { console.log('.../saveFavPoint failed!\n' + err); } });