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

Merge branch 'develop' into 'master'

Develop

See merge request VIPS/VIPSCommon!9
parents 4878dd6f f4564441
No related branches found
No related tags found
No related merge requests found
Showing
with 1517 additions and 52 deletions
......@@ -100,19 +100,18 @@
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-api</artifactId>
<version>20.3</version>
</dependency>
<dependency>
<version>20.5</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-epsg-hsql</artifactId>
<version>20.3</version>
<version>20.5</version>
</dependency>
<dependency>
<groupId>org.renjin</groupId>
<artifactId>renjin-script-engine</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>com.kjetland</groupId>
<artifactId>mbknor-jackson-jsonschema_2.13</artifactId>
<version>1.0.36</version>
</dependency>
<dependency>
<groupId>com.bedatadriven</groupId>
<artifactId>jackson-datatype-jts</artifactId>
......@@ -135,19 +134,32 @@
<artifactId>unit-ri</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>org.renjin</groupId>
<artifactId>renjin-script-engine</artifactId>
<version>RELEASE</version>
</dependency>
</dependencies>
<repositories>
<repository>
<repository>
<id>bedatadriven</id>
<name>bedatadriven public repo</name>
<url>https://nexus.bedatadriven.com/content/groups/public/</url>
</repository>
<repository>
<repository>
<id>osgeo</id>
<name>OSGEO</name>
<url>https://download.osgeo.org/webdav/geotools/</url>
</repository>
<name>OSGeo Release Repository</name>
<url>https://repo.osgeo.org/repository/release/</url>
<snapshots><enabled>false</enabled></snapshots>
<releases><enabled>true</enabled></releases>
</repository>
<repository>
<id>osgeo-snapshot</id>
<name>OSGeo Snapshot Repository</name>
<url>https://repo.osgeo.org/repository/snapshot/</url>
<snapshots><enabled>true</enabled></snapshots>
<releases><enabled>false</enabled></releases>
</repository>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
......
/*
* Copyright (c) 2020 NIBIO <http://www.nibio.no/>.
*
* This file is part of IPMDecisionsWeatherService.
* IPMDecisionsWeatherService is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* IPMDecisionsWeatherService 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
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with IPMDecisionsWeatherService. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.ipmdecisions.weather.entity;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
import com.kjetland.jackson.jsonSchema.annotations.JsonSchemaTitle;
import javax.validation.constraints.NotNull;
/**
* @copyright 2020 <a href="http://www.nibio.no/">NIBIO</a>
* @author Tor-Einar Skog <tor-einar.skog@nibio.no>
*/
public class LocationWeatherData {
@NotNull
@JsonSchemaTitle("Longitude (WGS84)")
@JsonPropertyDescription("The longitude of the location. Decimal degrees (WGS84)")
private Double longitude;
@NotNull
@JsonSchemaTitle("Latitude (WGS84)")
@JsonPropertyDescription("The latitude of the location. Decimal degrees (WGS84)")
private Double latitude;
@JsonSchemaTitle("Altitude (Meters)")
@JsonPropertyDescription("The altitude of the location. Measured in meters")
private Double altitude;
@JsonSchemaTitle("Weather data per location")
@JsonPropertyDescription("The data. In rows, ordered chronologically. Columns ordered as given in weatherParameters.")
private Double[][] data;
public LocationWeatherData(Double longitude, Double latitude, Double altitude, int rows, int columns){
this.longitude = longitude;
this.latitude = latitude;
this.altitude = altitude;
this.data = new Double[rows][columns];
}
public LocationWeatherData(){
}
/**
*
* @return The number of rows in the dataset
*/
public Integer getLength()
{
return this.data.length;
}
/**
*
* @return The number of parameters per rows in the dataset
*/
public Integer getWidth()
{
return this.data[0].length;
}
public Double[][] getData()
{
return this.data;
}
public void setData(Double[][] data)
{
this.data = data;
}
public void setValue(Integer row, Integer column, Double value)
{
this.data[row][column] = value;
}
public Double getValue(Integer row, Integer column)
{
return this.data[row][column];
}
public Double[] getRow(Integer row)
{
return this.data[row];
}
public Double[] getColumn(Integer column)
{
Double[] columnValues = new Double[this.data.length];
for(Integer i=0; i < this.data.length; i++)
{
columnValues[i] = this.data[i][column];
}
return columnValues;
}
@Override
public String toString()
{
String retVal = "";
for(Integer i=0;i<this.data.length;i++)
{
retVal += i + "";
for(Integer j = 0; j < this.data[i].length; j++)
{
retVal += "\t" + this.data[i][j];
}
retVal += "\n";
}
return retVal;
}
/**
* @return the longitude
*/
public Double getLongitude() {
return longitude;
}
/**
* @param longitude the longitude to set
*/
public void setLongitude(Double longitude) {
this.longitude = longitude;
}
/**
* @return the latitude
*/
public Double getLatitude() {
return latitude;
}
/**
* @param latitude the latitude to set
*/
public void setLatitude(Double latitude) {
this.latitude = latitude;
}
/**
* @return the altitude
*/
public Double getAltitude() {
return altitude;
}
/**
* @param altitude the altitude to set
*/
public void setAltitude(Double altitude) {
this.altitude = altitude;
}
}
/*
* Copyright (c) 2020 NIBIO <http://www.nibio.no/>.
*
* This file is part of IPMDecisionsWeatherService.
* IPMDecisionsWeatherService is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* IPMDecisionsWeatherService 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
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with IPMDecisionsWeatherService. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.ipmdecisions.weather.entity;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
import com.kjetland.jackson.jsonSchema.annotations.JsonSchemaDescription;
import com.kjetland.jackson.jsonSchema.annotations.JsonSchemaExamples;
import com.kjetland.jackson.jsonSchema.annotations.JsonSchemaInject;
import com.kjetland.jackson.jsonSchema.annotations.JsonSchemaString;
import com.kjetland.jackson.jsonSchema.annotations.JsonSchemaTitle;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Positive;
import javax.validation.constraints.Size;
/**
* We are using this tool to serialize to Json Schema: https://github.com/mbknor/mbknor-jackson-jsonSchema
*
* @copyright 2020 <a href="http://www.nibio.no/">NIBIO</a>
* @author Tor-Einar Skog <tor-einar.skog@nibio.no>
*/
@JsonSchemaInject(strings = {
@JsonSchemaString(path = "$id", value="https://ipmdecisions.nibio.no/WeatherService/rest/schema/weatherdata"),
@JsonSchemaString(path = "properties/timeStart/type", value="string")
}
)
@JsonSchemaTitle("Weather Data")
@JsonSchemaExamples("https://ipmdecisions.nibio.no/WeatherService/rest/forecasts/yr/?longitude=14.3711&latitude=67.2828&altitude=70")
@JsonSchemaDescription("Version 0.1. The schema describes the weather data format for the IPM Decisions platform. See an example here: https://ipmdecisions.nibio.no/WeatherService/rest/forecasts/yr/?longitude=14.3711&latitude=67.2828&altitude=70")
public class WeatherData {
@NotNull
@JsonSchemaTitle("Time start (yyyy-MM-dd'T'HH:mm:ssXXX)")
@JsonPropertyDescription("The timestamp of the first weather observation. Format: \"yyyy-MM-dd'T'HH:mm:ssXXX\", e.g. 2020-04-09T18:00:00+02:00")
private Instant timeStart;
@NotNull
@JsonSchemaTitle("Time end (yyyy-MM-dd'T'HH:mm:ssXXX)")
@JsonPropertyDescription("The timestamp of the last weather observation. Format: \"yyyy-MM-dd'T'HH:mm:ssXXX\", e.g. 2020-04-09T18:00:00+02:00")
private Instant timeEnd;
@NotNull
@Positive
@JsonSchemaTitle("Sampling frequency (seconds)")
@JsonPropertyDescription("The sampling frequency in seconds. E.g. 3600 = hourly values")
private Integer interval;
@NotNull
@Size(min=1)
@JsonSchemaTitle("Weather parameters")
@JsonPropertyDescription("The weather parameters. For reference, see https://ipmdecisions.nibio.no/WeatherService/rest/parameter/list")
private Integer[] weatherParameters;
@JsonSchemaTitle("Weather data")
@JsonPropertyDescription("The weather data per location.")
private List<LocationWeatherData> locationWeatherData;
/**
* @return the timeStart
*/
public Instant getTimeStart() {
return timeStart;
}
/**
* @param timeStart the timeStart to set
*/
public void setTimeStart(Instant timeStart) {
this.timeStart = timeStart;
}
/**
* @return the timeEnd
*/
public Instant getTimeEnd() {
return timeEnd;
}
/**
* @param timeEnd the timeEnd to set
*/
public void setTimeEnd(Instant timeEnd) {
this.timeEnd = timeEnd;
}
/**
* @return the interval
*/
public Integer getInterval() {
return interval;
}
/**
* @param interval the interval to set
*/
public void setInterval(Integer interval) {
this.interval = interval;
}
/**
* @return the weatherParameters
*/
public Integer[] getWeatherParameters() {
return weatherParameters;
}
/**
* @param weatherParameters the weatherParameters to set
*/
public void setWeatherParameters(Integer[] weatherParameters) {
this.weatherParameters = weatherParameters;
}
/**
* @return the locationWeatherData
*/
public List<LocationWeatherData> getLocationWeatherData() {
return locationWeatherData;
}
/**
* @param locationWeatherData the locationWeatherData to set
*/
public void setLocationWeatherData(List<LocationWeatherData> locationWeatherData) {
this.locationWeatherData = locationWeatherData;
}
public void addLocationWeatherData(LocationWeatherData locationWeatherData) {
if (this.locationWeatherData == null)
{
this.locationWeatherData = new ArrayList<>();
}
this.locationWeatherData.add(locationWeatherData);
}
}
/*
* Copyright (c) 2020 NIBIO <http://www.nibio.no/>.
*
* This file is part of IPMDecisionsWeatherService.
* IPMDecisionsWeatherService is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* IPMDecisionsWeatherService 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
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with IPMDecisionsWeatherService. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.ipmdecisions.weather.entity;
import javax.validation.constraints.NotNull;
/**
* @copyright 2020 <a href="http://www.nibio.no/">NIBIO</a>
* @author Tor-Einar Skog <tor-einar.skog@nibio.no>
*/
public class WeatherParameter {
@NotNull
private Integer parameterCode;
@NotNull
private String name;
private String description;
@NotNull
private String unit;
/**
* @return the parameterCode
*/
public Integer getParameterCode() {
return parameterCode;
}
/**
* @param parameterCode the parameterCode to set
*/
public void setParameterCode(Integer parameterCode) {
this.parameterCode = parameterCode;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the description
*/
public String getDescription() {
return description;
}
/**
* @param description the description to set
*/
public void setDescription(String description) {
this.description = description;
}
/**
* @return the unit
*/
public String getUnit() {
return unit;
}
/**
* @param unit the unit to set
*/
public void setUnit(String unit) {
this.unit = unit;
}
}
......@@ -27,6 +27,7 @@ import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import no.nibio.vips.entity.ModelConfiguration;
import no.nibio.vips.ipmdecisions.IPMDecisionsModelConfiguration;
/**
* Interface for the ModelResource. Implemented by ModelResourceImpl
......@@ -175,5 +176,9 @@ public interface ModelResource {
@Produces("application/json")
public Response runModel(@PathParam("modelId") String modelId, ModelConfiguration config);
@POST
@Path("models/{modelId}/run/ipmd")
@Consumes("application/json")
@Produces("application/json")
public Response runModelForIPMDecisions(@PathParam("modelId") String modelId, IPMDecisionsModelConfiguration config);
}
/*
* Copyright (c) 2020 NIBIO <http://www.nibio.no/>.
*
* This file is part of VIPSCommon.
* VIPSCommon 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.
*
* VIPSCommon 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 VIPSCommon. If not, see <http://www.nibio.no/licenses/>.
*
*/
package no.nibio.vips.ipmdecisions;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import net.ipmdecisions.weather.entity.LocationWeatherData;
import net.ipmdecisions.weather.entity.WeatherData;
import no.nibio.vips.entity.WeatherObservation;
/**
* @copyright 2020 <a href="http://www.nibio.no/">NIBIO</a>
* @author Tor-Einar Skog <tor-einar.skog@nibio.no>
*/
public class DataTransformer {
public List<WeatherObservation> getVIPSWeatherData(WeatherData IPMWeatherData)
{
List<WeatherObservation> retVal = new ArrayList<>();
IPMDecisionsWeatherUtil ipmUtil = new IPMDecisionsWeatherUtil();
Integer logIntervalId = IPMWeatherData.getInterval().equals(3600) ? WeatherObservation.LOG_INTERVAL_ID_1H
: WeatherObservation.LOG_INTERVAL_ID_1D;
LocationWeatherData oneLocation = IPMWeatherData.getLocationWeatherData().get(0);
Double[][] data = oneLocation.getData();
Instant currentTimeStamp = IPMWeatherData.getTimeStart();
for(int i=0; i<data.length; i++)
{
// Calculate the timeMeasured for this row
for(int j=0; j<data[i].length;j++)
{
WeatherObservation VIPSObs = new WeatherObservation();
VIPSObs.setTimeMeasured(Date.from(currentTimeStamp));
VIPSObs.setLogIntervalId(logIntervalId);
VIPSObs.setElementMeasurementTypeId(ipmUtil.getVIPSParameterId(IPMWeatherData.getWeatherParameters()[j]));
VIPSObs.setValue(data[i][j]);
retVal.add(VIPSObs);
}
currentTimeStamp = currentTimeStamp.plusSeconds(IPMWeatherData.getInterval());
}
return retVal;
}
}
/*
* Copyright (c) 2020 NIBIO <http://www.nibio.no/>.
*
* This file is part of VIPSCommon.
* VIPSCommon 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.
*
* VIPSCommon 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 VIPSCommon. If not, see <http://www.nibio.no/licenses/>.
*
*/
package no.nibio.vips.ipmdecisions;
import net.ipmdecisions.weather.entity.WeatherData;
import no.nibio.vips.entity.ModelConfiguration;
/**
* @copyright 2020 <a href="http://www.nibio.no/">NIBIO</a>
* @author Tor-Einar Skog <tor-einar.skog@nibio.no>
*/
public class IPMDecisionsModelConfiguration extends ModelConfiguration{
private WeatherData IPMWeatherData;
public void setWeatherData(WeatherData weatherData)
{
this.IPMWeatherData = weatherData;
}
public WeatherData getWeatherData()
{
return this.IPMWeatherData;
}
}
/*
* Copyright (c) 2020 NIBIO <http://www.nibio.no/>.
*
* This file is part of LMTServices.
* LMTServices 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.
*
* LMTServices 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 LMTServices. If not, see <http://www.nibio.no/licenses/>.
*
*/
package no.nibio.vips.ipmdecisions;
import java.util.Map;
import no.nibio.vips.util.WeatherElements;
/**
* @copyright 2020 <a href="http://www.nibio.no/">NIBIO</a>
* @author Tor-Einar Skog <tor-einar.skog@nibio.no>
*/
public class IPMDecisionsWeatherUtil {
private final Map<String, Integer> VIPSToIPM = Map.of(
WeatherElements.TEMPERATURE_MEAN,1002, // TM
WeatherElements.PRECIPITATION, 2001, // RR
WeatherElements.RELATIVE_HUMIDITY_MEAN, 3002, // UM
WeatherElements.GLOBAL_RADIATION, 5001,// Q0
WeatherElements.LEAF_WETNESS_DURATION, 3101 // BT
);
private final Map<Integer, String> IPMToVIPS = Map.of(
1002,WeatherElements.TEMPERATURE_MEAN, // TM
2001, WeatherElements.PRECIPITATION, // RR
3002, WeatherElements.RELATIVE_HUMIDITY_MEAN, // UM
5001, WeatherElements.GLOBAL_RADIATION, // Q0
3101, WeatherElements.LEAF_WETNESS_DURATION // BT
);
public Integer getIPMParameterId(String VIPSParameterId)
{
return this.VIPSToIPM.get(VIPSParameterId);
}
public String getVIPSParameterId(Integer IPMParameterId)
{
return this.IPMToVIPS.get(IPMParameterId);
}
//public WeatherData deserializeWeatherData(Object)
}
/*
* Copyright (c) 2020 NIBIO <http://www.nibio.no/>.
*
* This file is part of VIPSCommon.
* VIPSCommon 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.
*
* VIPSCommon 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 VIPSCommon. If not, see <http://www.nibio.no/licenses/>.
*
*/
package no.nibio.vips.ipmdecisions;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.ObjectCodec;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import java.io.IOException;
import net.ipmdecisions.weather.entity.LocationWeatherData;
/**
* @copyright 2020 <a href="http://www.nibio.no/">NIBIO</a>
* @author Tor-Einar Skog <tor-einar.skog@nibio.no>
*/
public class LocationWeatherDataDeserializer extends JsonDeserializer<LocationWeatherData>{
@Override
public LocationWeatherData deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException {
ObjectCodec oc = jp.getCodec();
JsonNode oneLocation = oc.readTree(jp);
LocationWeatherData lwd = new LocationWeatherData(
oneLocation.get("longitude").asDouble(),
oneLocation.get("latitude").asDouble(),
oneLocation.get("altitude").asDouble(),
oneLocation.get("data").size(),
oneLocation.get("data").get(0).size());
for(int i=0; i< oneLocation.get("data").size();i++)
{
for(int j=0; j<oneLocation.get("data").get(0).size();j++)
{
lwd.setValue(i, j,oneLocation.get("data").get(i).get(j).asDouble());
}
}
return lwd;
}
}
/*
* Copyright (c) 2017 NIBIO <http://www.nibio.no/>.
*
* This file is part of VIPSCommon.
/*
* Copyright (c) 2017 NIBIO <http://www.nibio.no/>.
*
* This file is part of VIPSCommon.
* VIPSCommon is free software: you can redistribute it and/or modify
* it under the terms of the NIBIO Open Source License as published by
* 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.
*
*
* VIPSCommon 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 VIPSCommon. If not, see <http://www.nibio.no/licenses/>.
*
*
*/
package no.nibio.vips.model;
......@@ -26,51 +26,45 @@ import org.renjin.script.RenjinScriptEngineFactory;
import org.renjin.sexp.ExternalPtr;
/**
* When implementing a model using Renjin (http://www.renjin.org/ - R on the Java Virtual Machine),
* When implementing a model using Renjin (http://www.renjin.org/ - R on the
* Java Virtual Machine),
* you must extend this class.
*
* @copyright 2017 <a href="http://www.nibio.no/">NIBIO</a>
* @author Tor-Einar Skog <tor-einar.skog@nibio.no>
* @copyright 2017
* <a href="http://www.nibio.no/">NIBIO</a> * @author Tor-Einar Skog
* <tor-einar.skog@nibio.no>
*/
public abstract class RenjinModel {
protected ScriptEngine engine;
public RenjinModel()
{
// create a Renjin engine:
public RenjinModel() {
// create a Renjin engine:
RenjinScriptEngineFactory factory = new RenjinScriptEngineFactory();
engine = factory.getScriptEngine();
}
/**
* Run an R script file available on the classpath
* @param scriptPath
* @throws ScriptException
* Run an R script file available on the classpath * @param scriptPath *
* @throws ScriptException
*/
public void runRScript(String scriptPath) throws ScriptException
{
public void runRScript(String scriptPath) throws ScriptException {
InputStreamReader fr = new java.io.InputStreamReader(this.getClass().getResourceAsStream(scriptPath));
engine.eval(fr);
}
/**
* Place a Java object in the Renjin script engine
* @param objectName
* @param object
* Place a Java object in the Renjin script engine * @param objectName *
* @param object
*/
public void placeObjectInScriptEngine(String objectName, Object object)
{
public void placeObjectInScriptEngine(String objectName, Object object) {
engine.put(objectName, object);
}
/**
*
* @param objectName
* @return a Java object from the Renjin script engine
* @param objectName * @return a Java object from the Renjin script
* engine
*/
public Object getObjectFromScriptEngine(String objectName)
{
public Object getObjectFromScriptEngine(String objectName) {
ExternalPtr ptr = (ExternalPtr) engine.get(objectName);
return ptr.getInstance();
}
......
......@@ -19,12 +19,16 @@
package no.nibio.vips.util;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLConnection;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import no.nibio.vips.entity.WeatherObservation;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.IOUtils;
......@@ -115,4 +119,30 @@ public class ModelUtil {
return Base64.encodeBase64String(bytes);
}
/**
* This solves the problem of the model not knowing if the ModelConfiguration
* contains a halfway serialized List of WeatherObservation (typically LinkedHashMap)
* OR a List of actual WeatherObservations.
* @param unknownClassList
* @return
*/
public List<WeatherObservation> extractWeatherObservationList(Object unknownClassList)
{
try
{
// These are real WeatherObservation classes
List<WeatherObservation> obsList = (List<WeatherObservation>) unknownClassList;
if(obsList != null && obsList.size() > 0)
{
WeatherObservation o = obsList.get(0);
}
return obsList;
}
catch(ClassCastException ex)
{
// These are semi serialized, tell ObjectMapper/Jackson how to do it
ObjectMapper mapper = new ObjectMapper();
return mapper.convertValue(unknownClassList, new TypeReference<List<WeatherObservation>>(){});
}
}
}
/*
* Copyright (c) 2020 NIBIO <http://www.nibio.no/>.
*
* This file is part of VIPSCommon.
* VIPSCommon 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.
*
* VIPSCommon 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 VIPSCommon. If not, see <http://www.nibio.no/licenses/>.
*
*/
package no.nibio.vips.ipmdecisions;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.MappingJsonFactory;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import static junit.framework.Assert.fail;
import junit.framework.TestCase;
import net.ipmdecisions.weather.entity.LocationWeatherData;
import net.ipmdecisions.weather.entity.WeatherData;
import no.nibio.vips.entity.WeatherObservation;
/**
*
* @author treinar
*/
public class DataTransformerTest extends TestCase {
public DataTransformerTest(String testName) {
super(testName);
}
@Override
protected void setUp() throws Exception {
super.setUp();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
/**
* Test of getVIPSWeatherData method, of class DataTransformer.
*/
public void testGetVIPSWeatherData() {
System.out.println("getVIPSWeatherData");
WeatherData IPMWeatherData = this.getWeatherData("/IPMData_hourly.json");
DataTransformer instance = new DataTransformer();
List<WeatherObservation> result = instance.getVIPSWeatherData(IPMWeatherData);
result.forEach(obs->System.out.println(obs));
assertEquals(IPMWeatherData.getLocationWeatherData().get(0).getLength() * IPMWeatherData.getLocationWeatherData().get(0).getWidth(), result.size());
}
private WeatherData getWeatherData(String fileName)
{
try
{
BufferedInputStream inputStream = new BufferedInputStream(this.getClass().getResourceAsStream(fileName));
JsonFactory f = new MappingJsonFactory();
JsonParser jp = f.createParser(inputStream);
JsonNode all = jp.readValueAsTree();
WeatherData weatherData = new WeatherData();
ObjectMapper mapper = new ObjectMapper();
//mapper.convertValue(all, new TypeReference<WeatherData>(){});
weatherData.setTimeStart(((Date)mapper.convertValue(all.get("timeStart"), new TypeReference<Date>(){})).toInstant());
weatherData.setTimeEnd(((Date)mapper.convertValue(all.get("timeEnd"), new TypeReference<Date>(){})).toInstant());
weatherData.setInterval(all.get("interval").asInt());
Integer[] params = new Integer[all.get("weatherParameters").size()];
for(int i=0; i< all.get("weatherParameters").size();i++){
params[i] = all.get("weatherParameters").get(i).asInt();
}
weatherData.setWeatherParameters(params);
JsonNode oneLocation = all.get("locationWeatherData").get(0);
LocationWeatherData lwd = new LocationWeatherData(0.0,0.0,0.0,oneLocation.get("data").size(),params.length);
for(int i=0; i< oneLocation.get("data").size();i++)
{
for(int j=0; j<params.length;j++)
{
lwd.setValue(i, j,oneLocation.get("data").get(i).get(j).asDouble());
}
}
weatherData.addLocationWeatherData(lwd);
System.out.println(mapper.writeValueAsString(weatherData));
return weatherData;
}
catch(IOException ex)
{
return null;
}
}
}
{
"timeStart": "2020-04-13T22:00:00Z",
"timeEnd": "2020-04-18T22:00:00Z",
"interval": 86400,
"weatherParameters": [
1002,
2001,
3002
],
"locationWeatherData": [
{
"longitude": 9.21189,
"latitude": 59.38223,
"altitude": 94.0,
"data": [
[
3.3252083333333324,
0.4,
57.949999999999996
],
[
9.189458333333333,
0.0,
53.56249999999999
],
[
8.060041666666669,
0.0,
34.20750000000001
],
[
5.689166666666668,
0.0,
40.34875
],
[
6.208708333333333,
0.0,
43.70333333333334
],
[
8.549999999999999,
0.0,
49.01833333333334
]
],
"length": 6,
"width": 3
}
]
}
\ No newline at end of file
{
"timeStart": "2020-04-13T22:00:00Z",
"timeEnd": "2020-04-18T22:00:00Z",
"interval": 3600,
"weatherParameters": [
1002,
2001,
3002
],
"locationWeatherData": [
{
"longitude": 9.21189,
"latitude": 59.38223,
"altitude": 94.0,
"data": [
[
0.655,
0.0,
42.16
],
[
0.089,
0.0,
43.17
],
[
-0.725,
0.0,
48.96
],
[
-0.962,
0.0,
51.0
],
[
-1.787,
0.0,
59.24
],
[
-1.42,
0.0,
59.3
],
[
-1.471,
0.0,
63.36
],
[
-0.813,
0.0,
68.32
],
[
0.569,
0.0,
60.63
],
[
2.15,
0.0,
53.33
],
[
4.348,
0.0,
49.08
],
[
7.5,
0.0,
43.23
],
[
4.929,
0.4,
68.32
],
[
4.565,
0.0,
73.5
],
[
4.838,
0.0,
72.4
],
[
5.38,
0.0,
69.72
],
[
5.924,
0.0,
65.88
],
[
6.267,
0.0,
63.26
],
[
6.579,
0.0,
60.77
],
[
6.2,
0.0,
62.13
],
[
6.616,
0.0,
57.47
],
[
7.23,
0.0,
50.59
],
[
6.854,
0.0,
51.39
],
[
6.29,
0.0,
53.59
],
[
5.387,
0.0,
58.69
],
[
5.11,
0.0,
60.83
],
[
4.061,
0.0,
66.77
],
[
3.674,
0.0,
69.18
],
[
3.017,
0.0,
73.0
],
[
1.15,
0.0,
81.1
],
[
0.866,
0.0,
83.5
],
[
1.588,
0.0,
83.2
],
[
4.564,
0.0,
72.4
],
[
7.24,
0.0,
64.89
],
[
10.3,
0.0,
57.04
],
[
14.1,
0.0,
45.59
],
[
16.63,
0.0,
36.69
],
[
16.71,
0.0,
35.2
],
[
16.39,
0.0,
27.19
],
[
16.27,
0.0,
28.44
],
[
15.04,
0.0,
30.76
],
[
13.75,
0.0,
33.94
],
[
13.11,
0.0,
36.35
],
[
12.19,
0.0,
41.4
],
[
10.54,
0.0,
47.37
],
[
9.71,
0.0,
50.01
],
[
9.13,
0.0,
53.42
],
[
10.02,
0.0,
48.54
],
[
9.89,
0.0,
46.86
],
[
8.8,
0.0,
39.82
],
[
7.9,
0.0,
35.2
],
[
6.955,
0.0,
37.3
],
[
5.309,
0.0,
37.69
],
[
4.258,
0.0,
38.95
],
[
4.255,
0.0,
40.13
],
[
5.229,
0.0,
37.91
],
[
7.81,
0.0,
31.21
],
[
8.74,
0.0,
31.16
],
[
8.79,
0.0,
31.7
],
[
10.31,
0.0,
29.42
],
[
11.19,
0.0,
27.02
],
[
11.68,
0.0,
26.24
],
[
11.04,
0.0,
27.37
],
[
11.32,
0.0,
26.68
],
[
10.99,
0.0,
26.74
],
[
10.41,
0.0,
27.32
],
[
9.51,
0.0,
29.18
],
[
8.52,
0.0,
30.89
],
[
6.893,
0.0,
34.22
],
[
5.257,
0.0,
40.67
],
[
4.493,
0.0,
42.42
],
[
3.892,
0.0,
44.88
],
[
3.062,
0.0,
47.76
],
[
2.63,
0.0,
47.3
],
[
1.755,
0.0,
51.81
],
[
0.402,
0.0,
58.5
],
[
-0.587,
0.0,
63.77
],
[
-1.302,
0.0,
69.7
],
[
-1.591,
0.0,
71.2
],
[
-1.172,
0.0,
69.92
],
[
1.689,
0.0,
57.48
],
[
4.263,
0.0,
43.65
],
[
6.705,
0.0,
35.21
],
[
7.89,
0.0,
29.8
],
[
8.7,
0.0,
27.58
],
[
9.79,
0.0,
25.55
],
[
10.44,
0.0,
23.77
],
[
11.45,
0.0,
22.14
],
[
12.24,
0.0,
21.03
],
[
12.42,
0.0,
20.79
],
[
11.56,
0.0,
20.99
],
[
10.57,
0.0,
21.67
],
[
9.12,
0.0,
25.25
],
[
6.802,
0.0,
31.41
],
[
5.652,
0.0,
37.0
],
[
4.052,
0.0,
45.09
],
[
3.613,
0.0,
46.17
],
[
2.809,
0.0,
51.26
],
[
1.864,
0.0,
55.94
],
[
0.783,
0.0,
61.03
],
[
0.165,
0.0,
64.48
],
[
-0.696,
0.0,
70.0
],
[
-1.124,
0.0,
73.2
],
[
-0.55,
0.0,
72.8
],
[
0.819,
0.0,
67.58
],
[
3.469,
0.0,
57.01
],
[
5.879,
0.0,
43.61
],
[
7.79,
0.0,
32.47
],
[
8.82,
0.0,
30.15
],
[
9.85,
0.0,
28.34
],
[
10.88,
0.0,
27.27
],
[
12.0,
0.0,
24.36
],
[
12.6,
0.0,
23.15
],
[
12.95,
0.0,
23.02
],
[
12.73,
0.0,
23.74
],
[
12.03,
0.0,
25.25
],
[
10.85,
0.0,
27.55
],
[
9.24,
0.0,
31.04
],
[
6.964,
0.0,
41.15
],
[
5.274,
0.0,
48.31
],
[
4.423,
0.0,
52.34
]
],
"length": 121,
"width": 3
}
]
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment