Thanks a lot. 



在2009-05-11,"Michael Bedward" <[email protected]> 写道:
>Hi Zeng,
>
>I'm posting the code here so that if anyone else spots glaring errors
>in it they can warn you :-)
>
>Note, in my app I was only working with double valued, single-band
>coverages but it would be easy to extend this class to deal with more
>types and multi-band data.
>
>Let me know if you have any problems with it.
>
>Michael
>
>
>package org.cafeanimal.geo.gridlayer;
>
>import java.awt.geom.Point2D;
>import java.awt.geom.Rectangle2D;
>import java.awt.image.DataBuffer;
>import java.io.File;
>import java.io.IOException;
>import java.util.ArrayList;
>import java.util.Arrays;
>import java.util.List;
>import javax.media.jai.TiledImage;
>import javax.media.jai.iterator.RandomIterFactory;
>import javax.media.jai.iterator.WritableRandomIter;
>import javax.media.jai.operator.FormatDescriptor;
>import org.geotools.coverage.grid.GridCoverage2D;
>import org.geotools.geometry.Envelope2D;
>import org.geotools.image.ImageWorker;
>import org.opengis.coverage.PointOutsideCoverageException;
>import org.opengis.geometry.Envelope;
>import org.opengis.referencing.operation.MathTransform2D;
>import org.opengis.referencing.operation.NoninvertibleTransformException;
>import org.opengis.referencing.operation.TransformException;
>
>/**
> *
> * @author Michael Bedward and Murray Ellis
> */
>public class WritableGridCoverage {
>
>    private GridCoverage2D gridCov;
>    private MathTransform2D worldToGrid = null;
>    private double[] dbuf = new double[1];
>    private static final int MAX_PENDING_VALUES = 10000;
>
>    private static class PendingValue {
>        Point2D.Double pos;
>        boolean isGeographic;
>        double value;
>    }
>
>    private List<PendingValue> pendingValues = new ArrayList<PendingValue>();
>
>    /**
>     * Constructor
>     * @param gridCov the GridCoverage2D object to be wrapped
>     */
>    public WritableGridCoverage(GridCoverage2D gridCov) {
>        this.gridCov = gridCov;
>    }
>
>    public GridCoverage2D getGridCoverage() {
>        flushCache(true);
>        return gridCov;
>    }
>
>    public String getName() {
>        return gridCov.getName().toString();
>    }
>
>    public int getNumRows() {
>        return gridCov.getRenderedImage().getHeight();
>    }
>
>    public int getNumCols() {
>        return gridCov.getRenderedImage().getWidth();
>    }
>
>    public Rectangle2D.Double getBounds() {
>        Envelope2D env = gridCov.getEnvelope2D();
>        return new Rectangle2D.Double(env.x, env.y, env.width, env.height);
>    }
>
>    public double getPixelWidth() {
>        return gridCov.getEnvelope2D().getWidth() / getNumCols();
>    }
>
>    public double getValueAtPos(Point2D pos) {
>        flushCache(true);
>
>        try {
>            gridCov.evaluate(pos, dbuf);
>        } catch (PointOutsideCoverageException ex) {
>            return Double.NaN;
>        }
>
>        return dbuf[0];
>    }
>
>    public int getValueAtPosAsInt(Point2D pos, int defaultValue) {
>        double val = getValueAtPos(pos);
>        if (Double.isNaN(val)) {
>            return defaultValue;
>        } else {
>            return (int) Math.round(val);
>        }
>    }
>
>    public double[] getValuesAtPos(Point2D pos, double[] buf) {
>        flushCache(true);
>
>        if (buf == null) {
>            buf = new double[gridCov.getNumSampleDimensions()];
>        }
>
>        try {
>            buf = gridCov.evaluate(pos, buf);
>        } catch (PointOutsideCoverageException ex) {
>            Arrays.fill(buf, Double.NaN);
>        }
>
>        return buf;
>    }
>
>    public void saveAsJPEG(File path) {
>        try {
>            ImageWorker iw = new ImageWorker(gridCov.getRenderedImage());
>            if (!iw.isBytes()) {
>
>iw.setImage(FormatDescriptor.create(gridCov.getRenderedImage(),
>DataBuffer.TYPE_BYTE, null));
>            }
>            iw.write(path);
>        } catch (IOException ex) {
>            System.out.println(ex.getMessage());
>        }
>    }
>
>    public void setValueAtPos(Point2D pos, int value) {
>        Number n = Integer.valueOf(value);
>        doSetValue(pos, n);
>    }
>
>    public void setValueAtPos(Point2D pos, float value) {
>        Number n = new Float(value);
>        doSetValue(pos, n);
>    }
>
>    public void setValueAtPos(Point2D pos, double value) {
>        Number n = new Double(value);
>        doSetValue(pos, n);
>    }
>
>    private void doSetValue(Point2D pos, Number value) {
>        PendingValue pv = new PendingValue();
>        pv.pos = new Point2D.Double(pos.getX(), pos.getY());
>        pv.isGeographic = true;
>        pv.value = value.doubleValue();
>        pendingValues.add(pv);
>        flushCache(false);
>    }
>
>    private void flushCache(boolean force) {
>        if (pendingValues.size() >= MAX_PENDING_VALUES || (force &&
>pendingValues.size() > 0)) {
>            if (worldToGrid == null) {
>                try {
>                    worldToGrid =
>gridCov.getGridGeometry().getGridToCRS2D().inverse();
>                } catch (NoninvertibleTransformException ex) {
>                    throw new RuntimeException("Could not create
>geographic to grid coords transform");
>                }
>            }
>
>            TiledImage tImg = new TiledImage(gridCov.getRenderedImage(), true);
>            WritableRandomIter writeIter =
>RandomIterFactory.createWritable(tImg, null);
>
>            Point2D.Double gridPos = new Point2D.Double();
>            for (PendingValue pv : pendingValues) {
>                if (pv.isGeographic) {
>                    try {
>                        worldToGrid.transform(pv.pos, gridPos);
>                    } catch (TransformException ex) {
>                        throw new RuntimeException("Could not
>transform location [" +
>                                pv.pos + "] to grid coords");
>                    }
>                } else {
>                    gridPos.setLocation(pv.pos);
>                }
>
>                writeIter.setSample((int) gridPos.x, (int) gridPos.y,
>0, pv.value);
>            }
>
>            pendingValues.clear();
>
>            String name = getName();
>            Envelope env = gridCov.getEnvelope();
>        }
>    }
>}
------------------------------------------------------------------------------
The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your
production scanning environment may not be a perfect world - but thanks to
Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700
Series Scanner you'll get full speed at 300 dpi even with all image 
processing features enabled. http://p.sf.net/sfu/kodak-com
_______________________________________________
Geotools-gt2-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users

Reply via email to