diff --git a/applefruitmoth/static/applefruitmoth/js/applefruitmoth.js b/applefruitmoth/static/applefruitmoth/js/applefruitmoth.js new file mode 100644 index 0000000000000000000000000000000000000000..3384a0016511db4158e70a9ff8295ec23ee98bae --- /dev/null +++ b/applefruitmoth/static/applefruitmoth/js/applefruitmoth.js @@ -0,0 +1,357 @@ + +document.addEventListener('DOMContentLoaded', setBasis); +document.title="Døgngrader"; + + + +var stations = new Array(); +var serverUri = "https://coremanager.testvips.nibio.no"; +//var serverUri = "http://localhost:8080/VIPSCore"; +var runUri= serverUri + "/models/DAYDEGREES/run"; + +var emptyChart; + + + + +function setBasis () { + + let path = "https://lmt.nibio.no/services/rest/weatherstation/mapweatherstations"; + + $.getJSON(path, function( mapStations ) { + + allStations = mapStations; + + allStations.sort(function(a,b) { + return a.name.toString().localeCompare(b.name.toString()); + }); + + for(var i=0;i<allStations.length;i++){ + stations[i]=([mapStations[i].weatherstationId, mapStations[i].name]); + + } + + for (let i = 0; i < stations.length; i++ ) { + let option = document.createElement("option"); + option.text = stations[i][1]; + option.value = stations[i][0]; + document.getElementById("weatherstation").appendChild(option); + } + + emptyChart = true; + + setStartText(); + displayResults(emptyChart); + }); + +} + + +function getBasis () { + + var basisTemp = document.getElementById('temp').value; + var startTime = document.getElementById('startdate').value; + var endTime = document.getElementById('enddate').value; + var weatherStation = document.getElementById('weatherstation').value; + + var temperature = []; + + weatherstationId = weatherStation; + + if (basisTemp > 20 || basisTemp < 0) { + alert("Basistemperaturen er usannsynlig"); + return false; + } + + + if (startTime > endTime) { + alert("Datoen er ikke gyldig"); + return false; + } + + emptyChart = false; + + $.getJSON("https://lmt.nibio.no/services/rest/vips/getdata/forecastfallback?weatherStationId="+weatherStation+"&elementMeasurementTypes[]=TM&logInterval=1d&startDate="+startTime+"&startTime=00&endDate="+endTime+"&endTime=23&timeZone=Europe/Oslo", function( observations ) { + $.getJSON("https://lmt.nibio.no/services/rest/weatherstation/getstation?weatherStationId="+weatherStation, function( weatherstation ) { + allObservations = weatherstation; + var name = String(weatherstation.name); + runModel(basisTemp, observations, name, startTime, endTime); + }); + }); + +} + +/** + * Calls the dayDegreemodel in the VIPS forecasting system + * Displays data when results are returned + */ +function runModel (basisTemp, data, name, start, end) { + + var modelConfig = { + "loginInfo":{ + "username":"testuser", + "password":"testpass" + }, + "modelId":"DAYDEGREES", + "configParameters":{ + "basisTemp": basisTemp, + "observations": data + } + }; + + var request = $.ajax({ + type:"POST", + url: runUri, + data: JSON.stringify(modelConfig), + dataType: "json", + contentType: "application/json; charset=utf-8", + }) + .done(function(data, textStatus, jqXHR) { + displayResults(data, basisTemp, name, start, end); + }) + .fail(function( jqXHR, textStatus,errorThrown ) { + alert( "Request failed: " + errorThrown ); + }) + .always(function() { + alert( "complete" ); + }) + ; +} + +function displayResults(data, basisTemp, name, start, end) { + + let date = new Array(); + let series = []; + let time = new Array(); + let temperature = new Array(); + let forecast = new Array(); + + + if(!emptyChart) { + for (var i = 0; i < data.length; i++){ + + var localTime = new Date(data[i].validTimeStart); + const offset = localTime.getTimezoneOffset() + localTime= new Date(localTime.getTime() - (offset*60*1000)) + + if(localTime < moment()){ + temperature.push(parseInt((data[i].allValues).match(/[-+]?([0-9]*\.[0-9]+|[0-9]+)/))); + forecast.push(null); + } else{ + forecast.push(parseInt((data[i].allValues).match(/[-+]?([0-9]*\.[0-9]+|[0-9]+)/))); + } + + localTime = localTime.toISOString().split('T')[0]; + time.push(localTime); + } + // Fill the gap between temperature and forecast + let index = temperature.length-1; + forecast[index]=temperature[index]; + + const lastValue = forecast[forecast.length -1]; + + // Set x-axis interval to 7 days + var maxTicksLimit = time.length / 7; + var rotation = 0; + if(maxTicksLimit > 10) { + rotation = 20; + maxTicksLimit = 11; + } + + document.getElementById("textInfo").innerText = ""; + + let infotext = document.createElement("p"); + var text1 = "<p>Varmesum, med basistemperatur " + basisTemp + " °C beregnet ut fra middeltemperatur i 2m høyde for " + name + " værstasjon for perioden fra og med " + start + " til og med " + end + " er: </p>"; + var text2 = "<p><b>" + lastValue + "</b> døgngrader\n\n</p>"; + + infotext = text1 + text2; + + document.getElementById("textInfo").innerHTML=infotext; + + } else{ + for (var i = 0; i < 10; i++){ + time.push(null); + forecast.push(null); + name = 'Alvdal'; + start = '-'; + end = '-'; + } + } + + + + + var chartExist = Chart.getChart("daydegreesum"); + + if(chartExist != undefined){ + chartExist.destroy(); + } + + var ctx = document.getElementById("daydegreesum").getContext('2d'); + + + series[0] = { + label: "Døgngrader", + data: temperature, + borderColor: '#ff0000', + borderWidth: 2, + spanGaps: true, + fill: { + target: 174, + above: 'rgb(255, 0, 0)', // Area will be red above the origin + below: 'rgb(0, 0, 255)' // And blue below the origin + } + }; + + series[1] = { + label: "Døgngrader prognose", + data: forecast, + borderColor: '#ff0000', + borderDash: [3, 3], + borderWidth: 2, + spanGaps: true + }; + + var data = { + labels: time, + datasets: series + }; + + var text = String("Varmesum for " + name + " i perioden " + start + " til " + end ); + + new Chart(ctx, { + type: 'line', + data: data, + options: { + scales: { + x: { + ticks: { + maxTicksLimit: maxTicksLimit, + maxRotation: rotation + } + }, + y: { + display: true, + title: { + display: true, + text: '°C' + } + }, + }, + elements: { + point:{ + radius: 0 + } + }, + plugins: { + title: { + display: true, + text: text, + fontSize: 18 + }, + legend: { + display: true, + labels: { + boxHeight: 1 + }, + position: 'bottom' + }, + tooltip: { + intersect: false, + displayColors: false, + callbacks: { + title: function () { + return ''; + }, + label: function (context) { + const date = context.label; + const value = context.parsed.y; + return `${date} er varmesummen ${value} °C`; + } + } + }, + annotation: { + annotations: [{ + type: 'line', + mode: 'horizontal', + scaleID: 'y', + value: 174, + borderColor: 'grey', + borderWidth: 2, + borderDash: [5, 5], + label: { + color: 'grey', + backgroundColor: 'transparent', + content: 'Sverming', + font: { + size: 14 + }, + enabled: true, + position: 'end', + xAdjust: 10, + yAdjust: -10 + } + }, { + type: 'line', + mode: 'horizontal', + scaleID: 'y', + value: 320, + borderColor: 'grey', + borderWidth: 2, + borderDash: [5, 5], + label: { + color: 'grey', + backgroundColor: 'transparent', + content: 'Egglegging', + font: { + size: 14 + }, + enabled: true, + position: 'end', + xAdjust: 10, + yAdjust: -10 + } + }, { + type: 'line', + mode: 'horizontal', + scaleID: 'y', + value: 565, + borderColor: 'grey', + borderWidth: 2, + borderDash: [5, 5], + label: { + color: 'grey', + backgroundColor: 'transparent', + content: 'Klekking', + font: { + size: 14 + }, + enabled: true, + position: 'end', + xAdjust: 10, + yAdjust: -10 + } + } + ] + } + } + } + }); + + + + +} + +function setStartText (){ + + document.getElementById("textInfo").innerText = ""; + + let infotext = document.createElement("p"); + infotext = "<p>Varmesum, med basistemperatur 0 °C beregnes ut fra middeltemperatur i 2m høyde for valgt værstasjon for en gitt periode. </p>"; + + document.getElementById("textInfo").innerHTML=infotext; + +} + + diff --git a/applefruitmoth/templates/applefruitmoth/index.html b/applefruitmoth/templates/applefruitmoth/index.html index 4d2f2218113268e6c719dc2d301d7b74bff8724c..1749e12e2bc321cb516ce6543da4b936f22ee58b 100755 --- a/applefruitmoth/templates/applefruitmoth/index.html +++ b/applefruitmoth/templates/applefruitmoth/index.html @@ -67,22 +67,90 @@ </div> </div> +<div class="singleBlockContainer"> + <br><h2>Døgngrader for rognebærmøll</h2><br> + <div class="row"> + <div class="col-md-12"> + <div class="form-group"> + <p>Utviklinga til rognebærmøll er avhengig av temperatur, slik at utviklingsfarten og tidspunkt for tiltak variere mellom ulike distrikt. For å vurdere tidspunktet må du ha notert når rogna sto i full blom og rekne ut varmesum etter det.</p> + <div class="row"><br><br> + <div style="font-size:75%;" id="setBasis"></div> + + <div class="col-md-3"> + <div class="form-group"> + <label for="weatherstation">Målestasjon</label> + <select id="weatherstation" class="form-control"></select> + </div> + + <div class="form-group"> + <label for="temp">Basistemperatur, °C</label> + <input type="text" value=0.0 id="temp" class="form-control"> + </div> + + <div class="form-group"> + <label for="startdate">Dato for full blom i rogn</label> + <input type="date" id="startdate" class="form-control"> + </div> + + <div class="form-group"> + <label for="enddate">Sluttdato, med prognose 9 døgn frem i tid</label> + <input type="date" value=moment().add(7,'days').format('YYYY-MM-DD'); id="enddate" class="form-control"> + </div> + + <br> + <div class="form-group"> + <button type="button" class="btn btn-primary" onclick="getBasis(this)">Beregn</button> + <br><br><br> + </div> + + </div> + + <div class="col-md-8"> + <div class="col-md-1"></div> + <div class="col-md-10"> + <div class="form-group" id="textInfo" ></div> + </div> + <div class="col-md-1"></div> + </div> + + </div> + <br> + </div> + + </div> + </div> + + <div class="row"> + <div class="col-md-1"></div> + <div class="col-md-10"> + <canvas id="daydegreesum" height="150"></canvas> + </div> + <div class="col-md-1"></div> + </div><br> +</div> + {% endblock %} {% block customCSS %} <link rel="stylesheet" href="{% static "css/3rdparty/ol.css" %}" type="text/css"> {% endblock %} {% block customJS %} +<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.7.1/chart.min.js"></script> +<script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-annotation@1.0.2"></script> <script type="text/javascript" src="{% static "js/3rdparty/ol.js" %}"></script> <script type="text/javascript" src="{% url "javascript-catalog" %}"></script> <script type="text/javascript" src="{% url "views.settings_js" %}"></script> <script type="text/javascript" src="{% static "js/util.js" %}"></script> <script type="text/javascript" src="{% static "applefruitmoth/js/map.js" %}"></script> +<script type="text/javascript" src="{% static "applefruitmoth/js/test.js" %}"></script> +<script src="{% static "js/3rdparty/moment-with-locales.min.js" %}"></script> <script type="text/javascript"> + $(document).ready(function() { initMap("appleFruitMothForecastMap","{{settings.MAP_ATTRIBUTION|safe}}"); + }); </script> {% endblock %} \ No newline at end of file