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);

http://dive4elements.wald.intevation.org