Hello
In our attempt to uses NetCDF data with Geoserver, we get the attached stack
trace. The NetCDF image is an 16-bits indexed image (IndexColorModel with
DataBuffer.TYPE_USHORT). My feeling is that, at some place in the rendering
chain, the indexed image is transformed into a RGBA image. But because the last
lines in ScaledGridCoverage2D construct a new GridCoverage2D using the same
sample dimensions than the original one, we get an exception because we are
tring to apply a sample dimensions for 1-band images to a 4-bands image. I would
like to know from Simone: is it a raisonable hypothesis?
If this is a reasonable hypothesis, the next problem is to spot where in the
code the indexed image is transformed into a 4-bands image. I can't debug the
code because I do not yet run Geoserver on my machine, so the following is based
only from code inspection:
I noticed that ScaledGridCoverage2D do not set the
JAI.KEY_REPLACE_INDEX_COLOR_MODEL hint. In the particular case of JAI "Scale"
operation, the default value is Boolean.TRUE. I would like to set the default in
Geotools to Boolean.FALSE, as I did for all other operations. The rational is
that, from my point of view, GIS field is different from photographic field in
that data are sometime more important than the looking (depending application).
A JAI.KEY_REPLACE_INDEX_COLOR_MODEL hint set to Boolean.TRUE "destroy" the data
and may also be responsible for the exception we are facing right now. It is
important to give the user the opportunity to set the hint explicitly to TRUE if
we wants, but my opinion is that in GIS field the default should be data
integrity. What do you think?
Do you allows me to refactor "Scale" as a subclass of "OperationJAI" instead of
"Operation2D"? It would allow us to get right of "ScaledGridCoverage2D"
completly, since most of the work performed by ScaledGridCoverage2D duplicate
OperationJAI (the later try to be generic, which I admit is a cause of
complexity). The JAI.KEY_REPLACE_INDEX_COLOR_MODEL hint would become
Boolean.FALSE in the process. Same would need to be done for CroppedCoverage2D,
because it use the "Translate" operation.
Note for Cédric: please try to add the following line in ScaledCoverage2D and
CroppedCoverage2D (package org.geotools.coverage.processing.operation) just
before a call to processor.createNS("Scale", ...) or
processor.createNS("Translate", ...) method (or JAI.create(...)):
hints.put(JAI.KEY_REPLACE_INDEX_COLOR_MODEL, Boolean.FALSE);
and tell us if it is of any help.
Martin.
5 déc. 2006 14:32:43 Registry registerGeotoolsServices
CONFIG: Chargement des extensions de Geotools aux opérations de JAI.
5 déc. 2006 14:32:43 org.geotools.factory.FactoryRegistry scanForPlugins
CONFIG: Implémentations des fabriques de catégorie Operation:
org.geotools.coverage.processing.operation.Absolute
org.geotools.coverage.processing.operation.AddConst
org.geotools.coverage.processing.operation.Convolve
org.geotools.coverage.processing.operation.DivideByConst
org.geotools.coverage.processing.operation.Exp
org.geotools.coverage.processing.operation.GradientMagnitude
org.geotools.coverage.processing.operation.Interpolate
org.geotools.coverage.processing.operation.Invert
org.geotools.coverage.processing.operation.Log
org.geotools.coverage.processing.operation.MaxFilter
org.geotools.coverage.processing.operation.MedianFilter
org.geotools.coverage.processing.operation.MinFilter
org.geotools.coverage.processing.operation.MultiplyConst
org.geotools.coverage.processing.operation.NodataFilter
org.geotools.coverage.processing.operation.Resample
org.geotools.coverage.processing.operation.Rescale
org.geotools.coverage.processing.operation.SelectSampleDimension
org.geotools.coverage.processing.operation.SubtractConst
org.geotools.coverage.processing.operation.SubtractFromConst
org.geotools.coverage.processing.operation.Recolor
org.geotools.coverage.processing.operation.Crop
org.geotools.coverage.processing.operation.Scale
org.geotools.coverage.processing.operation.FilteredSubsample
org.geotools.coverage.processing.operation.SubsampleAverage
5 déc. 2006 14:32:45 org.vfny.geoserver.servlets.AbstractService doService
INFO: Service handled
5 déc. 2006 14:32:45 org.vfny.geoserver.servlets.AbstractService doService
INFO: handling request: [EMAIL PROTECTED]
5 déc. 2006 14:32:46 org.vfny.geoserver.servlets.AbstractService doService
INFO: Service handled
5 déc. 2006 14:35:57 org.vfny.geoserver.servlets.AbstractService doService
INFO: handling request: [EMAIL PROTECTED]
5 déc. 2006 14:35:59 org.geotools.renderer.lite.StreamingRenderer renderRaster
ATTENTION: Le nombre de bandes de l'image (4) ne correspond pas au nombre
d'objets 'SampleDimension' spécifiés (1).
java.lang.IllegalArgumentException: Le nombre de bandes de l'image (4) ne
correspond pas au nombre d'objets 'SampleDimension' spécifiés (1).
at
org.geotools.coverage.grid.Grid2DSampleDimension.create(Grid2DSampleDimension.java:118)
at org.geotools.coverage.grid.GridCoverage2D.<init>(GridCoverage2D.java:271)
at
org.geotools.coverage.processing.operation.ScaledGridCoverage2D.<init>(ScaledGridCoverage2D.java:180)
at
org.geotools.coverage.processing.operation.ScaledGridCoverage2D.create(ScaledGridCoverage2D.java:172)
at
org.geotools.coverage.processing.operation.Scale.doOperation(Scale.java:158)
at
org.geotools.renderer.lite.gridcoverage2d.GridCoverageRenderer.scale(GridCoverageRenderer.java:736)
at
org.geotools.renderer.lite.gridcoverage2d.GridCoverageRenderer.paint(GridCoverageRenderer.java:564)
at
org.geotools.renderer.lite.StreamingRenderer.renderRaster(StreamingRenderer.java:1795)
at
org.geotools.renderer.lite.StreamingRenderer.processSymbolizers(StreamingRenderer.java:1586)
at
org.geotools.renderer.lite.StreamingRenderer.process(StreamingRenderer.java:1530)
at
org.geotools.renderer.lite.StreamingRenderer.processStylers(StreamingRenderer.java:1472)
at
org.geotools.renderer.lite.StreamingRenderer.paint(StreamingRenderer.java:687)
at
org.geotools.renderer.lite.StreamingRenderer.paint(StreamingRenderer.java:430)
at
org.vfny.geoserver.wms.responses.DefaultRasterMapProducer.produceMap(DefaultRasterMapProducer.java:269)
at
org.vfny.geoserver.wms.responses.GetMapResponse.execute(GetMapResponse.java:308)
at
org.vfny.geoserver.servlets.AbstractService.doService(AbstractService.java:535)
at
org.vfny.geoserver.servlets.AbstractService.doGet(AbstractService.java:340)
at org.geoserver.request.Dispatcher.dispatch(Dispatcher.java:195)
at org.geoserver.request.Dispatcher.handleRequestInternal(Dispatcher.java:58)
at
org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:139)
at
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:44)
at
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:684)
at
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:625)
at
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:392)
at
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:347)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at
org.vfny.geoserver.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:122)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at
org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Unknown Source)
-------------------------------------------------------------------------
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