[Geoserver-users] Support for alpha band in GeoTIFF?

Howdy:

I've been having some difficulty in getting a 2-band 8-bit grayscale plus 8-bit alpha GeoTIFF to render correctly. Depending on the actual values in the alpha layer, an exception gets thrown and the server returns a blank PNG.

Is anyone successfully using GeoServer with a similar data set?

(BTW: I am unclear exactly when a GeoTIFF's SLD affects its rendering -- I have read the mailing list archive and see that it is still in its infancy. The coverage I am trying to use has its SLD set to the default "raster" SLD, but I am not relying on it to do anything though.)

I am testing with Java 1.5.0.12 on Linux using Tomcat 5.5.23 with GeoServer 1.5.4a and also 1.6.0-RC1. The test file I am using is available at the URL below -- it is about 2MB.
http://sculpturedlife.com/withalpha.tif

Below is the stack trace. I am going to dig deeper into this, but if anyone has any experience this problem pointers are much appreciated.

Cheers,
Ryan

Nov 16, 2007 9:24:46 PM org.geotools.renderer.lite.gridcoverage2d.GridCoverageRenderer paint
WARNING: 6503
java.lang.ArrayIndexOutOfBoundsException: 6503
  at java.awt.image.ComponentColorModel.getRGBComponent(ComponentColorModel.java:886)
  at java.awt.image.ComponentColorModel.getRed(ComponentColorModel.java:927)
  at java.awt.image.ComponentColorModel.getRGB(ComponentColorModel.java:1118)
  at sun.java2d.loops.OpaqueCopyAnyToArgb.Blit(CustomComponent.java:105)
  at sun.java2d.loops.GraphicsPrimitive.convertFrom(GraphicsPrimitive.java:526)
  at sun.java2d.loops.MaskBlit$General.MaskBlit(MaskBlit.java:171)
  at sun.java2d.loops.Blit$GeneralMaskBlit.Blit(Blit.java:186)
  at sun.java2d.pipe.DrawImage.blitSurfaceData(DrawImage.java:821)
  at sun.java2d.pipe.DrawImage.renderImageCopy(DrawImage.java:444)
  at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:70)
  at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:892)
  at sun.java2d.pipe.ValidatePipe.copyImage(ValidatePipe.java:178)
  at sun.java2d.SunGraphics2D.copyImage(SunGraphics2D.java:2780)
  at sun.java2d.SunGraphics2D.drawTranslatedRenderedImage(SunGraphics2D.java:2591)
  at sun.java2d.SunGraphics2D.drawRenderedImage(SunGraphics2D.java:2432)
  at org.geotools.renderer.lite.gridcoverage2d.GridCoverageRenderer.paint(GridCoverageRenderer.java:789)
  at org.geotools.renderer.lite.StreamingRenderer.renderRaster(StreamingRenderer.java:1898)
  at org.geotools.renderer.lite.StreamingRenderer.processSymbolizers(StreamingRenderer.java:1680)
  at org.geotools.renderer.lite.StreamingRenderer.process(StreamingRenderer.java:1624)
  at org.geotools.renderer.lite.StreamingRenderer.processStylers(StreamingRenderer.java:1566)
  at org.geotools.renderer.lite.StreamingRenderer.paint(StreamingRenderer.java:715)
  at org.geotools.renderer.lite.StreamingRenderer.paint(StreamingRenderer.java:436)
  at org.vfny.geoserver.wms.responses.DefaultRasterMapProducer.produceMap(DefaultRasterMapProducer.java:238)
  at org.vfny.geoserver.wms.responses.GetMapResponse.execute(GetMapResponse.java:368)
  at org.vfny.geoserver.servlets.AbstractService.doService(AbstractService.java:516)
  at org.vfny.geoserver.servlets.AbstractService.doGet(AbstractService.java:315)
  at org.geoserver.request.Dispatcher.dispatch(Dispatcher.java:192)
  at org.geoserver.request.Dispatcher.handleRequestInternal(Dispatcher.java:52)
  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:690)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
  at org.vfny.geoserver.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:103)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
  at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
  at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
  at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
  at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
  at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
  at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
  at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
  at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
  at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
  at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
  at java.lang.Thread.run(Thread.java:595)

On Nov 16, 2007, at 1:59 PM, Ryan Hofschneider wrote:

I've been having some difficulty in getting a 2-band 8-bit grayscale
plus 8-bit alpha GeoTIFF to render correctly. Depending on the actual
values in the alpha layer, an exception gets thrown and the server
returns a blank PNG.

Is anyone successfully using GeoServer with a similar data set?

Replying to my own message...

The GeoTIFF that was giving me problems was generated with GDAL with the ALPHA=YES option (as described at http://www.gdal.org/frmt_gtiff.html).

If this option is not indicated, then GeoServer will render images as expected.

For the GeoTIFF that works, gdalinfo will describe the TIFF bands as:
Band 1 Block=1440x5 Type=Byte, ColorInterp=Gray
Band 2 Block=1440x5 Type=Byte, ColorInterp=Undefined

For the GeoTIFF that doesn't work, gdalinfo indicates:
Band 1 Block=1440x5 Type=Byte, ColorInterp=Gray
Band 2 Block=1440x5 Type=Byte, ColorInterp=Alpha

Cheers,
Ryan