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

Added first version of parser for weather data from China (Cebaowang weather stations)

parent 45a3b179
Branches
Tags
1 merge request!17Develop
/*
* Copyright (c) 2016 NIBIO <http://www.nibio.no/>.
* Copyright (c) 2019 NIBIO <http://www.nibio.no/>.
*
* This file is part of VIPSLogic.
* VIPSLogic is free software: you can redistribute it and/or modify
......@@ -48,6 +48,7 @@ import no.nibio.vips.entity.WeatherObservation;
import no.nibio.vips.logic.util.SystemTime;
import no.nibio.vips.util.XDate;
import no.nibio.vips.util.weather.ALabDataParser;
import no.nibio.vips.util.weather.CebaowangDataParser;
import no.nibio.vips.util.weather.FruitWebDavisDataParser;
import no.nibio.vips.util.weather.MetosAPIDataParser;
import no.nibio.vips.util.weather.MetosRIMProDataParser;
......@@ -60,7 +61,7 @@ import no.nibio.vips.util.weather.metnothredds.TooMuchDataToAskForException;
import org.jboss.resteasy.annotations.GZIP;
/**
* @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
* @copyright 2019 <a href="http://www.nibio.no/">NIBIO</a>
* @author Tor-Einar Skog <tor-einar.skog@nibio.no>
*/
@Path("rest/weather/proxy")
......@@ -191,6 +192,50 @@ public class WeatherProxyService {
return Response.ok().entity(observations).build();
}
/**
* Fetches data from the Chinese Cebaowang weather data service
* Used in the SINOGRAIN project(s)
*
* @param stationId
* @param timeZonePOST
* @param timeZoneGET
* @param startDatePOST
* @param startDateGET
* @param endDatePOST
* @param endDateGET
* @return
*/
@GET
@POST
@Path("cebaowang/{stationId}")
@GZIP
@Produces("application/json;charset=UTF-8")
public Response getCebaowangWeatherData(
@PathParam("stationId") String stationId,
@FormParam("timeZone") String timeZonePOST,
@QueryParam("timeZone") String timeZoneGET,
@FormParam("startDate") String startDatePOST,
@QueryParam("startDate") String startDateGET,
@FormParam("endDate") String endDatePOST,
@QueryParam("endDate") String endDateGET
)
{
List<WeatherObservation> weatherObservations;
TimeZone timeZone = TimeZone.getTimeZone(timeZonePOST != null ? timeZonePOST : timeZoneGET);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
format.setTimeZone(timeZone);
try
{
Date startDate = format.parse(startDatePOST != null ? startDatePOST : startDateGET);
Date endDate = format.parse(endDatePOST != null ? endDatePOST : endDateGET);
weatherObservations = new CebaowangDataParser().getWeatherObservations(stationId, timeZone, startDate, endDate);
}
catch(ParseException | ParseWeatherDataException ex)
{
return Response.serverError().entity(ex).build();
}
return Response.ok().entity(weatherObservations).build();
}
@GET
@POST
......
/*
* Copyright (c) 2019 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.util.weather;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ibm.icu.text.MessageFormat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.AbstractMap.SimpleEntry;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import no.nibio.vips.entity.WeatherObservation;
import no.nibio.vips.util.WeatherElements;
/**
* Parses data from the Chinese weather service http://www.cebaowang.com:8089, used in the
* SINOGRAIN2 project
*
* @copyright 2019 <a href="http://www.nibio.no/">NIBIO</a>
* @author Tor-Einar Skog <tor-einar.skog@nibio.no>
*/
public class CebaowangDataParser {
public final static String CEBAOWANG_URL_PATH = "http://www.cebaowang.com:8089/external/data/upload";
public final static String CEBAOWANG_URL_QUERY_TEMPLATE = "?startDate={0}&endDate={1}&{2}";
private Map<String, String> parameters = Collections.unmodifiableMap((Map<String,String>) Stream.of
(
new SimpleEntry<>("kongQiWenDu", WeatherElements.TEMPERATURE_MEAN),
new SimpleEntry<>("xiangDuiShiDu", WeatherElements.RELATIVE_HUMIDITY_MEAN),
new SimpleEntry<>("luDianWenDu",WeatherElements.DEW_POINT_TEMPERATURE),
//new SimpleEntry<>("tianJiangYuLiang", null), // Daily rainfall
new SimpleEntry<>("xiaoShiJiangYuLiang", WeatherElements.PRECIPITATION),
//new SimpleEntry<>("dianChiDianYa", null), // Voltage
new SimpleEntry<>("shiRunShiJian", WeatherElements.LEAF_WETNESS_DURATION),
//new SimpleEntry<>("riZhaoShiShu", null), // Sunshine hours the current day
new SimpleEntry<>("fiveTuRangHanShuiLiang", WeatherElements.SOIL_WATER_CONTENT_5CM),
new SimpleEntry<>("tenTuRangHanShuiLiang", WeatherElements.SOIL_WATER_CONTENT_10CM),
new SimpleEntry<>("twentyFiveTuRangHanShuiLiang", WeatherElements.SOIL_WATER_CONTENT_25CM),
new SimpleEntry<>("fiftyTuRangHanShuiLiang", WeatherElements.SOIL_WATER_CONTENT_50CM),
new SimpleEntry<>("fiveTuRangWenDu", WeatherElements.SOIL_TEMPERATURE_5CM_MEAN),
new SimpleEntry<>("tenTuRangWenDu", WeatherElements.SOIL_TEMPERATURE_10CM_MEAN),
new SimpleEntry<>("twentyFiveTuRangWenDu", WeatherElements.SOIL_TEMPERATURE_25CM_MEAN),
new SimpleEntry<>("fiftyTuRangWenDu", WeatherElements.SOIL_TEMPERATURE_50CM_MEAN),
new SimpleEntry<>("tuRangDaoDianLv", WeatherElements.SOIL_CONDUCTIVITY_5CM)
)
.collect(Collectors.toMap((e) -> e.getKey(), (e) -> e.getValue()))
);
private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public List<WeatherObservation> getWeatherObservations(String stationID, TimeZone timeZone, Date startDate, Date endDate) throws ParseWeatherDataException
{
format.setTimeZone(timeZone);
List<WeatherObservation> retVal = null;
try
{
URL cebaowangURL = new URL(CEBAOWANG_URL_PATH + MessageFormat.format(
CEBAOWANG_URL_QUERY_TEMPLATE,
URLEncoder.encode(format.format(startDate),"UTF-8"),
URLEncoder.encode(format.format(endDate),"UTF-8"),
stationID
)
);
//System.out.println(cebaowangURL);
BufferedReader in = new BufferedReader(
new InputStreamReader(cebaowangURL.openStream())
);
String inputLine;
Date testTimestamp;
String all = new String();
// Reading data into String of JSON data
while ((inputLine = in.readLine()) != null)
{
all += inputLine;
}
// Get objects from JSON parser method
retVal = getParsedObservations(all, timeZone);
}
catch(ParseException | IOException ex)
{ex.printStackTrace();
throw new ParseWeatherDataException(ex.getMessage());
}
return retVal;
}
public List<WeatherObservation> getParsedObservations(String jsonTxt, TimeZone timeZone) throws IOException, ParseException
{
ObjectMapper oMapper = new ObjectMapper();
JsonNode jNode = oMapper.readTree(jsonTxt);
List<WeatherObservation> retVal = new ArrayList<>();
JsonNode data = jNode.get("data");
for(JsonNode dataForAGivenTime:data)
{
Date timeMeasured = this.format.parse(dataForAGivenTime.get("collectTime").asText());
//System.out.println(timeMeasured + "=" + dataForAGivenTime.get("collectTime").asText());
this.parameters.keySet().forEach(paramName->{
WeatherObservation obs = new WeatherObservation();
obs.setTimeMeasured(timeMeasured);
obs.setElementMeasurementTypeId(this.parameters.get(paramName));
obs.setLogIntervalId(WeatherObservation.LOG_INTERVAL_ID_1H); // TODO: Check this!! Is every 2nd hour as of now
obs.setValue(dataForAGivenTime.get(paramName).asDouble());
retVal.add(obs);
});
}
return retVal;
}
}
/*
* Copyright (c) 2019 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.util.weather;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import no.nibio.vips.entity.WeatherObservation;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
/**
*
* @author treinar
*/
public class CebaowangDataParserTest {
public CebaowangDataParserTest() {
}
@BeforeClass
public static void setUpClass() {
}
@AfterClass
public static void tearDownClass() {
}
@Before
public void setUp() {
}
@After
public void tearDown() {
}
/**
* Test of getWeatherObservations method, of class CebaowangDataParser.
*/
@Test
public void testGetWeatherObservations() throws Exception {
System.out.println("getWeatherObservations");
String stationID = "token=0819208daf3684b6e1b2f7d9b0e1bc64&deviceId=YBQ0000053";
TimeZone timeZone = TimeZone.getTimeZone("Asia/Shanghai");
Calendar cal = Calendar.getInstance(timeZone);
cal.set(2019, Calendar.JANUARY, 10, 0,0);
Date startDate = cal.getTime();
cal.add(Calendar.DATE, 20);
Date endDate = cal.getTime();
CebaowangDataParser instance = new CebaowangDataParser();
List<WeatherObservation> expResult = null;
List<WeatherObservation> result = instance.getWeatherObservations(stationID, timeZone, startDate, endDate);
//assertEquals(expResult, result);
assertNotNull(result);
result.forEach(obs->System.out.println(obs));
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment