annotate gwt-client/src/main/java/org/dive4elements/river/client/shared/model/SalixZone.java @ 9238:1c756bfee472

salix.supraregional table revision -> Anschluss
author gernotbelger
date Tue, 10 Jul 2018 13:27:17 +0200
parents 972e10522ed6
children cbe393451ab0
rev   line source
9237
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
1 /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
2 * Software engineering by
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
3 * Björnsen Beratende Ingenieure GmbH
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
4 * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
5 *
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
6 * This file is Free Software under the GNU AGPL (>=v3)
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
8 * documentation coming with Dive4Elements River for details.
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
9 */
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
10
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
11 package org.dive4elements.river.client.shared.model;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
12
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
13 import java.util.ArrayList;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
14 import java.util.List;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
15 import java.util.TreeSet;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
16
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
17 /**
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
18 * @author Domenico Nardi Tironi
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
19 *
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
20 */
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
21 public class SalixZone implements Comparable<SalixZone> {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
22
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
23 // IMMER ABGLEICHEN Server Client SalixZone.java
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
24 private static final String TABLE_CELL_SEPARATOR = "TABLE_CELL_SEPARATOR";
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
25 private static final String TABLE_ROW_SEPARATOR = "TABLE_ROW_SEPARATOR";
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
26 private final int dwsplValue;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
27 private final double fromKm;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
28 private final double toKm;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
29
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
30 private final static double DELTA = 0.0001;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
31
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
32 public static List<SalixZone> parse(final String zonesRaw) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
33 final List<SalixZone> resultList = new ArrayList<SalixZone>();
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
34
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
35 final List<String[]> results = new ArrayList<String[]>();
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
36 if (zonesRaw.contains(TABLE_ROW_SEPARATOR)) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
37 final String[] rows = zonesRaw.split(TABLE_ROW_SEPARATOR);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
38 for (final String row : rows) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
39 if (row.contains(TABLE_CELL_SEPARATOR)) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
40 final String[] result = row.split(TABLE_CELL_SEPARATOR);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
41 results.add(result);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
42 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
43 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
44 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
45 for (final String[] zone : results) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
46 final SalixZone helper = new SalixZone(Integer.valueOf(zone[0]), Double.valueOf(zone[1]), Double.valueOf(zone[2]));
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
47 resultList.add(helper);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
48 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
49 return resultList;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
50 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
51
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
52 public static SalixZone createFromTableEntry(final String dwspl, final String from, final String to) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
53 return new SalixZone(Integer.valueOf(dwspl), Double.valueOf(from), Double.valueOf(to)); // Error-Handling?
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
54 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
55
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
56 private SalixZone(final int dwsplValue, final double fromKm, final double toKm) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
57 this.dwsplValue = dwsplValue;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
58 this.fromKm = fromKm;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
59 this.toKm = toKm;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
60 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
61
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
62 public Double getToKm() {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
63 return this.toKm;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
64 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
65
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
66 public int getDwsplValue() {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
67 return this.dwsplValue;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
68 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
69
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
70 public Double getFromKm() {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
71 return this.fromKm;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
72 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
73
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
74 public static final String parseListToDataString(final List<SalixZone> list) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
75
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
76 java.util.Collections.sort(list);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
77 final StringBuilder builder = new StringBuilder();
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
78 for (final SalixZone zone : list) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
79 builder.append(zone.getDwsplValue());
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
80 builder.append(TABLE_CELL_SEPARATOR);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
81 builder.append(zone.getFromKm());
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
82 builder.append(TABLE_CELL_SEPARATOR);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
83 builder.append(zone.getToKm());
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
84 builder.append(TABLE_ROW_SEPARATOR);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
85 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
86 return builder.toString();
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
87 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
88
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
89 public static final boolean zonesAreOverlapping(final List<SalixZone> list) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
90 for (final SalixZone zone : list) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
91 for (final SalixZone zoneOther : list) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
92 if (zone != zoneOther) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
93 final boolean overlaps = zone.overlaps(zoneOther);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
94 if (overlaps) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
95 return overlaps; // cancel. only one zone has to overlap
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
96 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
97 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
98 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
99 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
100
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
101 return false;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
102 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
103
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
104 public static final boolean hasGaps(final List<SalixZone> list, final double lower, final double upper) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
105
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
106 if (((upper - lower) > DELTA) && list.size() == 0)
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
107 return true;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
108
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
109 final TreeSet<SalixZone> treeList = new TreeSet<SalixZone>();
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
110 treeList.addAll(list);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
111 double lowerCompare = lower + DELTA;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
112 for (final SalixZone zone : treeList) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
113 if (zone.getLowerFromTo() > lowerCompare) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
114 return true;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
115 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
116 lowerCompare = zone.getUpperFromTo() + DELTA;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
117 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
118 if ((lowerCompare + DELTA) < upper)
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
119 return true; // am Ende nicht geschlossen
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
120
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
121 return false;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
122 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
123
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
124 private Double getLowerFromTo() {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
125 return this.fromKm < this.toKm ? this.fromKm : this.toKm; // Math. is forbidden :-(
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
126 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
127
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
128 private Double getUpperFromTo() {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
129 return this.fromKm > this.toKm ? this.fromKm : this.toKm;// Math. is forbidden :-(
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
130 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
131
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
132 private boolean overlaps(final SalixZone otherZone) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
133 final double otherLower = otherZone.getLowerFromTo();
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
134 final double otherUpper = otherZone.getUpperFromTo();
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
135
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
136 final double upper = getUpperFromTo() - DELTA;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
137 final double lower = getLowerFromTo() + DELTA;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
138 final double otherSchwerpunkt = (otherLower + otherUpper) / 2;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
139 if ((otherUpper < upper && otherUpper > lower)) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
140 return true;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
141 } else if (otherLower > lower && otherLower < upper) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
142 return true;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
143 } else if (otherSchwerpunkt > lower && otherSchwerpunkt < upper) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
144 return true;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
145 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
146 return false;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
147 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
148
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
149 @Override
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
150 public int compareTo(final SalixZone o) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
151 final int basicCompare = this.getLowerFromTo().compareTo(o.getLowerFromTo());
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
152 return basicCompare;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
153 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
154
9238
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
155 public static boolean isValidAnschlussRange(final double fromTest, final double toTest, final List<SalixZone> list, final double minKm) {
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
156 final SalixZone zone = new SalixZone(0, fromTest, toTest);
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
157 final double lower = zone.getLowerFromTo();
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
158 final double anschluss = getAnschluss(list, minKm);
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
159 final double differenceAbs = (lower - anschluss) > 0 ? (lower - anschluss) : (anschluss - lower); // no Math.abs allowed :-(
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
160 if (differenceAbs > DELTA) {
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
161 return false;
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
162 }
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
163
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
164 return true;
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
165 }
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
166
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
167 private static double getAnschluss(final List<SalixZone> list, final double minKm) {
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
168
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
169 if (list.size() > 0) {
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
170 return list.get(list.size() - 1).getUpperFromTo();
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
171 }
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
172 return minKm;
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
173 }
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
174
9237
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
175 }

http://dive4elements.wald.intevation.org