view gnv-artifacts/src/main/java/de/intevation/gnv/math/QueriedXYDepth.java @ 457:47ad9721e692

Added RasterObject for caching the Rastertiles to get a better performance. gnv-artifacts/trunk@509 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Tim Englich <tim.englich@intevation.de>
date Tue, 05 Jan 2010 14:12:03 +0000
parents 363236fc462d
children 92d6cf448598
line wrap: on
line source
/**
 *
 */
package de.intevation.gnv.math;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;

import org.apache.log4j.Logger;

import com.vividsolutions.jts.geom.Coordinate;

import de.intevation.gnv.geobackend.base.Result;
import de.intevation.gnv.geobackend.base.query.QueryExecutor;
import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory;
import de.intevation.gnv.geobackend.base.query.exception.QueryException;
import de.intevation.gnv.geobackend.sde.datasources.RasterObject;


/**
 * @author Tim Englich <tim.englich@intevation.de>
 *
 */
public class QueriedXYDepth implements XYDepth {

    /**
     * the logger, used to log exceptions and additonaly information
     */
    private static Logger log = Logger.getLogger(QueriedXYDepth.class);
    
    private String queryID = "rasterQuery";
    
    private QueryExecutor queryExecutor = null;
    
    private ArrayList<RasterObject> rasterData = new ArrayList<RasterObject>();
    
    /**
     * Constructor
     */
    public QueriedXYDepth() {
        this.queryExecutor = QueryExecutorFactory.getInstance().getQueryExecutor();
    }

    /**
     * @see de.intevation.gnv.math.XYDepth#depth(com.vividsolutions.jts.geom.Coordinate)
     */
    public double depth(Coordinate coordinate) {
        log.debug("QueriedXYDepth.depth for " + coordinate.x+" "+ coordinate.y);
        double resultValue = Double.NaN;
        
        RasterObject ro = this.getRasterObject(coordinate);
        
        if (ro == null){
            Collection<Result> result = null;
            try {
                String[] filterValues = new String[]{"Point ("+coordinate.x+" "+coordinate.y+")"};
                result = this.queryExecutor.executeQuery(this.queryID,filterValues);
            } catch (QueryException e) {
                log.error(e,e);
            }
            
            if (result != null){
                if (!result.isEmpty()){
                    Result row = result.iterator().next();
                    ro = (RasterObject)row.getObject(0);
                    synchronized (rasterData) {
                        rasterData.add(ro);
                    }
                }
            }
        }
        if (ro != null){
            resultValue = ro.getValue(coordinate); 
        }
        return resultValue;
    }
    
    private RasterObject getRasterObject(Coordinate coordinate){
        for (int i = 0; i < rasterData.size(); i++){
            RasterObject ro = rasterData.get(i);
            if (ro.getEnvelope().contains(coordinate)){
                return ro;
            }
        }
        return null;
       
    }

}

http://dive4elements.wald.intevation.org