view flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/InfoldingColumns.java @ 5622:b28a6d05e969

Add a new mechanism in mapfish print call to add arbitary data maps Data properties are identified by starting with mapfish-data and they are then split in info value pairs where info can be the description of the information and value the value of the information to be transported in the data map.
author Andre Heinecke <aheinecke@intevation.de>
date Tue, 09 Apr 2013 19:04:32 +0200
parents 243f1eb02b95
children
line wrap: on
line source
package de.intevation.flys.artifacts.model;

/** A pretty naive pointwise algorithm to find out the columns
 *  of a WSTValueTable which imfold ("umhuellen") a set of WQKMs
 *  in terms of Q.
 *  A better implemention would exploit the fact that the
 *  Qs normally are constant for a while along km. This would
 *  reduce the runtime complexity to only a few Q spans instead
 *  of the pointwise evaluation.
 */
public class InfoldingColumns
{
    private QRangeTree.QuickQFinder [] qFinders;

    private boolean [] infoldingColumns;

    public InfoldingColumns() {
    }

    public InfoldingColumns(WstValueTable.Column [] columns) {

        qFinders = new QRangeTree.QuickQFinder[columns.length];
        for (int i = 0; i < qFinders.length; ++i) {
            qFinders[i] = columns[i].getQRangeTree().new QuickQFinder();
        }

        infoldingColumns = new boolean[columns.length];
    }

    public boolean [] getInfoldingColumns() {
        return infoldingColumns;
    }

    public void markInfoldingColumns(QKms [] qkms) {
        for (QKms qk: qkms) {
            markInfoldingColumns(qk);
        }
    }

    public void markInfoldingColumns(QKms qkms) {
        int N = qkms.size();
        int C = qFinders.length-1;
        for (int i = 0; i < N; ++i) {
            double km       = qkms.getKm(i);
            double q        = qkms.getQ(i);
            double above    =  Double.MAX_VALUE;
            double below    = -Double.MAX_VALUE;
            int    aboveIdx = -1;
            int    belowIdx = -1;

            for (int j = C; j >= 0; --j) {
                double qc = qFinders[j].findQ(km);
                if (Double.isNaN(qc)) {
                    continue;
                }
                if (qc <= q) {
                    if (qc > below) {
                        below    = qc;
                        belowIdx = j;
                    }
                }
                else if (qc < above) { // qc > q
                    above    = qc;
                    aboveIdx = j;
                }
            }

            if (aboveIdx != -1) {
                infoldingColumns[aboveIdx] = true;
            }

            if (belowIdx != -1) {
                infoldingColumns[belowIdx] = true;
            }
        }
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org