comparison artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/DefaultBedHeights.java @ 9706:299c1c61d8ef

zu 1.1. Sohlhöhen-Überlappung
author dnt_bjoernsen <d.tironi@bjoernsen.de>
date Fri, 22 Jan 2021 12:28:58 +0100
parents b9c87bbff6a4
children b74f817435fe
comparison
equal deleted inserted replaced
9705:bfdf98529a66 9706:299c1c61d8ef
20 import org.dive4elements.river.model.BedHeight; 20 import org.dive4elements.river.model.BedHeight;
21 import org.dive4elements.river.model.Range; 21 import org.dive4elements.river.model.Range;
22 import org.dive4elements.river.model.River; 22 import org.dive4elements.river.model.River;
23 23
24 /** 24 /**
25 * This class knows how to find the default bed levels defined for tkh and other calculations 25 * This class knows how to find the default bed levels defined for tkh and other
26 * calculations
26 * 27 *
27 * @author Gernot Belger 28 * @author Gernot Belger
28 */ 29 */
29 public final class DefaultBedHeights { 30 public final class DefaultBedHeights {
30 31
31 private final River river; 32 private final River river;
32 33
33 public DefaultBedHeights(final River river) { 34 public DefaultBedHeights(final River river) {
34 this.river = river; 35 this.river = river;
35 } 36 }
36 37
37 public List<BedHeight> getBedHeights(final Calculation problems) { 38 public List<BedHeight> getBedHeights(final Calculation problems) {
38 final Collection<DefaultBedHeight> defaults = DefaultBedHeightsConfig.getDefaults(this.river, problems); 39 final Collection<DefaultBedHeight> defaults = DefaultBedHeightsConfig.getDefaults(this.river, problems);
40 // check ob jede default-range irgendeine andere überlappt
39 41
40 final List<BedHeight> defaultBedHeights = loadBedHeightsByName(this.river, defaults, problems); 42 for (DefaultBedHeight check : defaults) {
41 if (defaultBedHeights.isEmpty()) { 43 double end = check.endKm > check.startKm ? check.endKm : check.startKm;
42 problems.addProblem("sinfo.bedheightsfinder.nobedheightsforriver", this.river.getName()); 44 double start = check.startKm < check.endKm ? check.startKm : check.endKm;
43 return Collections.emptyList();
44 }
45 45
46 /* check for overlapping ranges, N2-search, but we expect only have small numbers of bed levels */ 46 for (DefaultBedHeight checkInner : defaults) {
47 final List<BedHeight> result = new ArrayList<>(defaultBedHeights.size()); 47 if (!checkInner.description.equals(check.description)
48 && (checkInner.startKm < end && checkInner.endKm > start))
49 problems.addProblem("sinfo.bedheightsfinder.overlappingrange", check.description);
50 }
51 }
48 52
49 for (int i = 0; i < defaultBedHeights.size(); i++) { 53 final List<BedHeight> defaultBedHeights = loadBedHeightsByName(this.river, defaults, problems);
50 final BedHeight bedHeight = defaultBedHeights.get(i); 54 if (defaultBedHeights.isEmpty()) {
55 problems.addProblem("sinfo.bedheightsfinder.nobedheightsforriver", this.river.getName());
56 return Collections.emptyList();
57 }
51 58
52 final Range range = bedHeight.getRange(); 59 /*
53 final NumberRange bedRange = new NumberRange(range.getA(), range.getB()); 60 * check for overlapping ranges, N2-search, but we expect only have small
61 * numbers of bed levels
62 */
63 final List<BedHeight> result = new ArrayList<>(defaultBedHeights.size());
54 64
55 if (overlapsRange(bedRange, defaultBedHeights, i + 1)) 65 for (int i = 0; i < defaultBedHeights.size(); i++) {
56 problems.addProblem("sinfo.bedheightsfinder.overlappingrange", bedHeight.getDescription());
57 else
58 result.add(bedHeight);
59 }
60 66
61 final List<BedHeight> validBedHeights = new ArrayList<>(defaultBedHeights.size()); 67 final BedHeight bedHeight = defaultBedHeights.get(i);
62 68
63 // REMARK: check for bad ranges because db schema allow for incomplete ranges, and ignore if this is the case 69 DefaultBedHeight configuredBH = getConfiguredBedheightByDescription(problems, defaults,
64 for (final BedHeight bedHeight : defaultBedHeights) { 70 bedHeight.getDescription());
65 71
66 final Range range = bedHeight.getRange(); 72 final double startKm = configuredBH.startKm < configuredBH.endKm ? configuredBH.startKm
73 : configuredBH.endKm;
74 final double endKm = configuredBH.endKm > configuredBH.startKm ? configuredBH.endKm : configuredBH.startKm;
75 // final NumberRange bedRange = new NumberRange(range.getA(), range.getB());
67 76
68 if (range.getA() == null || range.getB() == null) 77 // FIXME: optional: deckt die echte Range (Datenbank) die
69 problems.addProblem("sinfo.bedheightsfinder.badrange", bedHeight.getDescription()); 78 // konfigurierte Range ab?
70 else
71 validBedHeights.add(bedHeight);
72 }
73 79
74 return result; 80 // copy bedheight and restrict to configured ranges
75 } 81 BedHeight rangedBedheight = BedHeight.copyPojoFrom(bedHeight, startKm, endKm);
82 result.add(rangedBedheight);
83 }
76 84
77 private static List<BedHeight> loadBedHeightsByName(final River river, final Collection<DefaultBedHeight> defaults, final Calculation problems) { 85 final List<BedHeight> validBedHeights = new ArrayList<>(defaultBedHeights.size());
78 86
79 final List<BedHeight> bedHeights = new ArrayList<>(defaults.size()); 87 // REMARK: check for bad ranges because db schema allow for incomplete ranges,
88 // and ignore if this is the case
89 for (final BedHeight bedHeight : defaultBedHeights) {
80 90
81 for (final DefaultBedHeight heightDefault : defaults) { 91 final Range range = bedHeight.getRange();
82 92
83 final String description = heightDefault.description; 93 if (range.getA() == null || range.getB() == null)
84 try { 94 problems.addProblem("sinfo.bedheightsfinder.badrange", bedHeight.getDescription());
95 else
96 validBedHeights.add(bedHeight);
97 }
85 98
86 final BedHeight bedHeight = BedHeight.getBedHeightByDescription(river, description, heightDefault.startKm, heightDefault.endKm); 99 return result;
87 if (bedHeight == null) 100 }
88 problems.addProblem("sinfo.bedheightsfinder.missingdescription", river.getName(), description);
89 else
90 bedHeights.add(bedHeight);
91 }
92 catch (final Exception e) {
93 e.printStackTrace();
94 problems.addProblem("sinfo.bedheightsfinder.missingdescription", river.getName(), description);
95 }
96 }
97 101
98 return bedHeights; 102 private DefaultBedHeight getConfiguredBedheightByDescription(Calculation problems,
99 } 103 Collection<DefaultBedHeight> defaults, String description) {
104 for (DefaultBedHeight bh : defaults) {
105 if (bh.description.equals(description))
106 return bh;
107 }
108 problems.addProblem("could not find the configured bedheight, which is not possible", description);
109 return null;
110 }
100 111
101 private static boolean overlapsRange(final NumberRange bedRange, final List<BedHeight> result, final int startIndex) { 112 private static List<BedHeight> loadBedHeightsByName(final River river, final Collection<DefaultBedHeight> defaults,
113 final Calculation problems) {
102 114
103 for (int i = startIndex; i < result.size(); i++) { 115 final List<BedHeight> bedHeights = new ArrayList<>(defaults.size());
104 116
105 final BedHeight compareBed = result.get(i); 117 for (final DefaultBedHeight heightDefault : defaults) {
106 final Range range = compareBed.getRange();
107 final NumberRange compareRange = new NumberRange(range.getA(), range.getB());
108 118
109 if (compareRange.overlapsRange(bedRange)) 119 final String description = heightDefault.description;
110 return true; 120 try {
111 }
112 121
113 return false; 122 final BedHeight bedHeight = BedHeight.getBedHeightByDescription(river, description,
114 } 123 heightDefault.startKm, heightDefault.endKm);
124 if (bedHeight == null)
125 problems.addProblem("sinfo.bedheightsfinder.missingdescription", river.getName(), description);
126 else
127 bedHeights.add(bedHeight);
128 } catch (final Exception e) {
129 e.printStackTrace();
130 problems.addProblem("sinfo.bedheightsfinder.missingdescription", river.getName(), description);
131 }
132 }
133
134 return bedHeights;
135 }
136
137 /*
138 * this check is replaced by configRangeCheck private static boolean
139 * overlapsRange(final NumberRange bedRange, final List<BedHeight> result, final
140 * int startIndex) {
141 *
142 * for (int i = startIndex; i < result.size(); i++) {
143 *
144 * final BedHeight compareBed = result.get(i); final Range range =
145 * compareBed.getRange(); final NumberRange compareRange = new
146 * NumberRange(range.getA(), range.getB());
147 *
148 * if (compareRange.overlapsRange(bedRange)) return true; }
149 *
150 * return false; }
151 */
115 } 152 }

http://dive4elements.wald.intevation.org