Mercurial > dive4elements > gnv-client
comparison gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java @ 357:25e4724aa504
Fill (i, j)-gaps when building index buffer.
gnv-artifacts/trunk@430 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Tue, 15 Dec 2009 15:14:21 +0000 |
parents | 24c21a720aa5 |
children | aec85d00d82c |
comparison
equal
deleted
inserted
replaced
356:3eee1369c79b | 357:25e4724aa504 |
---|---|
15 import com.vividsolutions.jts.geom.LineString; | 15 import com.vividsolutions.jts.geom.LineString; |
16 import com.vividsolutions.jts.io.ParseException; | 16 import com.vividsolutions.jts.io.ParseException; |
17 import com.vividsolutions.jts.io.WKTReader; | 17 import com.vividsolutions.jts.io.WKTReader; |
18 | 18 |
19 import de.intevation.artifactdatabase.Config; | 19 import de.intevation.artifactdatabase.Config; |
20 | |
20 import de.intevation.gnv.artifacts.cache.CacheFactory; | 21 import de.intevation.gnv.artifacts.cache.CacheFactory; |
22 | |
21 import de.intevation.gnv.geobackend.base.Result; | 23 import de.intevation.gnv.geobackend.base.Result; |
22 import de.intevation.gnv.geobackend.base.query.QueryExecutor; | 24 import de.intevation.gnv.geobackend.base.query.QueryExecutor; |
23 import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory; | 25 import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory; |
24 import de.intevation.gnv.geobackend.base.query.exception.QueryException; | 26 import de.intevation.gnv.geobackend.base.query.exception.QueryException; |
25 import de.intevation.gnv.geobackend.sde.datasources.ResultSet; | 27 import de.intevation.gnv.geobackend.sde.datasources.ResultSet; |
28 | |
26 import de.intevation.gnv.utils.IndexBuffer; | 29 import de.intevation.gnv.utils.IndexBuffer; |
30 | |
31 import de.intevation.gnv.math.LinearFunction; | |
32 | |
33 import org.apache.commons.math.optimization.fitting.CurveFitter; | |
34 | |
35 import org.apache.commons.math.optimization.general.GaussNewtonOptimizer; | |
36 import org.apache.commons.math.optimization.OptimizationException; | |
37 | |
38 import org.apache.commons.math.FunctionEvaluationException; | |
27 | 39 |
28 /** | 40 /** |
29 * @author Tim Englich <tim.englich@intevation.de> | 41 * @author Tim Englich <tim.englich@intevation.de> |
30 * | 42 * |
31 */ | 43 */ |
76 }else{ | 88 }else{ |
77 | 89 |
78 if (this.inputData.containsKey("mesh_linestring")){ | 90 if (this.inputData.containsKey("mesh_linestring")){ |
79 | 91 |
80 try { | 92 try { |
81 // 1. IJK Anfragen für Stützpunkte im Netz ausführen. | 93 // 1. IJK Anfragen für Stuetzpunkte im Netz ausführen. |
82 LineString ls = (LineString)new WKTReader().read(this.inputData | 94 LineString ls = (LineString)new WKTReader().read(this.inputData |
83 .get("mesh_linestring") | 95 .get("mesh_linestring") |
84 .getValue()); | 96 .getValue()); |
85 Coordinate[] coords = ls.getCoordinates(); | 97 Coordinate[] coords = ls.getCoordinates(); |
86 | 98 |
88 | 100 |
89 String meshid = this.inputData.get("meshid").getValue(); | 101 String meshid = this.inputData.get("meshid").getValue(); |
90 QueryExecutor queryExecutor = QueryExecutorFactory | 102 QueryExecutor queryExecutor = QueryExecutorFactory |
91 .getInstance() | 103 .getInstance() |
92 .getQueryExecutor(); | 104 .getQueryExecutor(); |
93 for (int i = 0; i < coords.length; i++){ | 105 |
106 ArrayList missingPoints = new ArrayList(); | |
107 | |
108 String additionWhere = "TRUE"; | |
109 | |
110 for (int i = 0; i < coords.length; i++) { | |
111 | |
94 String wkt = "POINT( "+coords[i].x+" "+coords[i].y+" )"; | 112 String wkt = "POINT( "+coords[i].x+" "+coords[i].y+" )"; |
95 | 113 |
96 result = queryExecutor.executeQuery(this.ijkQueryID, | 114 result = queryExecutor.executeQuery(this.ijkQueryID, |
97 new String[]{meshid,wkt}); | 115 new String[]{meshid,wkt}); |
98 if (!result.isEmpty()){ | 116 if (!result.isEmpty()){ |
101 int jPos = resultValue.getInteger(0); | 119 int jPos = resultValue.getInteger(0); |
102 log.debug("Found Pos "+iPos+"/"+jPos +" for "+wkt); | 120 log.debug("Found Pos "+iPos+"/"+jPos +" for "+wkt); |
103 points.add(i, new java.awt.Point(iPos,jPos)); | 121 points.add(i, new java.awt.Point(iPos,jPos)); |
104 }else{ | 122 }else{ |
105 log.debug("No i/j Pos found for "+wkt); | 123 log.debug("No i/j Pos found for "+wkt); |
124 missingPoints.add(new Object [] { Integer.valueOf(i), coords[i] }); | |
106 points.add(i, null); | 125 points.add(i, null); |
107 // Special Case no i,j found for Coordinate | 126 // Special Case no i,j found for Coordinate |
108 } | 127 } |
109 } | 128 } |
110 // TODO: Make Tablenames and Columns Configurable | 129 |
111 IndexBuffer ib = new IndexBuffer(points, "MEDIAN.MESHPOINT.IPOSITION", " MEDIAN.MESHPOINT.JPOSITION" ); | 130 if (missingPoints.size() == coords.length) { |
112 String additionWhere = ib.toWhereClause(); | 131 log.debug("cannot create index buffer"); |
113 log.debug("Additional Where Clause = "+additionWhere); | 132 } |
114 // 2. Aus diesen Stützpunkten den Resultset generieren. | 133 else { // generate index filter |
134 boolean remainsMissingPoints = !missingPoints.isEmpty(); | |
135 | |
136 if (remainsMissingPoints) { | |
137 // try to guess the missing (i, j) | |
138 CurveFitter iFitter = new CurveFitter(new GaussNewtonOptimizer(true)); | |
139 CurveFitter jFitter = new CurveFitter(new GaussNewtonOptimizer(true)); | |
140 | |
141 for (int i = 0, N = points.size(); i < N; ++i) { | |
142 java.awt.Point p = (java.awt.Point)points.get(i); | |
143 if (p != null) { | |
144 Coordinate coord = coords[i]; | |
145 iFitter.addObservedPoint(coord.x, p.x); | |
146 jFitter.addObservedPoint(coord.y, p.y); | |
147 } | |
148 } | |
149 try { | |
150 // XXX: Assumption: (i, j) are created by componentwise linear function. | |
151 // This is surely not correct because (x, y) are in a ellipsoid projection. | |
152 // TODO: use ellipsoid functions and fit with Levenberg Marquardt. | |
153 double [] iParams = iFitter.fit( | |
154 LinearFunction.INSTANCE, new double [] { 1d, 1d }); | |
155 | |
156 double [] jParams = jFitter.fit( | |
157 LinearFunction.INSTANCE, new double [] { 1d, 1d }); | |
158 | |
159 for (int i = missingPoints.size()-1; i >= 0; --i) { | |
160 Object [] a = (Object [])missingPoints.get(i); | |
161 Coordinate coord = (Coordinate)a[1]; | |
162 int pi = (int)Math.round(iParams[0]*coord.x + iParams[1]); | |
163 int pj = (int)Math.round(jParams[0]*coord.y + jParams[1]); | |
164 points.set( | |
165 ((Integer)a[0]).intValue(), | |
166 new java.awt.Point(pi, pj)); | |
167 } | |
168 | |
169 remainsMissingPoints = false; // we filled the gaps | |
170 } | |
171 catch (FunctionEvaluationException fee) { | |
172 log.error(fee); | |
173 } | |
174 catch (OptimizationException oe) { | |
175 log.error(oe); | |
176 } | |
177 } | |
178 | |
179 if (!remainsMissingPoints) { | |
180 // TODO: Make Tablenames and Columns Configurable | |
181 IndexBuffer ib = new IndexBuffer( | |
182 points, | |
183 "MEDIAN.MESHPOINT.IPOSITION", | |
184 "MEDIAN.MESHPOINT.JPOSITION" ); | |
185 additionWhere = ib.toWhereClause(); | |
186 log.debug("Additional Where Clause = "+additionWhere); | |
187 // 2. Aus diesen Stuetzpunkten den Resultset generieren. | |
188 } | |
189 } // if generate index filter | |
115 | 190 |
116 String[] filterValues = this.generateFilterValuesFromInputData(); | 191 String[] filterValues = this.generateFilterValuesFromInputData(); |
117 String[] addedFilterValues = new String[filterValues.length+1]; | 192 String[] addedFilterValues = new String[filterValues.length+1]; |
118 System.arraycopy(filterValues, 0, addedFilterValues, 0, filterValues.length); | 193 System.arraycopy(filterValues, 0, addedFilterValues, 0, filterValues.length); |
119 addedFilterValues[filterValues.length] = additionWhere; | 194 addedFilterValues[filterValues.length] = additionWhere; |
120 | 195 |
121 result = queryExecutor.executeQuery(this.queryID, | 196 result = queryExecutor.executeQuery(this.queryID, |
122 addedFilterValues); | 197 addedFilterValues); |
123 | |
124 | 198 |
125 } catch (ParseException e) { | 199 } catch (ParseException e) { |
126 log.error(e,e); | 200 log.error(e,e); |
127 }catch (QueryException e) { | 201 }catch (QueryException e) { |
128 log.error(e,e); | 202 log.error(e,e); |