Skip to content
Snippets Groups Projects
Commit 117f5994 authored by Tor-Einar Skog's avatar Tor-Einar Skog
Browse files

Add i18n for metadata and legends

parent ca1984c1
No related branches found
No related tags found
No related merge requests found
[i18n]
# 1st is the default language
languages=en,nb
[i18n.en]
no_forecast = No forecast
no_risk = No risk
possible_risk = Possible risk
high_risk = High risk
[i18n.nb]
no_forecast = Varsel beregnes ikke
no_risk = Ingen infeksjonsrisikok
possible_risk = Mulig fare for angrep
high_risk = Høy fare for angrep
\ No newline at end of file
......@@ -21,9 +21,14 @@ from dotenv import load_dotenv
from datetime import datetime
import pytz
import netCDF4 as nc
import configparser
from jinja2 import Environment, FileSystemLoader
# Load deployment specific settings
load_dotenv()
# Get language stuff
config = configparser.ConfigParser()
config.read("PSILARTEMP.cfg")
weatherdata_path = os.getenv("WEATHER_DATA_DIR")
tmp_path = "tmp/"
......@@ -33,7 +38,7 @@ out_path = os.getenv("DATA_DIR")
utc_offset = "+02:00"
local_timezone = pytz.timezone("Europe/Oslo")
"""
# Calculate cumulated degree days above 5 degrees after 1st of April
# Remove all values before April 1st
subprocess.run(f"cdo -selname,TM -seldate,2023-04-01T00:00:00,2023-12-31T00:00:00 {weatherdata_path}met_1_0km_nordic-2023.nc {tmp_path}TM_from_april.nc", shell=True)
......@@ -61,6 +66,8 @@ else:
# (A>0)*(A<=260)*2 + (A>260)*(A<=360)*3 + (A>360)*(A<=560)*4 + (A>560)*0
subprocess.run(f'cdo -aexpr,"WARNING_STATUS=(TM>0)*(TM<=260)*2 + (TM>260)*(TM<=360)*3 + (TM>360)*(TM<=560)*4 + (TM>560)*0" {tmp_path}DD.nc {tmp_path}result.nc', shell=True)
"""
# Split the combined file into daily .nc files again, with YYYY-MM-DD in the filename. Convert to corresponding GeoTIFF files
# Variables that needs discrete classification, must be integers in order for mapserver to work properly (Don't ask!)
# Since we need WARNING_STATUS to be discretely classified, we need to create a separate GeoTIFF file for it
......@@ -75,6 +82,7 @@ for timestep in timesteps:
#print(f"{timestep_index}: {file_date}")
timestep_dates.append(file_date)
# We must delete the GeoTIFF file before merging
"""
subprocess.run(f'rm {tmp_path}result_*{file_date}_lcc.tif', shell=True)
subprocess.run(f'rm {out_path}result_*{file_date}.tif', shell=True)
with open("/dev/null", "w") as devnull:
......@@ -83,6 +91,7 @@ for timestep in timesteps:
# Need to reproject the files, to ensure we have the projection given in the generted mapfile. We always use EPSG:4326 for this
subprocess.run(f'gdalwarp -t_srs EPSG:4326 {tmp_path}result_WARNING_STATUS_{file_date}_lcc.tif {out_path}result_WARNING_STATUS_{file_date}.tif', shell=True, stdout=devnull)
subprocess.run(f'gdalwarp -t_srs EPSG:4326 {tmp_path}result_{file_date}_lcc.tif {out_path}result_{file_date}.tif', shell=True, stdout=devnull)
"""
timestep_index = timestep_index + 1
if len(timestep_dates) != len(set(timestep_dates)):
......@@ -92,6 +101,15 @@ if len(timestep_dates) != len(set(timestep_dates)):
#print(len(timestep_dates))
# Generate mapfile
# Building data sets for language specific legends
languages = []
for language_code in config["i18n"]["languages"].split(","):
language = {"language_code": language_code}
if ("i18n.%s" % language_code) in config:
for keyword in config["i18n.%s" % language_code]:
language[keyword] = config["i18n.%s" % language_code][keyword]
languages.append(language)
# The paths should be set in a .env file
env = Environment(loader=FileSystemLoader('.'))
template = env.get_template("mapfile/template.j2")
......@@ -101,7 +119,8 @@ output = template.render({
"mapserver_mapfile_dir": os.getenv("MAPSERVER_MAPFILE_DIR"),
"mapserver_log_file": os.getenv("MAPSERVER_LOG_FILE"),
"mapserver_image_path": os.getenv("MAPSERVER_IMAGE_PATH"),
"mapserver_extent": os.getenv("MAPSERVER_EXTENT")
"mapserver_extent": os.getenv("MAPSERVER_EXTENT"),
"languages": languages
})
mapfile_outdir = os.getenv("MAPFILE_DIR")
with open(f"{mapfile_outdir}/PSILARTEMP.map", 'w') as f:
......
......@@ -35,8 +35,34 @@ WEB
# List of standard metadata: https://mapserver.org/ogc/wms_server.html#web-object-metadata
# i18n support: https://mapserver.org/ogc/inspire.html#inspire-multi-language-support
METADATA
"wms_inspire_capabilities" "embed"
"wms_languages" "en,nb" # The first is the default
"wms_keywordlist" "VIPS model Carrot Rust Fly (PSILARTEMP)"
"wms_abstract" "
"wms_abstract.nb" "
<h2>Modellbeskrivelse</h2>
<p>Varslingsmodellen &laquo;Gulrotflue svermetidspunkt&raquo; er basert p&aring; en finsk, temperaturbasert modell (Markkula <em>et al</em>, 1998; Tiilikkala &amp; Ojanen, 1999; Markkula <em>et al</em>, 2000). Modellen beregner tidspunkt for sverming av 1. generasjon og 2. generasjon av gulrotflue basert p&aring; akkumulering av graddager (d&oslash;gngrader) over en basistemperatur p&aring; 5 &deg;C. I VIPS benyttes modellen kun for 1. generasjon.</p>
<p>Det er standard lufttemperatur (temperatur m&aring;lt 2 m over bakken) som benyttes i modellen. Graddager er her definert som summen av differansen mellom en basistemperatur p&aring; 5 &deg;C og d&oslash;gnmiddeltemperatur for alle d&oslash;gn med temperatur &gt;5 &deg;C dvs. summen av (d&oslash;gnmiddeltemperatur - 5 &deg;C) fra 1. mars (fra det er telefritt i jorda).</p>
<h2>Tolking av varsel</h2>
<p>Gr&oslash;nne bokser betyr at svermingen enda ikke har begynt. Akkumulering av d&oslash;gngrader er &lt; 260 graddager (d&oslash;gngrader).</p>
<p>Gule bokser betyr svermingen er i startfasen og at man m&aring; v&aelig;re obs p&aring; at det kan komme innflyvere i &aring;keren. Akkumulering av d&oslash;gngrader er &ge; 260 graddager (d&oslash;gngrader).</p>
<p>R&oslash;de bokser betyr svermingen er p&aring; sitt mest aktive. Akkumulering av d&oslash;gngrader er &ge; 360 graddager (d&oslash;gngrader).</p>
<p>Gr&aring; bokser betyr at svermingen av 1. generasjon er over og varslingen er avsluttet. Akkumulering av d&oslash;gngrader er &ge; 560 graddager (d&oslash;gngrader).</p>
<p>V&aelig;r klar over at i omr&aring;der med dekke (plast, enkel og dobbel fiberduk el. lign.) ved tidligproduksjon (enten p&aring; samme jorde eller nabojorder) &aring;ret f&oslash;r, kan svermingen starte tidligere p&aring; grunn av h&oslash;yere jordtemperatur under dekket.</p>
<h2>Varslingssesong &ndash; oppstart og avslutning av varsel</h2>
<p>Starttidspunkt: Vises i VIPS fra 1. april (startdato for akkumulering av graddager fra det er telefritt) i jorda.</p>
<p>Sluttidspunkt: N&aring;r modellen har n&aring;dd kravet til d&oslash;gngrader for avsluttet sverming av 1. generasjon (560 d&oslash;gngrader).</p>
<h2>Utpr&oslash;ving og validering av modellen</h2>
<h3>Nasjonalt</h3>
<p>Modellen har v&aelig;rt testet og evaluert for norske forhold i perioden 2011-2015. Valideringen har vist at modellen stemte ganske bra for de fleste steder for 1. generasjon. Modellen stemte imidlertid d&aring;rlig for 2. generasjon for mange lokaliteter og var direkte feil for J&aelig;ren-distriktet. P&aring; bakgrunn av resultatene fra valideringen har vi derfor valgt &aring; fjerne varsling av 2. generasjon gulrotflue med denne modellen.</p>
<h3>Internasjonalt</h3>
<p>Modellen er i bruk i Finland. Det er usikkert hvor omfattende modellen er validert i Finland, men det er utf&oslash;rt en validering sommeren 1997. Denne valideringen tilsa at modellen stemte noks&aring; bra, men at terskeltemperatursummen burde reduseres til 255 graddager for svermingsstart (mot 260 graddager i den opprinnelige modellen) og 355 graddager for svermetoppen (mot 360 daggrader i den opprinnelige modellen) (Tiilikkala &amp; Ojanen, 1999).</p>
<h2>Referanser</h2>
<ul>
<li>Markkula, I., H. Ojanen and K. Tiilikkala. 1998. Forecasting and monitoring of the carrot fly (Psila rosae) in Finland. The 1998 Brighton Conference: Pests and Diseases: Conference Proceedings, Volume 2, pages 657-662.</li>
<li>Tiilikkala, K. and H. Ojanen. 1999. Use of a geographical information system (GIS) for forecasting the activities of carrot fly and cabbage root fly. IOBC/WPRS Bulletin 22 (5): 15-24.</li>
<li>Markkula, I., A. Hannukkala, A. Lehtinen, I. Mattila, H. Ojanen, S. Raisjio, P. Reijonen and K. Tiilikkala. 2000. Pest warnings and forecasts sent as SMS messages from models into &quot;farmer's pocket&quot;. In publication: Pests &amp; Diseases 2000. Proceedings of an international conference held at the Brighton Hilton Metropole Hotel, UK, 13-16 November 2000. BCPC Conference Proceedings pages 285-290.</li>
"
"wms_abstract.en" "
<p>The warning system model &laquo;Carrot rust fly temperature&raquo; is based on a Finnish temperature-based model (Markkula <em>et al</em>, 1998; Tiilikkala &amp; Ojanen, 1999; Markkula <em>et al</em>, 2000). The model determines the start of the flight period for the 1st and 2nd generation of carrot rust fly based on accumuleted degree-days (day-degrees) over a base temperature of 5,0 &deg;C. VIPS uses the model for the 1st generation only.</p>
<p>Standard air temperature (temperature measured 2 m above ground) is used in the model. Degree-days are defined for this model as the sum of the difference between a base temperature of 5,0 &deg;C and the mean temperature for all days with a temperature &gt;5,0 &deg;C, in other words (daily mean temperature &ndash; 5,0 &deg;C) from 1 March (beginning when the ground has thawed).</p>
<h3>Interpretation of the warning</h3>
......@@ -62,7 +88,8 @@ WEB
<p>Annette Folkedal Schj&oslash;ll <a href=\"mailto:annette.folkedal.schjoll@nibio.no\">annette.folkedal.schjoll@nibio.no</a><br />Tor J. Johansen <a href=\"mailto:tor.johansen@nibio.no\">tor.johansen@nibio.no</a></p>
"
"wms_enable_request" "*"
"wms_title" "Carrot rust fly (Psila rosae) temperature model"
"wms_title.en" "Carrot rust fly (Psila rosae) temperature model"
"wms_title.nb" "Gulrotflue svermetidspunktmodell"
"wms_getfeatureinfo_formatlist" "text/plain,text/html,text/xml"
"wms_accessconstraints" "none"
"wms_addresstype" ""
......@@ -104,7 +131,17 @@ LAYER
STATUS ON
METADATA
"wms_title" "Carrot rust fly (Psila rosae) temperature model {{ timestep_date }}"
"wms_title" "Carrot rust fly (Psila rosae) temperature model {{ timestep_date }}"
{% for language in languages %}
"wms_abstract.{{language.language_code}}" "
<ul style=\"list-style: none; padding: 0;\">
<li style=\"margin-bottom: 5px;\"><span style=\"background-color: #707070;\">&nbsp;&nbsp;&nbsp;</span> {{language.no_forecast}}</li>
<li style=\"margin-bottom: 5px;\"><span style=\"background-color: #00B457;\">&nbsp;&nbsp;&nbsp;</span> {{language.no_risk}}</li>
<li style=\"margin-bottom: 5px;\"><span style=\"background-color: #FFCC00;\">&nbsp;&nbsp;&nbsp;</span> {{language.possible_risk}}</li>
<li><span style=\"background-color: #FF0000;\">&nbsp;&nbsp;&nbsp;</span> {{language.high_risk}}</li>
</ul>
"
{% endfor %}
END
CLASSITEM "[pixel]"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment