tim@455: /** tim@455: * tim@455: */ tim@455: package de.intevation.gnv.math; tim@455: tim@457: import java.util.ArrayList; tim@455: import java.util.Collection; tim@457: import java.util.HashMap; tim@455: tim@455: import org.apache.log4j.Logger; tim@455: tim@455: import com.vividsolutions.jts.geom.Coordinate; tim@455: tim@455: import de.intevation.gnv.geobackend.base.Result; tim@455: import de.intevation.gnv.geobackend.base.query.QueryExecutor; tim@455: import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory; tim@455: import de.intevation.gnv.geobackend.base.query.exception.QueryException; tim@457: import de.intevation.gnv.geobackend.sde.datasources.RasterObject; tim@455: tim@455: tim@455: /** tim@455: * @author Tim Englich tim@455: * tim@455: */ tim@455: public class QueriedXYDepth implements XYDepth { tim@455: tim@455: /** tim@455: * the logger, used to log exceptions and additonaly information tim@455: */ tim@455: private static Logger log = Logger.getLogger(QueriedXYDepth.class); tim@455: tim@455: private String queryID = "rasterQuery"; tim@455: tim@455: private QueryExecutor queryExecutor = null; tim@455: tim@457: private ArrayList rasterData = new ArrayList(); tim@457: tim@455: /** tim@455: * Constructor tim@455: */ tim@455: public QueriedXYDepth() { tim@455: this.queryExecutor = QueryExecutorFactory.getInstance().getQueryExecutor(); tim@455: } tim@455: tim@455: /** tim@455: * @see de.intevation.gnv.math.XYDepth#depth(com.vividsolutions.jts.geom.Coordinate) tim@455: */ tim@455: public double depth(Coordinate coordinate) { tim@455: log.debug("QueriedXYDepth.depth for " + coordinate.x+" "+ coordinate.y); tim@457: double resultValue = Double.NaN; tim@455: tim@457: RasterObject ro = this.getRasterObject(coordinate); tim@457: tim@457: if (ro == null){ tim@457: Collection result = null; tim@457: try { tim@457: String[] filterValues = new String[]{"Point ("+coordinate.x+" "+coordinate.y+")"}; tim@457: result = this.queryExecutor.executeQuery(this.queryID,filterValues); tim@457: } catch (QueryException e) { tim@457: log.error(e,e); tim@455: } tim@457: tim@457: if (result != null){ tim@457: if (!result.isEmpty()){ tim@457: Result row = result.iterator().next(); tim@457: ro = (RasterObject)row.getObject(0); tim@457: synchronized (rasterData) { tim@457: rasterData.add(ro); tim@457: } tim@457: } tim@457: } tim@457: } tim@457: if (ro != null){ tim@457: resultValue = ro.getValue(coordinate); tim@455: } tim@455: return resultValue; tim@455: } tim@457: tim@457: private RasterObject getRasterObject(Coordinate coordinate){ tim@457: for (int i = 0; i < rasterData.size(); i++){ tim@457: RasterObject ro = rasterData.get(i); tim@457: if (ro.getEnvelope().contains(coordinate)){ tim@457: return ro; tim@457: } tim@457: } tim@457: return null; tim@457: tim@457: } tim@455: tim@455: }