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

Reply via email to