diff --git a/spatial/static/spatial/js/gridmap.js b/spatial/static/spatial/js/gridmap.js index a80fcabe5080ed60a1aa0c221236ad7c372238eb..8f0d8562d156f39af23ca2b06712d53654ef2456 100644 --- a/spatial/static/spatial/js/gridmap.js +++ b/spatial/static/spatial/js/gridmap.js @@ -51,6 +51,25 @@ function getCurrentVisibleOLLayer() return layers[currentWMSLayer["ordering"]]; } +/** + * Used by displayQueryResult() to retrieve values from query templates when user clicks on the map + * + * @returns a list of the OpenLayers layers that are available for the current timestamp. + * + */ +function getLayersForCurrentTimestamp() +{ + layerParams = WMSLayersDateBucket[currentTimestamp]; + paramIdList = Object.keys(layerParams); + let layersForCurrentTimestamp = []; + for(let i=0; i< paramIdList.length; i++) + { + layersForCurrentTimestamp.push(layers[WMSLayersDateBucket[currentTimestamp][paramIdList[i]]["ordering"]]); + } + return layersForCurrentTimestamp; + +} + async function initGridMap(inputModelId, mapAttribution) { modelId = inputModelId; @@ -212,70 +231,76 @@ async function displayQueryResult(evt) let coordinate = proj4(map.getView().getProjection().getCode(), 'EPSG:25833', evt.coordinate) let currentWMSLayer = WMSLayersDateBucket[currentTimestamp][currentParameter]; - let currentLayer = getCurrentVisibleOLLayer(); - //console.info(currentLayer); - const url = currentLayer.getSource().getGetFeatureInfoUrl( - coordinate, - map.getView().getResolution(), - currentWMSLayer.CRS[0], - { 'INFO_FORMAT': 'text/xml' } - ); - - //console.info(url); - let response = await fetch(url); - let responseXML = await response.text(); - // User clicked outside of layer extent - if(responseXML.trim().length == 0) + // Need to get all layers for today, and combine results from querying all layers + let layersForCurrentTimestamp = getLayersForCurrentTimestamp(); + let warningStatus = null; + let parameters = {}; + for(let i=0;i<layersForCurrentTimestamp.length;i++) { - return; - } + let currentLayer = layersForCurrentTimestamp[i]; + const url = currentLayer.getSource().getGetFeatureInfoUrl( + coordinate, + map.getView().getResolution(), + currentWMSLayer.CRS[0], + { 'INFO_FORMAT': 'text/xml' } + ); - const parser = new DOMParser(); - const xmlDOM = parser.parseFromString(responseXML,"text/xml"); - const result = xmlDOM.getElementsByTagName("vipsResult")[0] - if(result) { - // We may or may not have warning status included - let warningStatus = xmlDOM.getElementsByTagName("warningStatus").length == 1 ? xmlDOM.getElementsByTagName("warningStatus")[0].getAttribute("value") : null; - if(warningStatus == -1) - { - return; - } - let parameters = {}; - let parameterElements = xmlDOM.getElementsByTagName("parameter"); - for(let i=0;i<parameterElements.length;i++) + let response = await fetch(url); + let responseXML = await response.text(); + // User clicked outside of layer extent + if(responseXML.trim().length == 0) { - parameters[parameterElements[i].getAttribute("name")] = parameterElements[i].getAttribute("value"); + continue; } - //console.info("warningStatus = " + warningStatus); - //console.info(parameters); - - let warningStatusTitle = warningStatus == 0 ? "N/A" - : warningStatus == 1 ? "Missing data" - : warningStatus == 2 ? "No risk" - : warningStatus == 3 ? "Possible risk" - : warningStatus == 4 ? "High risk" : ""; - - let paramHTML = "<ul>"; - paramCodes = Object.keys(parameters); - for(let i=0;i<paramCodes.length;i++) - { - paramHTML += "<li>" + paramCodes[i] + " = " + parameters[paramCodes[i]] + "</li>" + const parser = new DOMParser(); + const xmlDOM = parser.parseFromString(responseXML,"text/xml"); + const result = xmlDOM.getElementsByTagName("vipsResult")[0] + if(result) { + // We may or may not have warning status included + warningStatus = warningStatus == null ? (xmlDOM.getElementsByTagName("warningStatus").length == 1 ? xmlDOM.getElementsByTagName("warningStatus")[0].getAttribute("value") : null) : warningStatus; + // User clicked on invisible/invalid part of the layer + if(warningStatus == -1) + { + continue; + } + + let parameterElements = xmlDOM.getElementsByTagName("parameter"); + for(let i=0;i<parameterElements.length;i++) + { + parameters[parameterElements[i].getAttribute("name")] = parameterElements[i].getAttribute("value"); + } } - paramHTML += "</ul>"; - - // Render results - // TODO: Handle click outside layer - popup.setPosition(evt.coordinate); - $(popupElement).popover({ - 'placement': 'top', - 'animation': false, - 'html': true, - 'content': '<h4>' + warningStatusTitle + '</h4>' + paramHTML - }); - $(popupElement).popover('show'); } - else{ - alert("An error occured. No model data was returned from the server. This is what the server returned: " + responseXML); + + // User clicked outside of layers contents + if(warningStatus == null) + { + return; } + + let warningStatusTitle = warningStatus == 0 ? "N/A" + : warningStatus == 1 ? "Missing data" + : warningStatus == 2 ? "No risk" + : warningStatus == 3 ? "Possible risk" + : warningStatus == 4 ? "High risk" : ""; + + let paramHTML = "<ul>"; + paramCodes = Object.keys(parameters); + for(let i=0;i<paramCodes.length;i++) + { + paramHTML += "<li>" + paramCodes[i] + " = " + parameters[paramCodes[i]] + "</li>" + } + paramHTML += "</ul>"; + + // Render results + popup.setPosition(evt.coordinate); + $(popupElement).popover({ + 'placement': 'top', + 'animation': false, + 'html': true, + 'content': '<h4>' + warningStatusTitle + '</h4>' + paramHTML + }); + $(popupElement).popover('show'); + } \ No newline at end of file diff --git a/spatial/templates/spatial/index.html b/spatial/templates/spatial/index.html index 832c4e2c602348de87a4129382666e7583ab7479..b8f9dec5b0ebe928c1923c596c950d6190b0d37d 100644 --- a/spatial/templates/spatial/index.html +++ b/spatial/templates/spatial/index.html @@ -31,7 +31,7 @@ {% if available_grid_models|length > 0 %} <ul> {% for model in available_grid_models %} - <li><a href="gridmap/{{model.model_id}}/">{{ model.model_name }}</a></li> + <li><a href="gridmap/{{model.model_id}}/">{{ get_text_i18n model.model_name }}</a></li> {% endfor %} </ul> {% else %}