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

Introducing the Septoria Humidity model and stuff to cater for that

parent 7ee2b8d6
Branches
No related tags found
No related merge requests found
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog" prefer="system">
<system systemId="https://dmiweatherservice-plant.dlbr.dk/DMIWeatherService.svc" uri="wsdl/dmiweatherservice-plant.dlbr.dk/DMIWeatherService.svc.xml"/>
<system systemId="https://dmiweatherservice-plant.dlbr.dk/DMIWeatherService.svc?singleWsdl" uri="wsdl/dmiweatherservice-plant.dlbr.dk/DMIWeatherService.svc.singlewsdl.wsdl"/>
<system systemId="https://dmiweatherservice-plant.dlbr.dk/DMIWeatherService.svc?wsdl" uri="wsdl/dmiweatherservice-plant.dlbr.dk/DMIWeatherService.svc.wsdl"/>
<system systemId="https://dmiweatherservice-plant.dlbr.dk/DMIWeatherService.svc?xsd=xsd0" uri="wsdl/dmiweatherservice-plant.dlbr.dk/DMIWeatherService.svc.xsd_xsd0.xsd"/>
<system systemId="https://dmiweatherservice-plant.dlbr.dk/DMIWeatherService.svc?xsd=xsd1" uri="wsdl/dmiweatherservice-plant.dlbr.dk/DMIWeatherService.svc.xsd_xsd1.xsd"/>
<system systemId="https://dmiweatherservice-plant.dlbr.dk/DMIWeatherService.svc?xsd=xsd2" uri="wsdl/dmiweatherservice-plant.dlbr.dk/DMIWeatherService.svc.xsd_xsd2.xsd"/>
<system systemId="https://dmiweatherservice-plant.dlbr.dk/DMIWeatherService.svc?xsd=xsd3" uri="wsdl/dmiweatherservice-plant.dlbr.dk/DMIWeatherService.svc.xsd_xsd3.xsd"/>
<system systemId="https://dmiweatherservice-plant.dlbr.dk/DMIWeatherService.svc?xsd=xsd4" uri="wsdl/dmiweatherservice-plant.dlbr.dk/DMIWeatherService.svc.xsd_xsd4.xsd"/>
<system systemId="https://dmiweatherservice-plant.dlbr.dk/DMIWeatherService.svc?singleWsdl" uri="wsdl/dmiweatherservice-plant.dlbr.dk/DMIWeatherService.svc.singlewsdl.wsdl"/>
</catalog>
\ No newline at end of file
......@@ -54,6 +54,7 @@ public class VIPSLogicApplication extends Application
resources.add(no.nibio.vips.logic.modules.applefruitmoth.AppleFruitMothService.class);
resources.add(no.nibio.vips.logic.service.ObservationService.class);
resources.add(no.nibio.vips.logic.service.WeatherProxyService.class);
resources.add(no.nibio.vips.logic.service.ModelFormService.class);
resources.add(no.nibio.vips.logic.service.JacksonConfig.class);
//resources.add(no.nibio.vips.coremanager.service.ManagerResourceImpl.class);
}
......@@ -70,6 +71,7 @@ public class VIPSLogicApplication extends Application
resources.add(no.nibio.vips.logic.modules.roughage.RoughageService.class);
resources.add(no.nibio.vips.logic.service.JacksonConfig.class);
resources.add(no.nibio.vips.logic.service.LogicService.class);
resources.add(no.nibio.vips.logic.service.ModelFormService.class);
resources.add(no.nibio.vips.logic.service.ObservationService.class);
resources.add(no.nibio.vips.logic.service.VIPSMobileService.class);
resources.add(no.nibio.vips.logic.service.WeatherProxyService.class);
......
......@@ -30,7 +30,6 @@ import de.micromata.opengis.kml.v_2_2_0.Point;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.ResourceBundle;
import java.util.Set;
......@@ -461,5 +460,10 @@ public class PointOfInterestBean {
}
public WeatherStationDataSource getWeatherStationDataSource(String dataSourceName){
return em.createNamedQuery("WeatherStationDataSource.findByName", WeatherStationDataSource.class)
.setParameter("name", dataSourceName)
.getSingleResult();
}
}
......@@ -83,6 +83,7 @@ public class Organization implements Serializable {
private Integer defaultMapZoom;
@Column(name = "default_time_zone")
private String defaultTimeZone;
@JsonIgnore
@Column(name = "default_vips_core_user_id")
private Integer defaultVipsCoreUserId;
@JsonIgnore
......
......@@ -859,6 +859,14 @@ public class LogicService {
}
}
@GET
@Path("organization")
@Produces("application/json;charset=UTF-8")
public Response getOrganizations()
{
return Response.ok().entity(SessionControllerGetter.getUserBean().getOrganizations()).build();
}
/**
* Get the client to use for calling VIPSCoreManager REST services programmatically
* @return
......
/*
* Copyright (c) 2018 NIBIO <http://www.nibio.no/>.
*
* This file is part of VIPSLogic.
* VIPSLogic 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.
*
* VIPSLogic 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 VIPSLogic. If not, see <http://www.nibio.no/licenses/>.
*
*/
package no.nibio.vips.logic.service;
import com.vividsolutions.jts.geom.Coordinate;
import com.webcohesion.enunciate.metadata.Facet;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
import no.nibio.vips.entity.ModelConfiguration;
import no.nibio.vips.entity.Result;
import no.nibio.vips.entity.WeatherObservation;
import no.nibio.vips.gis.GISUtil;
import no.nibio.vips.logic.entity.Organization;
import no.nibio.vips.logic.entity.PointOfInterestWeatherStation;
import no.nibio.vips.logic.entity.WeatherStationDataSource;
import no.nibio.vips.logic.util.RunModelException;
import no.nibio.vips.logic.util.SessionControllerGetter;
import no.nibio.vips.logic.util.SystemTime;
import no.nibio.vips.util.ParseRESTParamUtil;
import no.nibio.vips.util.WeatherElements;
import no.nibio.vips.util.WeatherUtil;
import no.nibio.vips.util.XDate;
import no.nibio.vips.util.weather.WeatherDataSourceException;
import no.nibio.vips.util.weather.WeatherDataSourceUtil;
/**
* This is a collection of services for models run from forms (not as part of batch)
* @copyright 2018 <a href="http://www.nibio.no/">NIBIO</a>
* @author Tor-Einar Skog <tor-einar.skog@nibio.no>
*/
@Path("rest/modelform")
@Facet("restricted")
public class ModelFormService {
@GET
@Path("SEPTORIAHU/runmodel")
@Produces("application/json;charset=UTF-8")
public Response runSeptoriaHumidityModel(
@QueryParam("organizationId_countryCode") String organizationId_countryCode,
@QueryParam("weatherStationId") String weatherStationId, // Could be special ID from Danish system,
@QueryParam("dateSpraying1") String dateSpraying1,
@QueryParam("dateSpraying2") String dateSpraying2,
@QueryParam("dateGs31") String dateGs31,
@QueryParam("date3rdUpperLeafEmerging") String date3rdUpperLeafEmerging,
@QueryParam("date2ndUpperLeafEmerging") String date2ndUpperLeafEmerging,
@QueryParam("dateUpperLeafEmerging") String dateUpperLeafEmerging,
@QueryParam("dateGs75") String dateGs75,
@QueryParam("thresholdRelativeHumidity") Double thresholdRelativeHumidity,
@QueryParam("thresholdLeafWetness") Double thresholdLeafWetness,
@QueryParam("thresholdPrecipitation") Double thresholdPrecipitation,
@QueryParam("slidingHoursPast") Integer slidingHoursPast,
@QueryParam("slidingHoursAhead") Integer slidingHoursAhead,
@QueryParam("thresholdHumidPeriodHours") Integer thresholdHumidPeriodHours,
@QueryParam("sprayingProtectionDays") Integer sprayingProtectionDays,
@QueryParam("leafLifeTime") Integer leafLifeTime
){
try
{
ModelConfiguration mConf = new ModelConfiguration();
mConf.setModelId("SEPTORIAHU");
mConf.setConfigParameter("dateSpraying1", dateSpraying1);
mConf.setConfigParameter("dateSpraying2", dateSpraying2);
mConf.setConfigParameter("dateGs31", dateGs31);
mConf.setConfigParameter("date3rdUpperLeafEmerging", date3rdUpperLeafEmerging);
mConf.setConfigParameter("date2ndUpperLeafEmerging", date2ndUpperLeafEmerging);
mConf.setConfigParameter("dateUpperLeafEmerging", dateUpperLeafEmerging);
mConf.setConfigParameter("dateGs75", dateGs75);
mConf.setConfigParameter("thresholdRelativeHumidity", thresholdRelativeHumidity);
mConf.setConfigParameter("thresholdLeafWetness", thresholdLeafWetness);
mConf.setConfigParameter("thresholdPrecipitation", thresholdPrecipitation);
mConf.setConfigParameter("slidingHoursPast", slidingHoursPast);
mConf.setConfigParameter("slidingHoursAhead", slidingHoursAhead);
mConf.setConfigParameter("thresholdHumidPeriodHours", thresholdHumidPeriodHours);
mConf.setConfigParameter("sprayingProtectionDays", sprayingProtectionDays);
mConf.setConfigParameter("leafLifeTime", leafLifeTime);
// Data parsing
Integer organizationId = Integer.valueOf(organizationId_countryCode.split("_")[0]);
Organization organization = SessionControllerGetter.getUserBean().getOrganization(organizationId);
mConf.setConfigParameter("timeZone", organization.getDefaultTimeZone());
TimeZone timeZone = TimeZone.getTimeZone(organization.getDefaultTimeZone());
ParseRESTParamUtil pUtil = new ParseRESTParamUtil();
// Start time is gs31, easy
Date gs31 = pUtil.parseISODate(dateGs31,timeZone);
XDate startTime = new XDate(gs31);
startTime.addDays(-1);
// End time is whatever comes first of the day after tomorrow or Gs75
Date gs75 = pUtil.parseISODate(dateGs75, timeZone);
XDate dayAfterTomorrow = new XDate(SystemTime.getSystemTime());
dayAfterTomorrow.addDays(2);
WeatherUtil wUtil = new WeatherUtil();
dayAfterTomorrow = new XDate(wUtil.pragmaticAdjustmentToMidnight(dayAfterTomorrow, timeZone));
// The first check here is to see if the systemtime is too early
Date endTime = dayAfterTomorrow.after(gs75) ? gs75 : dayAfterTomorrow;
String countryCode = organizationId_countryCode.split("_")[1];
List<WeatherObservation> observations;
WeatherDataSourceUtil wdsUtil = new WeatherDataSourceUtil();
PointOfInterestWeatherStation ws;
if(countryCode.toLowerCase().equals("dk")){
// Create a synthetic weather station to pass into the system
// Weather station id is a UTM32N coordinate, e.g. E552700N6322400
String[] parts = weatherStationId.split("N");
Integer UTM32vE = Integer.valueOf(parts[0].substring(1));
Integer UTM32vN = Integer.valueOf(parts[1]);
GISUtil gisUtil = new GISUtil();
Coordinate UTMc = new Coordinate(UTM32vE, UTM32vN);
Coordinate coordinate = gisUtil.convertCoordinate(UTMc, "EPSG:32632", "EPSG:4326");
WeatherStationDataSource wsds = SessionControllerGetter.getPointOfInterestBean().getWeatherStationDataSource("DMI PointWeb");
ws = new PointOfInterestWeatherStation();
ws.setWeatherStationDataSourceId(wsds);
ws.setWeatherStationRemoteId(coordinate.y + "," + coordinate.x);// For some reason, The transformation switches X/Y
ws.setTimeZone(organization.getDefaultTimeZone());
//observations.stream().forEach(obs->System.out.println(obs.toString()));
}
else
{
// Weather station id maps to a regular weather station
ws = (PointOfInterestWeatherStation) SessionControllerGetter.getPointOfInterestBean().getPointOfInterest(Integer.valueOf(weatherStationId));
}
observations = wdsUtil.getWeatherObservations(
ws,
WeatherObservation.LOG_INTERVAL_ID_1H,
new String[]{
WeatherElements.TEMPERATURE_MEAN,
WeatherElements.PRECIPITATION,
WeatherElements.RELATIVE_HUMIDITY_MEAN,
WeatherElements.LEAF_WETNESS
},
startTime,
endTime
);
mConf.setConfigParameter("observations",observations);
Integer VIPSCoreUserId = organization.getDefaultVipsCoreUserId();
List<Result>results = SessionControllerGetter.getForecastBean().runForecast(mConf, VIPSCoreUserId);
return Response.ok().entity(results).build();
}
catch(WeatherDataSourceException | RunModelException ex)
{
return Response.serverError().entity(ex.getMessage()).build();
}
}
}
......@@ -110,7 +110,7 @@ public class DMIPointWebDataParser {
} catch (Exception ex) {
Logger.getLogger(DMIPointWebDataParser.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Number of extracted weather data = " + retVal.size());
//System.out.println("Number of extracted weather data = " + retVal.size());
return retVal;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment