Dear Tomas, note that these are 4 Float32 bands. When you open it on QGIS, it automatically applies some contrast-stretch and band selection, making them looks-like an RGB dataset. On GeoServer, you can use the 3 bands channelselection+contrastEnhancement SLD you have applied. I think there is some issue when applying the bandSelect (as reported on your logs) to go from 4 bands to 3 bands in order to write it as JPEG (which only supports 1 or 3 bands). Could you please check if there is already a JIRA on GeoServer reporting the same issue and, if not, create a bug-report with sample data and SLD to replicate the problem?
Best Regards, Daniele On Wed, Aug 14, 2019 at 10:51 PM Tomas Link <tomasl...@spacesur.com> wrote: > Hi all. > > I have a raster > <https://drive.google.com/file/d/1Pnr6EzXxIs5kl_b6mt5NHovYiufjG3Bx/view?usp=sharing> > that contains 4 bands: 2th, 3th, 4th, and 8th bands from sentinel 2A > dataset. > These are BLUE, GREEN, RED, NIR, respectively. When I upload this raster > to GeoServer, Layer Preview (WMS) section gives me a blank image. I tried > many things for days and read all the information I could find but i'm > really stuck. I'm hoping you can help me with this problem. I will describe > here all the things I've been trying. > > I'm using GeoServer 2.15.1 in Ubungu 18.04.1 LTS. > > This is the complete gdalinfo for the raster: > > Driver: GTiff/GeoTIFF > Files: test.tiff > Size is 1999, 1579 > Coordinate System is: > PROJCS["WGS 84 / UTM zone 19S", > GEOGCS["WGS 84", > DATUM["WGS_1984", > SPHEROID["WGS 84",6378137,298.257223563, > AUTHORITY["EPSG","7030"]], > AUTHORITY["EPSG","6326"]], > PRIMEM["Greenwich",0, > AUTHORITY["EPSG","8901"]], > UNIT["degree",0.0174532925199433, > AUTHORITY["EPSG","9122"]], > AUTHORITY["EPSG","4326"]], > PROJECTION["Transverse_Mercator"], > PARAMETER["latitude_of_origin",0], > PARAMETER["central_meridian",-69], > PARAMETER["scale_factor",0.9996], > PARAMETER["false_easting",500000], > PARAMETER["false_northing",10000000], > UNIT["metre",1, > AUTHORITY["EPSG","9001"]], > AXIS["Easting",EAST], > AXIS["Northing",NORTH], > AUTHORITY["EPSG","32719"]] > Origin = (560050.000000000000000,5700040.000000000000000) > Pixel Size = (10.000000000000000,-10.000000000000000) > Metadata: > AREA_OR_POINT=Area > Image Structure Metadata: > INTERLEAVE=PIXEL > Corner Coordinates: > Upper Left ( 560050.000, 5700040.000) ( 68d18'28.85"W, 38d50'47.07"S) > Lower Left ( 560050.000, 5684250.000) ( 68d18'23.87"W, 38d59'19.28"S) > Upper Right ( 580040.000, 5700040.000) ( 68d 4'39.66"W, 38d50'41.34"S) > Lower Right ( 580040.000, 5684250.000) ( 68d 4'33.02"W, 38d59'13.52"S) > Center ( 570045.000, 5692145.000) ( 68d11'31.34"W, 38d55' 0.51"S) > *Band 1 Block=1999x1 Type=Float32, ColorInterp=Gray* > *Band 2 Block=1999x1 Type=Float32, ColorInterp=Undefined* > *Band 3 Block=1999x1 Type=Float32, ColorInterp=Undefined* > *Band 4 Block=1999x1 Type=Float32, ColorInterp=Undefined* > > *1)* Opened the same raster in QGIS, the raster renders RGB bands just > fine (well, just with RED-BLUE inverted...) > *2) *Downloaded the raster uploaded in GeoServer via QGIS. I noted that > the downloaded file from geoserver now has these band specifications in > gdalinfo: > > *Band 1 Block=512x512 Type=Float32, ColorInterp=Red* > *Band 2 Block=512x512 Type=Float32, ColorInterp=Green* > *Band 3 Block=512x512 Type=Float32, ColorInterp=Blue* > *Band 4 Block=512x512 Type=Float32, ColorInterp=Alpha* > > So, by default GeoServer seems to be interpreting the bands color in that > way. > If I open this raster in QGIS, I see a blank image. I discovered that the > reason for this is that QGIS assigns the ALPHA channel as a transparency > band. Selecting None in transparency band, QGIS renders again just fine. > At this point I started to think that is a problem related to the alpha > band, or with any raster with more than 3 bands. > > *3)* I removed the 4th band from the raster, and uploaded to GeoServer. > Now the image is all black, but adding a proper SLD style with contrast > enhancement (generated from QGIS) GeoServer render the raster just fine. > This is the SLD: > > <?xml version="1.0" encoding="UTF-8"?> > <StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:ogc=" > http://www.opengis.net/ogc" version="1.0.0" xmlns:gml=" > http://www.opengis.net/gml" xmlns:sld="http://www.opengis.net/sld"> > <UserLayer> > <sld:LayerFeatureConstraints> > <sld:FeatureTypeConstraint/> > </sld:LayerFeatureConstraints> > <sld:UserStyle> > <sld:Name>testrgb</sld:Name> > <sld:FeatureTypeStyle> > <sld:Rule> > <sld:RasterSymbolizer> > <sld:ChannelSelection> > <sld:RedChannel> > <sld:SourceChannelName>3</sld:SourceChannelName> > <sld:ContrastEnhancement> > <sld:Normalize> > <sld:VendorOption > name="algorithm">StretchToMinimumMaximum</sld:VendorOption> > <sld:VendorOption > name="minValue">0.0506552</sld:VendorOption> > <sld:VendorOption > name="maxValue">0.25763</sld:VendorOption> > </sld:Normalize> > </sld:ContrastEnhancement> > </sld:RedChannel> > <sld:GreenChannel> > <sld:SourceChannelName>2</sld:SourceChannelName> > <sld:ContrastEnhancement> > <sld:Normalize> > <sld:VendorOption > name="algorithm">StretchToMinimumMaximum</sld:VendorOption> > <sld:VendorOption > name="minValue">0.07764</sld:VendorOption> > <sld:VendorOption > name="maxValue">0.209892</sld:VendorOption> > </sld:Normalize> > </sld:ContrastEnhancement> > </sld:GreenChannel> > <sld:BlueChannel> > <sld:SourceChannelName>1</sld:SourceChannelName> > <sld:ContrastEnhancement> > <sld:Normalize> > <sld:VendorOption > name="algorithm">StretchToMinimumMaximum</sld:VendorOption> > <sld:VendorOption > name="minValue">0.0916334</sld:VendorOption> > <sld:VendorOption > name="maxValue">0.20144</sld:VendorOption> > </sld:Normalize> > </sld:ContrastEnhancement> > </sld:BlueChannel> > </sld:ChannelSelection> > </sld:RasterSymbolizer> > </sld:Rule> > </sld:FeatureTypeStyle> > </sld:UserStyle> > </UserLayer> > </StyledLayerDescriptor> > > *4)* I applied the same SLD style to the raster with 4 bands, and got > this following NullPointerException: > > java.lang.NullPointerException > at > it.geosolutions.jaiext.bandselect.BandSelectOpImage.computeTile(BandSelectOpImage.java:142) > at > it.geosolutions.jaiext.bandselect.BandSelectOpImage.getTile(BandSelectOpImage.java:156) > at javax.media.jai.RenderedOp.getTile(RenderedOp.java:2257) > at > com.sun.imageio.plugins.jpeg.JPEGImageWriter.writeOnThread(JPEGImageWriter.java:401) > at > com.sun.imageio.plugins.jpeg.JPEGImageWriter.write(JPEGImageWriter.java:363) > at org.geotools.image.ImageWorker.writeJPEG(ImageWorker.java:4002) > at > org.geoserver.wms.map.JPEGMapResponse.formatImageOutputStream(JPEGMapResponse.java:69) > at > org.geoserver.wms.map.RenderedImageMapResponse.write(RenderedImageMapResponse.java:112) > at org.geoserver.ows.Dispatcher.response(Dispatcher.java:1029) > at org.geoserver.ows.Dispatcher.handleRequestInternal(Dispatcher.java:268) > at > org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:177) > at > org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:52) > at > org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038) > at > org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) > at > org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:998) > at > org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:890) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) > at > org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:875) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) > at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:865) > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1655) > at > org.geoserver.filters.ThreadLocalsCleanupFilter.doFilter(ThreadLocalsCleanupFilter.java:26) > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642) > at > org.geoserver.filters.SpringDelegatingFilter$Chain.doFilter(SpringDelegatingFilter.java:69) > at > org.geoserver.wms.animate.AnimatorFilter.doFilter(AnimatorFilter.java:73) > at > org.geoserver.filters.SpringDelegatingFilter$Chain.doFilter(SpringDelegatingFilter.java:66) > at > org.geoserver.filters.SpringDelegatingFilter.doFilter(SpringDelegatingFilter.java:41) > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642) > at > org.geoserver.platform.AdvancedDispatchFilter.doFilter(AdvancedDispatchFilter.java:37) > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) > at > org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:70) > at > org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127) > at > org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91) > at > org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:74) > at > org.geoserver.security.filter.GeoServerCompositeFilter.doFilter(GeoServerCompositeFilter.java:91) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) > at > org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:70) > at > org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) > at > org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:74) > at > org.geoserver.security.filter.GeoServerCompositeFilter.doFilter(GeoServerCompositeFilter.java:91) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) > at > org.geoserver.security.filter.GeoServerAnonymousAuthenticationFilter.doFilter(GeoServerAnonymousAuthenticationFilter.java:51) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) > at > org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:70) > at > org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:158) > at > org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) > at > org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:74) > at > org.geoserver.security.filter.GeoServerCompositeFilter.doFilter(GeoServerCompositeFilter.java:91) > at > org.geoserver.security.filter.GeoServerBasicAuthenticationFilter.doFilter(GeoServerBasicAuthenticationFilter.java:81) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) > at > org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:70) > at > org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) > at > org.geoserver.security.filter.GeoServerSecurityContextPersistenceFilter$1.doFilter(GeoServerSecurityContextPersistenceFilter.java:52) > at > org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:74) > at > org.geoserver.security.filter.GeoServerCompositeFilter.doFilter(GeoServerCompositeFilter.java:91) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) > at > org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) > at > org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) > at > org.geoserver.security.GeoServerSecurityFilterChainProxy.doFilter(GeoServerSecurityFilterChainProxy.java:142) > at > org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357) > at > org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270) > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642) > at org.geoserver.filters.LoggingFilter.doFilter(LoggingFilter.java:90) > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642) > at > org.geoserver.filters.XFrameOptionsFilter.doFilter(XFrameOptionsFilter.java:79) > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642) > at org.geoserver.filters.GZIPFilter.doFilter(GZIPFilter.java:42) > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642) > at > org.geoserver.filters.SessionDebugFilter.doFilter(SessionDebugFilter.java:46) > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642) > at org.geoserver.filters.FlushSafeFilter.doFilter(FlushSafeFilter.java:42) > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642) > at > org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) > at > org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1634) > at > org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533) > at > org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146) > at > org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548) > at > org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) > at > org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257) > at > org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595) > at > org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255) > at > org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1340) > at > org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203) > at > org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473) > at > org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564) > at > org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201) > at > org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1242) > at > org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144) > at > org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:220) > at > org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126) > at > org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) > at org.eclipse.jetty.server.Server.handle(Server.java:503) > at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:364) > at > org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260) > at > org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305) > at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103) > at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118) > at > org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333) > at > org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310) > at > org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168) > at > org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126) > at > org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366) > at > org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765) > at > org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683) > at java.lang.Thread.run(Thread.java:748) > > I couldn't figure out if this exception has anything to do with the 4th > band. > > 5) If I change *StretchToMinimumMaximum to **ClipToMinimumMaximum,* the > nullpointerexception goes away, but now I see a blank image again. > > 6) Applying the following SLD style (also generated in QGIS) that renders > only the first band as greyscale works: > > <?xml version="1.0" encoding="UTF-8"?> > <StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:gml=" > http://www.opengis.net/gml" xmlns:sld="http://www.opengis.net/sld" > version="1.0.0" xmlns:ogc="http://www.opengis.net/ogc"> > <UserLayer> > <sld:LayerFeatureConstraints> > <sld:FeatureTypeConstraint/> > </sld:LayerFeatureConstraints> > <sld:UserStyle> > <sld:Name>test</sld:Name> > <sld:FeatureTypeStyle> > <sld:Rule> > <sld:RasterSymbolizer> > <sld:ChannelSelection> > <sld:GrayChannel> > <sld:SourceChannelName>1</sld:SourceChannelName> > <sld:ContrastEnhancement> > <sld:Normalize> > <sld:VendorOption > name="algorithm">ClipToMinimumMaximum</sld:VendorOption> > <sld:VendorOption > name="minValue">0.0803</sld:VendorOption> > <sld:VendorOption > name="maxValue">0.193875</sld:VendorOption> > </sld:Normalize> > </sld:ContrastEnhancement> > </sld:GrayChannel> > </sld:ChannelSelection> > <sld:ColorMap> > <sld:ColorMapEntry opacity="0" color="#000000" > quantity="0.0869045"/> > <sld:ColorMapEntry color="#000000" quantity="0.0869045"/> > <sld:ColorMapEntry color="#ffffff" quantity="0.193875"/> > <sld:ColorMapEntry opacity="0" color="#ffffff" > quantity="0.193875"/> > </sld:ColorMap> > </sld:RasterSymbolizer> > </sld:Rule> > </sld:FeatureTypeStyle> > </sld:UserStyle> > </UserLayer> > </StyledLayerDescriptor> > > > The only thing that makes sense to me is that GeoServer is interpreting > the 4th band as a transparency band (like QGIS). But I really don't know if > this is the case or if can be disabled. > Thanks in advance. > > Tomás > > > > > > > -- > > > Tomás Juan Link > > Software Developer > > +54 (11) 4342-2976/84 > > www.spacesur.com > > _______________________________________________ > Geoserver-users mailing list > > Please make sure you read the following two resources before posting to > this list: > - Earning your support instead of buying it, but Ian Turton: > http://www.ianturton.com/talks/foss4g.html#/ > - The GeoServer user list posting guidelines: > http://geoserver.org/comm/userlist-guidelines.html > > If you want to request a feature or an improvement, also see this: > https://github.com/geoserver/geoserver/wiki/Successfully-requesting-and-integrating-new-features-and-improvements-in-GeoServer > > > Geoserver-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/geoserver-users > -- Regards, Daniele Romagnoli == GeoServer Professional Services from the experts! Visit http://goo.gl/it488V for more information. == Ing. Daniele Romagnoli Senior Software Engineer GeoSolutions S.A.S. Via di Montramito 3/A 55054 Massarosa (LU) Italy phone: +39 0584 962313 fax: +39 0584 1660272 http://www.geo-solutions.it http://twitter.com/geosolutions_it ------------------------------------------------------- Con riferimento alla normativa sul trattamento dei dati personali (Reg. UE 2016/679 - Regolamento generale sulla protezione dei dati “GDPR”), si precisa che ogni circostanza inerente alla presente email (il suo contenuto, gli eventuali allegati, etc.) è un dato la cui conoscenza è riservata al/i solo/i destinatario/i indicati dallo scrivente. Se il messaggio Le è giunto per errore, è tenuta/o a cancellarlo, ogni altra operazione è illecita. Le sarei comunque grato se potesse darmene notizia. This email is intended only for the person or entity to which it is addressed and may contain information that is privileged, confidential or otherwise protected from disclosure. We remind that - as provided by European Regulation 2016/679 “GDPR” - copying, dissemination or use of this e-mail or the information herein by anyone other than the intended recipient is prohibited. If you have received this email by mistake, please notify us immediately by telephone or e-mail.
_______________________________________________ Geoserver-users mailing list Please make sure you read the following two resources before posting to this list: - Earning your support instead of buying it, but Ian Turton: http://www.ianturton.com/talks/foss4g.html#/ - The GeoServer user list posting guidelines: http://geoserver.org/comm/userlist-guidelines.html If you want to request a feature or an improvement, also see this: https://github.com/geoserver/geoserver/wiki/Successfully-requesting-and-integrating-new-features-and-improvements-in-GeoServer Geoserver-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/geoserver-users