diff --git a/config.js b/config.js index c29eefe1350c3a8a0175fef466db2d780dec1f01..229d311a32f2cd9d6b7a5bd538dfa9f465d01efb 100644 --- a/config.js +++ b/config.js @@ -1,5 +1,6 @@ const config = { - port: 9000 + port: 9000, + boundingBoxBufferPercent: 15 } module.exports = config; \ No newline at end of file diff --git a/routes/v1.js b/routes/v1.js index 2b8a79101977d2443e91a56513dcf9c93d274d48..c8890ef546fed0106d70013f23f4c5f6e29c8d29 100644 --- a/routes/v1.js +++ b/routes/v1.js @@ -1,10 +1,11 @@ const express = require("express"); -const { check, validationResult, oneOf } = require("express-validator") +const { check, validationResult } = require("express-validator") const { toLower } = require("../src/customSanitizers"); const { errorHandler } = require("../src/errorHandler"); const checkFactory = require("../src/validationCheckFactory"); const { getSceneHandler } = require("../src/getSceneHandler"); const { getCapabilitiesHandler } = require("../src/getCapabilitiesHandler"); +const assets = require("../src/assets"); const bb = require("../src/boundingbox"); const redirectTo = require("../src/redirectTo"); @@ -56,8 +57,11 @@ const sceneChecks = [ .exists().withMessage("MissingParameterValue") .customSanitizer(toLower) .equals("getscene").withMessage("InvalidParameterValue"), - check("boundingbox") + check("layers") .exists().withMessage("MissingParameterValue") + .custom(value => assets.allLayersExist(value)).withMessage("UnknownLayer"), + check("boundingbox") + .optional() .matches(/^((\-?\d+(\.\d+)?),){3}(\-?\d+(\.\d+)?)$/).withMessage("InvalidParameterValue") .custom(value => bb.isValid(value)).withMessage("InvalidParameterValue"), check("cullingvolume") @@ -74,11 +78,7 @@ const sceneChecks = [ .matches(/^((\-?\d+(\.\d+)?),){1}(\-?\d+(\.\d+)?)$/).withMessage("InvalidParameterValue"), check("time") .exists().withMessage("MissingParameterValue") - .matches(/\d+/).withMessage("InvalidParameterValue"), - check("intersect") - .exists().withMessage("MissingParameterValue") - .customSanitizer(toLower) - .isIn(["true", "false"]).withMessage("InvalidParameterValue") + .matches(/\d+/).withMessage("InvalidParameterValue") ]; router.route("/scene").get(sceneChecks, (req, res) => { diff --git a/src/assets.js b/src/assets.js index 98017b6da4d55a6e80dd8e3abab266f73438eb91..30f1a6e708baebbb62e2af7a90c0bb0c823de854 100644 --- a/src/assets.js +++ b/src/assets.js @@ -2,6 +2,22 @@ const fs = require("fs"); const boxIntersect = require("box-intersect"); const path = require('path'); +const getLayers = (layers) => { + return new Promise((resolve, reject) => { + fs.readFile("./assets/assets.json", (err, data) => { + if (err) { + reject(); + } + let assets = JSON.parse(data); + let requestedLayers = layers.split(","); + + assets = assets.filter(asset => requestedLayers.includes(asset.id)); + assets = assets.filter(asset => asset.scope == "public"); + resolve(assets); + }); + }); +} + const getIntersectingLayers = (bb, layers) => { return new Promise((resolve, reject) => { @@ -124,4 +140,4 @@ const isPublic = (url) => { } -module.exports = { getIntersectingLayers, getIntersecting, allLayersExist, getPublicLayers, isPublic }; \ No newline at end of file +module.exports = { getIntersectingLayers, getIntersecting, allLayersExist, getPublicLayers, isPublic, getLayers }; \ No newline at end of file diff --git a/src/context.js b/src/context.js index 6e15ab81673896462d2992671b8e2072a9d4b8de..d613551c8a5edc115e52883677d99e7f0bf761c7 100644 --- a/src/context.js +++ b/src/context.js @@ -12,8 +12,7 @@ const fromRequest = (req) => { camera: camera.fromString(req.query.camera), offCenterFrustum: offCenterFrustum.fromString(req.query.frustum), drawingBuffer: drawingBuffer.fromString(req.query.drawingbuffer), - requestTime: req.query.time, - intersect: JSON.parse(req.query.intersect.toLowerCase()) + requestTime: req.query.time }; } diff --git a/src/geographicBoundingBox.js b/src/geographicBoundingBox.js index 2d20803fd44ff4a2902814bac4f6e96a6c605162..5d39594946effb82f6588a563ff73862749f9730 100644 --- a/src/geographicBoundingBox.js +++ b/src/geographicBoundingBox.js @@ -61,6 +61,7 @@ class GeographicBoundingBox { } const fromString = (str) => { + if(!str) return null; let tokens = str.split(","); return new GeographicBoundingBox(...tokens.map(token => parseFloat(token))); } diff --git a/src/getSceneHandler.js b/src/getSceneHandler.js index 2b4c696cf87226bc28f17cf6e427de0e5aac5cdd..045afdf07b5f8d4223235b6b96369e3502f71cf9 100644 --- a/src/getSceneHandler.js +++ b/src/getSceneHandler.js @@ -3,7 +3,7 @@ const Traverse = require("./traverse"); const getSceneHandler = (req, res) => { - assets.getIntersecting(req.query.boundingbox).then(layers => { + assets.getLayers(req.query.layers).then(layers => { let traverse = new Traverse(); traverse.begin(req, layers[0].url) diff --git a/src/nodes.js b/src/nodes.js index 454be1ec86c1b21886e15982a48470a896e86fa1..f034c344662a0f6b7d4b757b253e17e49f244502 100644 --- a/src/nodes.js +++ b/src/nodes.js @@ -1,3 +1,5 @@ +const config = require("../config"); + class Nodes { constructor() { @@ -21,9 +23,9 @@ class Nodes { time: context.requestTime }; - if (context.intersect) { + if (context.bb != null) { let requestedBB = context.bb.clone(); - requestedBB.extend(25); + requestedBB.extend(config.boundingBoxBufferPercent); if (requestedBB.intersectWithGeographic(boundingSphere.geographicCenter)) { this.nodes.push(entry); }