Fine, at least I'm not getting crazy.
I tried your gdal_translate solution and in fact it works well.
There is only one problem, which I already noticed also with the world
image files. If I zoom in once or twice I get the following exception:
Error: One factory fails for the operation "FilteredSubsample"
Occurs in: javax.media.jai.ThreadSafeOperationRegistry
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at javax.media.jai.FactoryCache.invoke(FactoryCache.java:122)
at
javax.media.jai.OperationRegistry.invokeFactory(OperationRegistry.java:1674)
at
javax.media.jai.ThreadSafeOperationRegistry.invokeFactory(ThreadSafeOperationRegistry.java:473)
at javax.media.jai.registry.RIFRegistry.create(RIFRegistry.java:332)
at javax.media.jai.RenderedOp.createInstance(RenderedOp.java:819)
at javax.media.jai.RenderedOp.createRendering(RenderedOp.java:867)
at javax.media.jai.RenderedOp.getMinX(RenderedOp.java:2161)
at
org.geotools.coverage.grid.GeneralGridRange.<init>(GeneralGridRange.java:165)
at
org.geotools.coverage.grid.GeneralGridRange.<init>(GeneralGridRange.java:153)
at
org.geotools.coverage.processing.operation.FilteredSubsampledGridCoverage2D.<init>(FilteredSubsampledGridCoverage2D.java:69)
at
org.geotools.coverage.processing.operation.FilteredSubsampledGridCoverage2D.create(FilteredSubsampledGridCoverage2D.java:220)
at
org.geotools.coverage.processing.operation.FilteredSubsample.doOperation(FilteredSubsample.java:132)
at
org.geotools.renderer.lite.gridcoverage2d.GridCoverageRenderer.filteredSubsample(GridCoverageRenderer.java:794)
at
org.geotools.renderer.lite.gridcoverage2d.GridCoverageRenderer.paint(GridCoverageRenderer.java:455)
at
org.geotools.renderer.lite.StreamingRenderer.renderRaster(StreamingRenderer.java:1815)
at
org.geotools.renderer.lite.StreamingRenderer.processSymbolizers(StreamingRenderer.java:1669)
at
org.geotools.renderer.lite.StreamingRenderer.process(StreamingRenderer.java:1613)
at
org.geotools.renderer.lite.StreamingRenderer.processStylers(StreamingRenderer.java:1555)
at
org.geotools.renderer.lite.StreamingRenderer.paint(StreamingRenderer.java:556)
at
org.geotools.renderer.lite.StreamingRenderer.paint(StreamingRenderer.java:406)
What is the problem. Isn't it able to resample the image beyond a
certain zoom (which in that case however is too less to be expected as
problematic)?
Andrea
> Andrea, Simone,
> I still don't have a solution, but I think I do have some hints
> on what's happening. I've attached a working app (with the same
> JAI initialization code used by Geoserver).
>
> If I try to renderer the indexed file as is, I get an OOM.
> If I create an alternate version that does not use compression using:
> gdal_translate km054086.tif alternate.tif
> and create alternate.prj and alternate.tfw, I get an OOM.
>
> If I force the creation of a proper geotiff using:
> gdal_translate -of GTiff -a_srs "EPSG:2003" km054086.tif indexed.tiff
> and use the geotiff driver to render it, it works like a charm.
>
> What does this mean? Well, it seems to me the Geotiff reader
> is using some optimized reading path that's not used by the
> plain image+world reader. That may explain why Geoserver is slow
> at rendering the original image (thought I miss the secret sauce
> that makes Geoserver render it without OOM....)
>
> If this is true, all we need to do is to make the world image reader
> smarter when it hits a tiff image.
>
> Simone, comments?
> Cheeers
> Andrea
>
>
>
> package org.vfny.geoserver.jetty;
>
> import java.awt.Rectangle;
> import java.awt.image.BufferedImage;
> import java.io.File;
> import java.util.HashMap;
>
> import javax.imageio.ImageIO;
> import javax.media.jai.JAI;
> import javax.media.jai.RecyclingTileFactory;
>
> import org.geotools.gce.geotiff.GeoTiffFormat;
> import org.geotools.gce.geotiff.GeoTiffReader;
> import org.geotools.gce.image.WorldImageFormat;
> import org.geotools.gce.image.WorldImageReader;
> import org.geotools.geometry.jts.ReferencedEnvelope;
> import org.geotools.map.DefaultMapContext;
> import org.geotools.map.MapContext;
> import org.geotools.referencing.CRS;
> import org.geotools.renderer.GTRenderer;
> import org.geotools.renderer.lite.StreamingRenderer;
> import org.geotools.styling.RasterSymbolizer;
> import org.geotools.styling.StyleBuilder;
> import org.opengis.coverage.grid.GridCoverage;
> import org.opengis.referencing.FactoryException;
> import org.opengis.referencing.NoSuchAuthorityCodeException;
> import org.opengis.referencing.crs.CoordinateReferenceSystem;
>
> import com.sun.media.jai.util.SunTileCache;
> import com.vividsolutions.jts.geom.Envelope;
>
> public class GeotiffRenderer {
> public static void main(String[] args) throws
> NoSuchAuthorityCodeException, FactoryException {
> JAI jaiDef = JAI.getDefaultInstance();
> jaiDef.setRenderingHint(JAI.KEY_CACHED_TILE_RECYCLING_ENABLED,
> new Boolean (true));
> // tile factory and recycler
> final RecyclingTileFactory recyclingFactory = new
> RecyclingTileFactory();
> jaiDef.setRenderingHint(JAI.KEY_TILE_FACTORY, recyclingFactory);
> jaiDef.setRenderingHint(JAI.KEY_TILE_RECYCLER, recyclingFactory);
>
> // Setting up Cache Capacity
> SunTileCache jaiCache = (SunTileCache) jaiDef.getTileCache();
> jaiCache.setMemoryCapacity(50 * 1024 * 1024);
>
> // Setting up Cahce Threshold
> jaiCache.setMemoryThreshold((float) 0.75);
>
> jaiDef.getTileScheduler().setParallelism(7);
> jaiDef.getTileScheduler().setPrefetchParallelism(7);
> jaiDef.getTileScheduler().setPriority(5);
> jaiDef.getTileScheduler().setPrefetchPriority(5);
>
> ImageIO.setUseCache(true);
>
> // String rasterPath =
> "C:\\progetti\\gisData\\tiffIndexed\\km054086.tif";
> // File tiffFile = new File(rasterPath);
> // WorldImageReader wiR = (WorldImageReader) ((new
> WorldImageFormat()).getReader(tiffFile));
> // GridCoverage imgCov = null;
> // try {
> // imgCov = wiR.read(null);
> //
> // } catch (Exception e) {
> // e.printStackTrace();
> // }
>
> // String rasterPath =
> "C:\\progetti\\gisData\\tiffIndexed\\indexed.tiff";
> // File tiffFile = new File(rasterPath);
> // GeoTiffReader wiR = (GeoTiffReader) ((new
> GeoTiffFormat()).getReader(tiffFile));
> // GridCoverage imgCov = null;
> // try {
> // imgCov = wiR.read(null);
> //
> // } catch (Exception e) {
> // e.printStackTrace();
> // }
>
> String rasterPath = "C:\\progetti\\gisData\\tiffIndexed\\alternate.tif";
> File tiffFile = new File(rasterPath);
> WorldImageReader wiR = (WorldImageReader) ((new
> WorldImageFormat()).getReader(tiffFile));
> GridCoverage imgCov = null;
> try {
> imgCov = wiR.read(null);
>
> } catch (Exception e) {
> e.printStackTrace();
> }
>
> StyleBuilder sb = new StyleBuilder();
> RasterSymbolizer rsDem = sb.createRasterSymbolizer();
> org.geotools.styling.Style demStyle = sb.createStyle(rsDem);
> CoordinateReferenceSystem cr = CRS.decode("EPSG:3003");
> MapContext map = new DefaultMapContext(cr);
> map.addLayer(imgCov, demStyle);
> org.opengis.spatialschema.geometry.Envelope env =
> imgCov.getEnvelope();
> Envelope envelope = new Envelope(env.getUpperCorner().getOrdinate(0),
> env.getLowerCorner().getOrdinate(0),
> env.getUpperCorner().getOrdinate(1),
> env.getLowerCorner().getOrdinate(1));
>
> ReferencedEnvelope area = new ReferencedEnvelope(envelope, map
> .getCoordinateReferenceSystem());
> map.setAreaOfInterest(area);
>
> GTRenderer renderer;
> if (false) {
> renderer = new StreamingRenderer();
> HashMap hints = new HashMap();
> hints.put("memoryPreloadingEnabled", Boolean.TRUE);
> renderer.setRendererHints(hints);
> } else {
> renderer = new StreamingRenderer();
> }
>
> BufferedImage bi = new BufferedImage(1024, 768,
> BufferedImage.TYPE_4BYTE_ABGR);
> renderer.setContext(map);
> renderer.paint(bi.createGraphics(), new Rectangle(1024, 768), area);
> }
> }
--
____________________________________________________________________________
HydroloGIS - Environmental Safety Modelling
Siemens Str. 19 via Siemens
I-39100 Bozen - Bolzano
www.hydrologis.com
Andrea Antonello
Environmental Engineer
PhD Student at www.uniurb.it
JGrass, Free Open Source GIS www.jgrass.org
tel. +39 0471 068065
mobile: +39 328 8497722
fax: +39 36 328 8497722
email: [EMAIL PROTECTED]
"Let it be as much a great honour to take as to give learning,
if you want to be called wise."
Skuggsja' - The King's mirror - 1240 Reykjavik
____________________________________________________________________________
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Geotools-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geotools-devel