Search in sources :

Example 1 with Value

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;
}
Also used : QuantityValue(org.n52.io.response.dataset.quantity.QuantityValue) QuantityData(org.n52.io.response.dataset.quantity.QuantityData)

Example 2 with Value

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);
    }
}
Also used : QuantityValue(org.n52.io.response.dataset.quantity.QuantityValue) Line2D(java.awt.geom.Line2D) QuantityData(org.n52.io.response.dataset.quantity.QuantityData)

Example 3 with Value

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());
}
Also used : RequestSimpleParameterSet(org.n52.io.request.RequestSimpleParameterSet) IoParameters(org.n52.io.request.IoParameters) RequestMapping(org.springframework.web.bind.annotation.RequestMapping)

Example 4 with Value

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());
}
Also used : RequestSimpleParameterSet(org.n52.io.request.RequestSimpleParameterSet) IoParameters(org.n52.io.request.IoParameters) RequestMapping(org.springframework.web.bind.annotation.RequestMapping)

Example 5 with Value

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());
}
Also used : RequestSimpleParameterSet(org.n52.io.request.RequestSimpleParameterSet) IoParameters(org.n52.io.request.IoParameters) RequestMapping(org.springframework.web.bind.annotation.RequestMapping)

Aggregations

XmlObject (org.apache.xmlbeans.XmlObject)28 Test (org.junit.Test)27 RequestMapping (org.springframework.web.bind.annotation.RequestMapping)20 IoParameters (org.n52.io.request.IoParameters)19 SweField (org.n52.shetland.ogc.swe.SweField)16 TimeInstant (org.n52.shetland.ogc.gml.time.TimeInstant)13 QuantityValue (org.n52.shetland.ogc.om.values.QuantityValue)13 RequestSimpleParameterSet (org.n52.io.request.RequestSimpleParameterSet)12 List (java.util.List)9 SimpleDataRecordType (net.opengis.swe.x101.SimpleDataRecordType)9 AnyScalarPropertyType (net.opengis.swe.x101.AnyScalarPropertyType)7 CategoryValue (org.n52.shetland.ogc.om.values.CategoryValue)7 CountValue (org.n52.shetland.ogc.om.values.CountValue)7 SweBoolean (org.n52.shetland.ogc.swe.simpleType.SweBoolean)7 SweText (org.n52.shetland.ogc.swe.simpleType.SweText)7 DecodingException (org.n52.svalbard.decode.exception.DecodingException)7 DateTime (org.joda.time.DateTime)6 ModelAndView (org.springframework.web.servlet.ModelAndView)6 ObjectNode (com.fasterxml.jackson.databind.node.ObjectNode)5 ArrayList (java.util.ArrayList)5