From: Lauchlin W. <me...@la...> - 2013-03-13 06:18:44
|
On 12 March 2013 20:06, PabloDR <pab...@gm...> wrote: > > El 12/03/13 00:30, Lauchlin Wilkinson escribió: > > On 12 March 2013 06:02, PabloDR <pab...@gm...> wrote: > >> Hi, >> >> I found this geotools api (udig) that implements several methods about >> getting information about ArcGridCoverage: >> http://udig.refractions.net/files/docs/api-geotools/index.html >> But in the oficial geotools repository doesn't exists. >> >> Somebody know how to implement/get this class? >> >> Thank you in advance, >> >> Pablo. >> >> >> > Hi, > > Hi, > > Is this code snippet what you are after? Once you have the Coverage2D > object you can just use it like any other coverage. > http://docs.geotools.org/latest/userguide/tutorial/raster/image.html has > more info about using images/rasters. > > Cheers, > > Lauchlin > > import java.io.File; > import java.io.IOException; > import org.geotools.coverage.grid.GridCoverage2D; > import org.geotools.coverage.grid.io.AbstractGridCoverage2DReader; > import org.geotools.coverage.grid.io.AbstractGridFormat; > import org.geotools.coverage.grid.io.GridFormatFinder; > > public class SomeClass { > > public void someMethod() throws IOException { > /** > * requires gt-arcgrid.x.x.jar add the following to your pom.xml > * > * <dependency> > * <groupId>org.geotools</groupId> > * <artifactId>gt-arcgrid</artifactId> > * <version>${geotools.version}</version> > * </dependency> > */ > File file = new File("/path/to/vegetation.asc"); > AbstractGridFormat format = GridFormatFinder.findFormat(file); > AbstractGridCoverage2DReader reader = format.getReader(file); > > GridCoverage2D vegetationCoverage = reader.read(null); > } > > } > > I just use this code to read .asc raster but with it, I can't get > information such us NoDataValue ... > > The link I put up isn't well, the correct link with class implements the > methods I like is this: > > > http://udig.refractions.net/files/docs/api-geotools/org/geotools/gce/arcgrid/ArcGridRaster.html > > Thanks. > Hi, It looks like you are looking at an old version of the api docs (2.3.x). Recent (and latest) builds do not have this class. http://docs.geotools.org/latest/javadocs/org/geotools/gce/arcgrid/package-summary.html I actually asked a similar question a few day back because I was trying to get nodata, min and max values using: vegetationCoverage.getSampleDimension(0).getMinimumValue() vegetationCoverage.getSampleDimension(0).getMaximumValue() vegetationCoverage.getSampleDimension(0).getNoDataValues() etc. But these values do not work because it relies on values stored in the file header and ARCInfo grids don't need to store min-max values. You can however get the NoData value using. vegetationCoverage.getProperty("GC_NODATA") To get min and max I initially ended up doing something like this...which doesn't really work as it confuses nodata and minimum values, which is ok if your nodata is set to something like NaN (which I think might work) import org.jaitools.numeric.SampleStats; import java.awt.image.Raster; import org.apache.commons.lang3.ArrayUtils; . . . Raster raster = coverage.getRenderedImage().getData(); double[] data = new double[raster.getHeight()*raster.getWidth()]; raster.getSamples(raster.getMinX(), raster.getMinY(), raster.getWidth(), raster.getHeight(), 0, data); System.out.println(SampleStats.max(ArrayUtils.toObject(data), true)); So seeing as I hadn't discovered a good solution I ended up going and downloading the source for 2.2 which seems like it is the last version this Class was in. The code that sets the min and max is the following. for (int y = 0; y < getNRows(); y++) { for (int x = 0; x < getNCols(); x++) { // this call always reads the next token double d = readCell(st, x, y); // mask no data values with NaN if (d == getNoData()) { d = Double.NaN; } else { minValue = Math.min(minValue, d); maxValue = Math.max(maxValue, d); } // set the value at x,y in band 0 to the parsed value raster.setSample(x, y, 0, (float) d); } } I couldn't find anything in newer versions that re-implements this so perhaps you are best off just doing the same reimplementing this code snippet yourself. It would be nice if one of the devs that monitor this mailing list could comment on this question. - Lauchlin |