annotate artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixZone.java @ 9237:972e10522ed6

salix.supraregional ui
author gernotbelger
date Tue, 10 Jul 2018 11:24:12 +0200
parents
children 1c756bfee472
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 package org.dive4elements.river.artifacts.uinfo.salix;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
11
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
12 import java.util.ArrayList;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
13 import java.util.List;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
14 import java.util.TreeSet;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
15
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
16 /**
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
17 * @author Domenico Nardi Tironi
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
18 *
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
19 */
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
20 public class SalixZone implements Comparable<SalixZone> {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
21
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
22 // IMMER ABGLEICHEN Server Client SalixZone.java
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
23 private static final String TABLE_CELL_SEPARATOR = "TABLE_CELL_SEPARATOR";
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
24 private static final String TABLE_ROW_SEPARATOR = "TABLE_ROW_SEPARATOR";
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
25 private final int dwsplValue;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
26 private final double fromKm;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
27 private final double toKm;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
28
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
29 private final static double DELTA = 0.0001;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
30
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
31 public static List<SalixZone> parse(final String zonesRaw) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
32 final List<SalixZone> resultList = new ArrayList<>();
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
33
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
34 final List<String[]> results = new ArrayList<>();
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
35 if (zonesRaw.contains(TABLE_ROW_SEPARATOR)) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
36 final String[] rows = zonesRaw.split(TABLE_ROW_SEPARATOR);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
37 for (final String row : rows) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
38 if (row.contains(TABLE_CELL_SEPARATOR)) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
39 final String[] result = row.split(TABLE_CELL_SEPARATOR);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
40 results.add(result);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
41 }
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 for (final String[] zone : results) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
45 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
46 resultList.add(helper);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
47 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
48 return resultList;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
49 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
50
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
51 public static SalixZone createFromTableEntry(final String dwspl, final String from, final String to) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
52 return new SalixZone(Integer.valueOf(dwspl), Double.valueOf(from), Double.valueOf(to)); // Error-Handling?
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
53 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
54
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
55 private SalixZone(final int dwsplValue, final double fromKm, final double toKm) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
56 this.dwsplValue = dwsplValue;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
57 this.fromKm = fromKm;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
58 this.toKm = toKm;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
59 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
60
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
61 public Double getToKm() {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
62 return this.toKm;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
63 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
64
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
65 public int getDwsplValue() {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
66 return this.dwsplValue;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
67 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
68
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
69 public Double getFromKm() {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
70 return this.fromKm;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
71 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
72
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
73 public static final String parseListToDataString(final List<SalixZone> list) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
74
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
75 java.util.Collections.sort(list);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
76 final StringBuilder builder = new StringBuilder();
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
77 for (final SalixZone zone : list) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
78 builder.append(zone.getDwsplValue());
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
79 builder.append(TABLE_CELL_SEPARATOR);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
80 builder.append(zone.getFromKm());
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
81 builder.append(TABLE_CELL_SEPARATOR);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
82 builder.append(zone.getToKm());
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
83 builder.append(TABLE_ROW_SEPARATOR);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
84 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
85 return builder.toString();
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
86 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
87
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
88 public static final boolean zonesAreOverlapping(final List<SalixZone> list) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
89 for (final SalixZone zone : list) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
90 for (final SalixZone zoneOther : list) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
91 if (zone != zoneOther) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
92 final boolean overlaps = zone.overlaps(zoneOther);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
93 if (overlaps) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
94 return overlaps; // cancel. only one zone has to overlap
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
95 }
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 return false;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
101 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
102
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
103 public static final boolean hasGaps(final List<SalixZone> list, final double lower, final double upper) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
104
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
105 if (((upper - lower) > DELTA) && list.size() == 0)
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
106 return true;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
107
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
108 final TreeSet<SalixZone> treeList = new TreeSet<SalixZone>();
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
109 treeList.addAll(list);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
110 double lowerCompare = lower + DELTA;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
111 for (final SalixZone zone : treeList) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
112 if (zone.getLowerFromTo() > lowerCompare) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
113 return true;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
114 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
115 lowerCompare = zone.getUpperFromTo() + DELTA;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
116 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
117 if ((lowerCompare + DELTA) < upper)
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
118 return true; // am Ende nicht geschlossen
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
119
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
120 return false;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
121 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
122
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
123 private Double getLowerFromTo() {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
124 return this.fromKm < this.toKm ? this.fromKm : this.toKm; // Math. is forbidden :-(
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
125 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
126
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
127 private Double getUpperFromTo() {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
128 return this.fromKm > this.toKm ? this.fromKm : this.toKm;// Math. is forbidden :-(
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
129 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
130
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
131 private boolean overlaps(final SalixZone otherZone) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
132 final double otherLower = otherZone.getLowerFromTo();
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
133 final double otherUpper = otherZone.getUpperFromTo();
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
134
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
135 final double upper = getUpperFromTo() - DELTA;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
136 final double lower = getLowerFromTo() + DELTA;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
137 final double otherSchwerpunkt = (otherLower + otherUpper) / 2;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
138 if ((otherUpper < upper && otherUpper > lower)) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
139 return true;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
140 } else if (otherLower > lower && otherLower < upper) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
141 return true;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
142 } else if (otherSchwerpunkt > lower && otherSchwerpunkt < upper) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
143 return true;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
144 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
145 return false;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
146 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
147
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
148 @Override
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
149 public int compareTo(final SalixZone o) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
150 final int basicCompare = this.getLowerFromTo().compareTo(o.getLowerFromTo());
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
151 return basicCompare;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
152 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
153
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
154 }

http://dive4elements.wald.intevation.org