use of org.n52.shetland.ogc.om.values.Value in project series-rest-api by 52North.
the class LargestTriangleThreeBucketsGeneralizer method generalizeData.
private QuantityData generalizeData(QuantityValue[] data) {
int dataLength = data.length;
// Bucket size. Leave room for start and end data points
double bucketSize = ((double) dataLength - 2) / (maxOutputValues - 2);
int pointIndex = 0;
QuantityData sampled = new QuantityData();
sampled.addValues(data[pointIndex]);
for (int bucketIndex = 0; bucketIndex < maxOutputValues - 2; bucketIndex++) {
// get the range for this bucket
int rangeOff = (int) Math.floor((bucketIndex + 0) * bucketSize) + 1;
int rangeTo = (int) Math.floor((bucketIndex + 1) * bucketSize) + 1;
// first point of triangle
QuantityValue triangleLeft = data[pointIndex];
if (triangleLeft.isNoDataValue()) {
addNodataValue(sampled, triangleLeft.getTimestamp());
pointIndex = rangeTo - 1;
continue;
}
// last point of triangle (next bucket's average)
BucketAverage triangleRight = calculateBucketAverage(bucketIndex + 1, bucketSize, data);
// init fallback value
BucketAverage avgCurrentBucket = calculateBucketAverage(bucketIndex, bucketSize, data);
long fallBackTimestamp = avgCurrentBucket.toTimeseriesValue().getTimestamp();
QuantityValue maxAreaPoint = new QuantityValue(fallBackTimestamp, null);
double area;
int amountOfNodataValues = 0;
double maxArea = area = -1;
int nextPointIndex = 0;
for (; rangeOff < rangeTo; rangeOff++) {
//if (triangleRight.isNoDataBucket()) {
// triangleRight = // TODO
//}
// calculate triangle area over three buckets
final QuantityValue triangleMiddle = data[rangeOff];
if (triangleMiddle.isNoDataValue()) {
amountOfNodataValues++;
if (isExceededGapThreshold(amountOfNodataValues, bucketSize)) {
if (triangleMiddle.isNoDataValue()) {
maxAreaPoint = avgCurrentBucket.toTimeseriesValue();
LOGGER.debug("No data value for bucket {}.", bucketIndex);
pointIndex = rangeTo - 1;
break;
}
}
} else {
area = calcTriangleArea(triangleLeft, triangleRight, triangleMiddle);
if (area > maxArea) {
maxArea = area;
maxAreaPoint = triangleMiddle;
nextPointIndex = rangeOff;
}
}
}
// Pick this point from the Bucket
sampled.addValues(maxAreaPoint);
// This a is the next a
pointIndex = nextPointIndex;
}
// Always add last value
sampled.addValues(data[dataLength - 1]);
return sampled;
}
use of org.n52.shetland.ogc.om.values.Value in project series-rest-api by 52North.
the class DouglasPeuckerGeneralizer method recursiveGeneralize.
private QuantityValue[] recursiveGeneralize(QuantityData timeseries) {
QuantityValue[] values = getValueArray(timeseries);
QuantityValue startValue = getFirstValue(timeseries);
QuantityValue endValue = getLastValue(timeseries);
Line2D.Double line = createTendencyLine(startValue, endValue);
// find the point of maximum distance to the line
int index = 0;
double maxDist = 0;
double distance;
// start and end value are not mentioned
for (int i = 1; i < values.length - 1; i++) {
QuantityValue timeseriesValue = values[i];
distance = calculateDistance(line, timeseriesValue);
if (distance > maxDist) {
index = i;
maxDist = distance;
}
}
if (maxDist < toleranceValue) {
return getValueArray(timeseries);
} else {
// split and handle both parts separately
QuantityData generalizedData = new QuantityData();
QuantityData firstPartToBeGeneralized = new QuantityData();
QuantityData restPartToBeGeneralized = new QuantityData();
firstPartToBeGeneralized.addValues(Arrays.copyOfRange(values, 0, index));
restPartToBeGeneralized.addValues(Arrays.copyOfRange(values, index + 1, values.length));
generalizedData.addValues(recursiveGeneralize(firstPartToBeGeneralized));
generalizedData.addValues(recursiveGeneralize(restPartToBeGeneralized));
return getValueArray(generalizedData);
}
}
use of org.n52.shetland.ogc.om.values.Value in project series-rest-api by 52North.
the class DataController method getSeriesChart.
@RequestMapping(value = "/{seriesId}/data", produces = { "image/png" }, method = RequestMethod.GET)
public void getSeriesChart(HttpServletResponse response, @PathVariable String seriesId, @RequestHeader(value = Parameters.HttpHeader.ACCEPT_LANGUAGE) String locale, @RequestParam(required = false) MultiValueMap<String, String> query) throws Exception {
RequestUtils.overrideQueryLocaleWhenSet(locale, query);
IoParameters map = QueryParameters.createFromQuery(query);
LOGGER.debug("get data collection chart for '{}' with query: {}", seriesId, map);
checkAgainstTimespanRestriction(map.getTimespan().toString());
checkForUnknownDatasetIds(map, seriesId);
String handleAsValueTypeFallback = map.getAsString(Parameters.HANDLE_AS_VALUE_TYPE);
String valueType = ValueType.extractType(seriesId, handleAsValueTypeFallback);
RequestSimpleParameterSet parameters = map.toSimpleParameterSet();
String outputFormat = MimeType.IMAGE_PNG.toString();
response.setContentType(outputFormat);
createIoFactory(valueType).withSimpleRequest(parameters).createHandler(outputFormat).writeBinary(response.getOutputStream());
}
use of org.n52.shetland.ogc.om.values.Value in project series-rest-api by 52North.
the class DataController method getSeriesAsCsv.
@RequestMapping(value = "/{seriesId}/data", produces = { "text/csv" }, method = RequestMethod.GET)
public void getSeriesAsCsv(HttpServletResponse response, @PathVariable String seriesId, @RequestHeader(value = Parameters.HttpHeader.ACCEPT_LANGUAGE) String locale, @RequestParam(required = false) MultiValueMap<String, String> query) throws Exception {
RequestUtils.overrideQueryLocaleWhenSet(locale, query);
IoParameters map = QueryParameters.createFromQuery(query);
LOGGER.debug("get data collection csv for '{}' with query: {}", seriesId, map);
RequestSimpleParameterSet parameters = RequestSimpleParameterSet.createForSingleSeries(seriesId, map);
checkAgainstTimespanRestriction(parameters.getTimespan());
checkForUnknownDatasetIds(map, seriesId);
response.setCharacterEncoding(DEFAULT_RESPONSE_ENCODING);
if (Boolean.parseBoolean(map.getOther("zip"))) {
response.setContentType(MimeType.APPLICATION_ZIP.toString());
} else {
response.setContentType(MimeType.TEXT_CSV.toString());
}
final String datasetType = parameters.getValueType();
createIoFactory(datasetType).withSimpleRequest(parameters).createHandler(MimeType.TEXT_CSV.toString()).writeBinary(response.getOutputStream());
}
use of org.n52.shetland.ogc.om.values.Value in project series-rest-api by 52North.
the class DataController method getSeriesAsZippedCsv.
@RequestMapping(value = "/{seriesId}/data", produces = { "application/zip" }, method = RequestMethod.GET)
public void getSeriesAsZippedCsv(HttpServletResponse response, @PathVariable String seriesId, @RequestHeader(value = Parameters.HttpHeader.ACCEPT_LANGUAGE) String locale, @RequestParam(required = false) MultiValueMap<String, String> query) throws Exception {
RequestUtils.overrideQueryLocaleWhenSet(locale, query);
IoParameters map = QueryParameters.createFromQuery(query);
LOGGER.debug("get data collection zip for '{}' with query: {}", seriesId, map);
RequestSimpleParameterSet parameters = RequestSimpleParameterSet.createForSingleSeries(seriesId, map);
checkAgainstTimespanRestriction(parameters.getTimespan());
checkForUnknownDatasetIds(map, seriesId);
response.setCharacterEncoding(DEFAULT_RESPONSE_ENCODING);
response.setContentType(MimeType.APPLICATION_ZIP.toString());
final String datasetType = parameters.getValueType();
createIoFactory(datasetType).withSimpleRequest(parameters).createHandler(MimeType.APPLICATION_ZIP.toString()).writeBinary(response.getOutputStream());
}
Aggregations