diff --git a/spatial/static/spatial/js/slidingMap.js b/spatial/static/spatial/js/gridmap.js similarity index 89% rename from spatial/static/spatial/js/slidingMap.js rename to spatial/static/spatial/js/gridmap.js index 58186d06ab3becf8edea8d05d1400231b14d1042..0ea74e5e41f052d95b8071526c164969a3615713 100644 --- a/spatial/static/spatial/js/slidingMap.js +++ b/spatial/static/spatial/js/gridmap.js @@ -7,7 +7,7 @@ proj4.defs( let layers = []; let mapserverURL="https://testvips.nibio.no/cgi-bin/"; -let modelId = "SEPTREFHUM"; +let modelId = undefined; let today = "2023-04-10"; let todayLayerIndex = undefined; let timestamps = undefined; @@ -52,8 +52,8 @@ function getCurrentVisibleOLLayer() } -async function initSlidingMap(lonLat, zoomLevel, mapAttribution) { - +async function initGridMap(inputModelId, lonLat, zoomLevel, mapAttribution) { + modelId = inputModelId; var backgroundLayer = new ol.layer.Tile({ source: new ol.source.OSM({ attributions: [ @@ -67,7 +67,18 @@ async function initSlidingMap(lonLat, zoomLevel, mapAttribution) { // Get layers from WMS service let parser = new ol.format.WMSCapabilities(); let response = await fetch(mapserverURL + modelId + "?service=WMS&version=1.3.0&request=GetCapabilities"); - let capabilities = parser.read(await response.text()); + console.info(response.status); // Response is 200 even if a model doesn't exist on the mapserver + let txt = await response.text(); + /* +<HTML> +<HEAD><TITLE>MapServer Message</TITLE></HEAD> +<!-- MapServer version 7.6.4 OUTPUT=PNG OUTPUT=JPEG OUTPUT=KML SUPPORTS=PROJ SUPPORTS=AGG SUPPORTS=FREETYPE SUPPORTS=CAIRO SUPPORTS=SVG_SYMBOLS SUPPORTS=RSVG SUPPORTS=ICONV SUPPORTS=FRIBIDI SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER SUPPORTS=SOS_SERVER SUPPORTS=FASTCGI SUPPORTS=THREADS SUPPORTS=GEOS SUPPORTS=POINT_Z_M SUPPORTS=PBF INPUT=JPEG INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE --> +<BODY BGCOLOR="#FFFFFF"> +msLoadMap(): Unable to access file. (/disks/data01/mapserver/wms/SEPTREFFUM/SEPTREFFUM.map) <=== Security issue on the mapserver!!! +</BODY></HTML> + */ + console.info(txt); + let capabilities = parser.read(txt); let WMSLayers = capabilities.Capability.Layer.Layer; document.getElementById("modelTitle").innerHTML = capabilities.Service.Title; document.getElementById("modelAbstract").innerHTML = capabilities.Service.Abstract.replaceAll("\n\n","XXX"); diff --git a/spatial/templates/spatial/slidingMap.html b/spatial/templates/spatial/gridmap.html similarity index 92% rename from spatial/templates/spatial/slidingMap.html rename to spatial/templates/spatial/gridmap.html index 6e0d4ebd0396c7a7d192cbe9f8b7a664456821d0..b6c0d022606722171a4e887c9d9d3c3d70936b2b 100644 --- a/spatial/templates/spatial/slidingMap.html +++ b/spatial/templates/spatial/gridmap.html @@ -12,13 +12,13 @@ <script type="text/javascript" src="{% static "js/3rdparty/moment.min.js" %}"></script> <script type="text/javascript" src="{% static "js/util.js" %}"></script> <script type="text/javascript" src="{% url "views.settings_js" %}"></script> -<script type="text/javascript" src="{% static "spatial/js/slidingMap.js" %}"></script> +<script type="text/javascript" src="{% static "spatial/js/gridmap.js" %}"></script> <script type="text/javascript"> $(document).ready(function() { var longitude = {{settings.MAP_CENTER_LONGITUDE|unlocalize}}; var latitude = {{settings.MAP_CENTER_LATITUDE|unlocalize}}; var zoomLevel = {{settings.MAP_ZOOMLEVEL}}; - initSlidingMap([longitude,latitude],zoomLevel,"{{settings.MAP_ATTRIBUTION|safe}}"); + initGridMap("{{model_id}}",[longitude,latitude],zoomLevel,"{{settings.MAP_ATTRIBUTION|safe}}"); }); </script> {% endblock %} diff --git a/spatial/templates/spatial/index.html b/spatial/templates/spatial/index.html index a13259eba27e916c21558b4179bbe0ae3c216efd..0919a042eae2cd80474e29aeffef2b95da4a7a2b 100644 --- a/spatial/templates/spatial/index.html +++ b/spatial/templates/spatial/index.html @@ -21,75 +21,21 @@ {% endcomment %} {% load i18n l10n static forecast_extras template_helper %} -{% block title%}{% trans "Welcome" %}{%endblock%} -{% block customCSS %} -<link rel="stylesheet" href="{% static "css/3rdparty/ol.css" %}" type="text/css"> -{% endblock %} -{% block customJS %} -<script type="text/javascript" src="{% url "javascript-catalog" %}"></script> -<script type="text/javascript" src="{% static "js/3rdparty/ol.js" %}"></script> -<script type="text/javascript" src="{% static "js/3rdparty/proj4.js" %}"></script> -<script type="text/javascript" src="{% static "js/3rdparty/moment.min.js" %}"></script> -<script type="text/javascript" src="{% static "js/util.js" %}"></script> -<script type="text/javascript" src="{% url "views.settings_js" %}"></script> -<script type="text/javascript" src="{% static "spatial/js/spatialMap.js" %}"></script> -<script type="text/javascript"> - $(document).ready(function() { - var longitude = {{settings.MAP_CENTER_LONGITUDE|unlocalize}}; - var latitude = {{settings.MAP_CENTER_LATITUDE|unlocalize}}; - var zoomLevel = {{settings.MAP_ZOOMLEVEL}}; - initSpatialMap([longitude,latitude],zoomLevel,"{{settings.MAP_ATTRIBUTION|safe}}",'mapToday'); - initSpatialMap([longitude,latitude],zoomLevel,"{{settings.MAP_ATTRIBUTION|safe}}",'mapTomorrow'); - }); -</script> -{% endblock %} +{% block title%}{% trans "VIPS Spatial" %}{%endblock%} {% block content %} - <!-- Start map container --> - <div class="col-md-12" id="mapContainer"> - <div class="row"> - <div class="col-md-12"> - <a href="https://www.vips-landbruk.no" class="btn btn-default" role="button"><--- Tilbake til VIPS-offisiell</a> - <h1>Svermetidspunkt for gulrotflue - BETAversjon</h1> - <p> - Kartet viser beregnet <a href="https://www.vips-landbruk.no/forecasts/models/PSILARTEMP/" target="new">svermetidspunkt - for gulrotflue 1. generasjon</a>. Varslene beregnes i rutenett a 1x1km basert på temperaturdata fra - <a href="https://senorge.no/" target="new">SeNorge</a> - og <a href="https://thredds.met.no/thredds/catalog/metpplatest/catalog.html" target="new">temperaturprognoser - fra Meteorologisk institutt</a>. Det vises et kart for dagens dato og et for morgendagen. Varslene oppdateres - en gang per døgn. Modellen for svermetidspunkt for gulrotflue beregnes også - med data fra værstasjoner, hvor mer detaljerte beregninger kan hentes opp - via visningen i kartet på VIPS-forsida. - </p> - <p> - Denne kartvisningen av grid-baserte varsler er resultat fra prosjektet "Grid-baserte varsler i VIPS", - finansiert av Landbruksdirektoratet gjennom Handlingsplan for bærekraftig bruk av plantevernmidler i - 2023. Videreutvikling av produktet vil skje høst/vinter 2023. - </p> - <h2>Kartforklaring</h2> - <ul> - <li>Grønt - sverming har ikke begynt</li> - <li>Gult - svermingen er i startfasen, vær obs på at det kan komme innflyvere i åkeren.</li> - <li>Rødt - Svermingen er på sitt mest aktive.</li> - <li>Grå - sverming av 1. generasjon er over og varslingen er avsluttet </li> - </ul> - <a href="https://www.vips-landbruk.no" class="btn btn-default" role="button"><--- Tilbake til VIPS-offisiell</a> - </div> - </div> - <div class="row" id="mapAndForecastRow" style="padding-bottom: 20px;"> - <div class="col-md-6" id="mapToday" class="map" style="height: {{settings.MAP_HEIGHT}}px;">I dag</div> - <div class="col-md-6" id="mapTomorrow" class="map" style="height: {{settings.MAP_HEIGHT}}px;">I morgen</div> - </div><!-- End row --> - - <div id="mapTodayInfo" class="featureInfo"></div> - <div id="mapTomorrowInfo" class="featureInfo"></div> - <div class="row"> - <div class="col-md-12"> - <h2>TESTING: Gjennomsiktighet av lag</h2> - <p>Vi prøver nå ut to ulike gjennomsiktigheter av varslingslaget, for å finne optimal kombinasjon av - synlighet av varsel og mulighet for å finne ut hvor man er på kartet. Morgendagens varsel er mer - gjennomsiktig enn dagens. Gi gjerne tilbakemelding om hvilken av disse to alternativene du foretrekker</p> - </div> - </div> - </div> - -{% endblock %} \ No newline at end of file +<h1>{% trans "VIPS Spatial" %}</h1> +<p>VIPS spatial resources are listed below</p> +<h2>VIPS grid map</h2> +<p> + View results from VIPS models run on gridded weather data. + <ul> + {% for model in available_grid_models %} + <li><a href="gridmap/{{model.model_id}}">{{ model.model_name }}</a></li> + {% endfor %} + </ul> +</p> +<h2>Other resources</h2> +<ul> + <li><a href="test/PSILARTEMP">Carrot rust fly map [TEST]</a></li> +</ul> +{% endblock %} diff --git a/spatial/templates/spatial/psilartemp.html b/spatial/templates/spatial/psilartemp.html new file mode 100644 index 0000000000000000000000000000000000000000..a13259eba27e916c21558b4179bbe0ae3c216efd --- /dev/null +++ b/spatial/templates/spatial/psilartemp.html @@ -0,0 +1,95 @@ +{% extends "base.html" %} +{% comment %} +/* + * Copyright (c)2018 NIBIO <http://www.nibio.no/>. + * + * This file is part of VIPSWeb. + * VIPSWeb is free software: you can redistribute it and/or modify + * it under the terms of the NIBIO Open Source License as published by + * NIBIO, either version 1 of the License, or (at your option) any + * later version. + * + * VIPSWeb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * NIBIO Open Source License for more details. + * + * You should have received a copy of the NIBIO Open Source License + * along with VIPSWeb. If not, see <http://www.nibio.no/licenses/>. + * + */ + +{% endcomment %} +{% load i18n l10n static forecast_extras template_helper %} +{% block title%}{% trans "Welcome" %}{%endblock%} +{% block customCSS %} +<link rel="stylesheet" href="{% static "css/3rdparty/ol.css" %}" type="text/css"> +{% endblock %} +{% block customJS %} +<script type="text/javascript" src="{% url "javascript-catalog" %}"></script> +<script type="text/javascript" src="{% static "js/3rdparty/ol.js" %}"></script> +<script type="text/javascript" src="{% static "js/3rdparty/proj4.js" %}"></script> +<script type="text/javascript" src="{% static "js/3rdparty/moment.min.js" %}"></script> +<script type="text/javascript" src="{% static "js/util.js" %}"></script> +<script type="text/javascript" src="{% url "views.settings_js" %}"></script> +<script type="text/javascript" src="{% static "spatial/js/spatialMap.js" %}"></script> +<script type="text/javascript"> + $(document).ready(function() { + var longitude = {{settings.MAP_CENTER_LONGITUDE|unlocalize}}; + var latitude = {{settings.MAP_CENTER_LATITUDE|unlocalize}}; + var zoomLevel = {{settings.MAP_ZOOMLEVEL}}; + initSpatialMap([longitude,latitude],zoomLevel,"{{settings.MAP_ATTRIBUTION|safe}}",'mapToday'); + initSpatialMap([longitude,latitude],zoomLevel,"{{settings.MAP_ATTRIBUTION|safe}}",'mapTomorrow'); + }); +</script> +{% endblock %} +{% block content %} + <!-- Start map container --> + <div class="col-md-12" id="mapContainer"> + <div class="row"> + <div class="col-md-12"> + <a href="https://www.vips-landbruk.no" class="btn btn-default" role="button"><--- Tilbake til VIPS-offisiell</a> + <h1>Svermetidspunkt for gulrotflue - BETAversjon</h1> + <p> + Kartet viser beregnet <a href="https://www.vips-landbruk.no/forecasts/models/PSILARTEMP/" target="new">svermetidspunkt + for gulrotflue 1. generasjon</a>. Varslene beregnes i rutenett a 1x1km basert på temperaturdata fra + <a href="https://senorge.no/" target="new">SeNorge</a> + og <a href="https://thredds.met.no/thredds/catalog/metpplatest/catalog.html" target="new">temperaturprognoser + fra Meteorologisk institutt</a>. Det vises et kart for dagens dato og et for morgendagen. Varslene oppdateres + en gang per døgn. Modellen for svermetidspunkt for gulrotflue beregnes også + med data fra værstasjoner, hvor mer detaljerte beregninger kan hentes opp + via visningen i kartet på VIPS-forsida. + </p> + <p> + Denne kartvisningen av grid-baserte varsler er resultat fra prosjektet "Grid-baserte varsler i VIPS", + finansiert av Landbruksdirektoratet gjennom Handlingsplan for bærekraftig bruk av plantevernmidler i + 2023. Videreutvikling av produktet vil skje høst/vinter 2023. + </p> + <h2>Kartforklaring</h2> + <ul> + <li>Grønt - sverming har ikke begynt</li> + <li>Gult - svermingen er i startfasen, vær obs på at det kan komme innflyvere i åkeren.</li> + <li>Rødt - Svermingen er på sitt mest aktive.</li> + <li>Grå - sverming av 1. generasjon er over og varslingen er avsluttet </li> + </ul> + <a href="https://www.vips-landbruk.no" class="btn btn-default" role="button"><--- Tilbake til VIPS-offisiell</a> + </div> + </div> + <div class="row" id="mapAndForecastRow" style="padding-bottom: 20px;"> + <div class="col-md-6" id="mapToday" class="map" style="height: {{settings.MAP_HEIGHT}}px;">I dag</div> + <div class="col-md-6" id="mapTomorrow" class="map" style="height: {{settings.MAP_HEIGHT}}px;">I morgen</div> + </div><!-- End row --> + + <div id="mapTodayInfo" class="featureInfo"></div> + <div id="mapTomorrowInfo" class="featureInfo"></div> + <div class="row"> + <div class="col-md-12"> + <h2>TESTING: Gjennomsiktighet av lag</h2> + <p>Vi prøver nå ut to ulike gjennomsiktigheter av varslingslaget, for å finne optimal kombinasjon av + synlighet av varsel og mulighet for å finne ut hvor man er på kartet. Morgendagens varsel er mer + gjennomsiktig enn dagens. Gi gjerne tilbakemelding om hvilken av disse to alternativene du foretrekker</p> + </div> + </div> + </div> + +{% endblock %} \ No newline at end of file diff --git a/spatial/urls.py b/spatial/urls.py index 8b214f93c0ae9b7d5053efbfe9e28e44cb7bf9af..15f7a9bc68b4b11bffe9d1d2e34a41126f87f60c 100644 --- a/spatial/urls.py +++ b/spatial/urls.py @@ -6,5 +6,6 @@ app_name='spatial' urlpatterns = [ re_path(r'^$', views.index, name='index'), - re_path(r'slidingmap/', views.slidingmap, name='slidingmap'), + re_path(r'test/PSILARTEMP$', views.psilartemp, name='psilartemp'), + re_path(r'gridmap/(?P<model_id>\w+)/$', views.gridmap, name='gridmap'), ] diff --git a/spatial/views.py b/spatial/views.py index d5fac614043714ea0a8a490c71e56350eb2a40a1..5bfd2d33abc77a708d1cf8e87f239961721940ea 100644 --- a/spatial/views.py +++ b/spatial/views.py @@ -1,10 +1,20 @@ from django.shortcuts import render +from django.http import Http404 +from django.conf import settings def index(request): - context = {} + context = {"available_grid_models": settings.AVAILABLE_GRID_MODELS} return render(request, 'spatial/index.html', context) -def slidingmap(request): +def psilartemp(request): context = {} - return render(request, 'spatial/slidingMap.html', context) + return render(request, 'spatial/psilartemp.html', context) + +def gridmap(request, model_id): + for model in settings.AVAILABLE_GRID_MODELS: + if model_id == model["model_id"]: + context = {"model_id": model_id} + return render(request, 'spatial/gridmap.html', context) + return index(request) +