Mercurial > dive4elements > river
annotate flys-artifacts/src/main/java/de/intevation/flys/artifacts/math/MovingAverage.java @ 5818:a4ff4167be1e
Request feature info on all layers and show it as html if
the server does not return valid gml.
Non queryable layers produce an error message when the request
fails. This is good enough
author | Andre Heinecke <aheinecke@intevation.de> |
---|---|
date | Wed, 24 Apr 2013 17:33:27 +0200 |
parents | fb9892036bd6 |
children |
rev | line source |
---|---|
4630
63368dcc3f94
Moved MovingAverage into math package
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4625
diff
changeset
|
1 package de.intevation.flys.artifacts.math; |
4625
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
2 |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
3 import java.util.Map; |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
4 import java.util.SortedMap; |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
5 import java.util.TreeMap; |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
6 |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
7 |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
8 public class MovingAverage |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
9 { |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
10 |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
11 public static double[][] simple(double[][] values, double radius) { |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
12 TreeMap<Double, Double> map = toMap(values); |
4631
d35d316049e8
A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4630
diff
changeset
|
13 int N = map.size(); |
d35d316049e8
A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4630
diff
changeset
|
14 double [] xs = new double[N]; |
d35d316049e8
A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4630
diff
changeset
|
15 double [] ys = new double[N]; |
4625
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
16 int ndx = 0; |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
17 for (double x: map.keySet()) { |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
18 SortedMap<Double, Double> range = |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
19 map.subMap(x-radius, true, x+radius, true); |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
20 double avg = 0d; |
4631
d35d316049e8
A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4630
diff
changeset
|
21 for (double v: range.values()) { |
4625
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
22 avg += v; |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
23 } |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
24 avg /= range.size(); |
4631
d35d316049e8
A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4630
diff
changeset
|
25 xs[ndx] = x; |
d35d316049e8
A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4630
diff
changeset
|
26 ys[ndx] = avg; |
4625
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
27 ndx++; |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
28 } |
4631
d35d316049e8
A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4630
diff
changeset
|
29 return new double [][] { xs, ys }; |
4625
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
30 } |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
31 |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
32 public static double[][] weighted(double[][] values, double radius) { |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
33 TreeMap<Double, Double> map = toMap(values); |
4631
d35d316049e8
A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4630
diff
changeset
|
34 int N = map.size(); |
d35d316049e8
A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4630
diff
changeset
|
35 double [] xs = new double[N]; |
d35d316049e8
A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4630
diff
changeset
|
36 double [] ys = new double[N]; |
4625
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
37 int ndx = 0; |
4631
d35d316049e8
A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4630
diff
changeset
|
38 double _1radius = 1d/radius; |
4625
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
39 for (double x: map.keySet()) { |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
40 double avg = 0d; |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
41 double weights = 0d; |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
42 for (Map.Entry<Double, Double> e: |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
43 map.subMap(x-radius, false, x+radius, false).entrySet() |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
44 ) { |
4631
d35d316049e8
A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4630
diff
changeset
|
45 double weight = 1d - Math.abs(x - e.getKey())*_1radius; |
4625
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
46 avg += weight*e.getValue(); |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
47 weights += weight; |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
48 } |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
49 avg /= weights; |
4631
d35d316049e8
A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4630
diff
changeset
|
50 xs[ndx] = x; |
d35d316049e8
A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4630
diff
changeset
|
51 ys[ndx] = avg; |
4625
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
52 ndx++; |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
53 } |
4631
d35d316049e8
A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4630
diff
changeset
|
54 return new double [][] { xs, ys }; |
4625
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
55 } |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
56 |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
57 private static TreeMap<Double, Double> toMap(double[][] values) { |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
58 TreeMap<Double, Double> map = new TreeMap<Double, Double>(); |
4631
d35d316049e8
A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4630
diff
changeset
|
59 double [] xs = values[0]; |
d35d316049e8
A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4630
diff
changeset
|
60 double [] ys = values[1]; |
d35d316049e8
A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4630
diff
changeset
|
61 for (int i = 0; i < xs.length; i++) { |
d35d316049e8
A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4630
diff
changeset
|
62 map.put(xs[i], ys[i]); |
4625
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
63 } |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
64 return map; |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
65 } |
d6d16b5ab2f0
New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
66 } |
5664
fb9892036bd6
Added vimline.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4631
diff
changeset
|
67 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |