use of org.n52.io.response.dataset.quantity.QuantityValue in project series-rest-api by 52North.
the class PDFReportGenerator method addDataTable.
private void addDataTable(TimeSeries timeseries, TimeseriesMetadataOutput metadata, TvpDataCollection<QuantityData> dataCollection) {
TableType dataTable = timeseries.addNewTable();
// TODO add language context
dataTable.setLeftColHeader("Date");
dataTable.setRightColHeader(createValueTableHeader(metadata));
QuantityData data = dataCollection.getSeries(metadata.getId());
for (QuantityValue valueEntry : data.getValues()) {
Entry entry = dataTable.addNewEntry();
// TODO update TableType schema to allow start/end time
entry.setTime(new DateTime(valueEntry.getTimestamp()).toString());
entry.setValue(Double.toString(valueEntry.getValue()));
}
}
use of org.n52.io.response.dataset.quantity.QuantityValue in project series-rest-api by 52North.
the class LargestTriangleThreeBucketsGeneralizer method calculateBucketAverage.
private BucketAverage calculateBucketAverage(int bucketIndex, double bucketSize, QuantityValue[] data) {
int dataLength = data.length;
int avgRangeStart = (int) Math.floor((bucketIndex + 0) * bucketSize) + 1;
int avgRangeEnd = (int) Math.floor((bucketIndex + 1) * bucketSize) + 1;
avgRangeEnd = avgRangeEnd < dataLength ? avgRangeEnd : dataLength;
double avgRangeLength = avgRangeEnd - avgRangeStart;
Double avgValue = 0d;
Double avgTimestamp = 0d;
int amountOfNodataValues = 0;
boolean noDataThresholdExceeded = false;
for (; avgRangeStart < avgRangeEnd; avgRangeStart++) {
final QuantityValue current = data[avgRangeStart];
avgTimestamp += current.getTimestamp();
if (noDataThresholdExceeded) {
// keep on calc avg timestamp
continue;
}
if (current.isNoDataValue()) {
amountOfNodataValues++;
if (amountOfNodataValues == noDataGapThreshold) {
noDataThresholdExceeded = true;
}
} else {
avgValue += current.getValue();
}
}
avgTimestamp /= avgRangeLength;
avgValue /= avgRangeLength;
return new BucketAverage(avgTimestamp, avgValue);
}
use of org.n52.io.response.dataset.quantity.QuantityValue 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.io.response.dataset.quantity.QuantityValue in project series-rest-api by 52North.
the class HighchartFormatter method formatSeries.
private List<Number[]> formatSeries(QuantityData timeseries) {
List<Number[]> series = new ArrayList<>();
for (QuantityValue currentValue : timeseries.getValues()) {
List<Number> list = new ArrayList<>();
list.add(currentValue.getTimestamp());
list.add(currentValue.getValue());
if (currentValue.isSetGeometry()) {
Coordinate coordinate = currentValue.getGeometry().getCoordinate();
list.add(coordinate.x);
list.add(coordinate.y);
if (!Double.isNaN(coordinate.z)) {
list.add(coordinate.z);
}
}
series.add(list.toArray(new Number[0]));
}
return series;
}
use of org.n52.io.response.dataset.quantity.QuantityValue in project series-rest-api by 52North.
the class DouglasPeuckerGeneralizer method generalize.
private QuantityData generalize(QuantityData timeseries) throws GeneralizerException {
QuantityValue[] originalValues = getValueArray(timeseries);
if (originalValues.length < 3 || toleranceValue <= 0) {
return timeseries;
}
if (maxEntries != -1 && originalValues.length > maxEntries) {
throw new GeneralizerException("Maximum number of entries exceeded (" + originalValues.length + ">" + maxEntries + ")!");
}
QuantityData generalizedTimeseries = new QuantityData();
QuantityValue[] generalizedValues = recursiveGeneralize(timeseries);
generalizedTimeseries.addValues(generalizedValues);
// add first element if new list is empty
if (generalizedValues.length == 0) /* && originalValues.length > 0*/
{
generalizedTimeseries.addValues(originalValues[0]);
}
// add the last one if not already contained!
if (generalizedValues.length > 0) /* && originalValues.length > 0*/
{
QuantityValue lastOriginialValue = originalValues[originalValues.length - 1];
QuantityValue lastGeneralizedValue = generalizedValues[generalizedValues.length - 1];
if (!lastGeneralizedValue.getTimestamp().equals(lastOriginialValue.getTimestamp())) {
generalizedTimeseries.addValues(lastOriginialValue);
}
}
return generalizedTimeseries;
}
Aggregations