Hello all,

we have a similar use case.
We process data with several dimensions and it takes a while for all geotiffs to be sent to Geoserver for a new batch. Once the first file from a new batch is processed the time is added to the GetCapabilities response although not all dimensions are yet available for it. I understand this is a limitation of how WMS works, but it would be very helpful if Geoserver added a warning to a GetMap response if the requested dimension is not available.

Geoserver already provides something similar if the Nearest Match setting is checked. If no suitable files are found within the acceptable interval a HTTP header is added to the response:
Warning: 99 No nearest value found on ws:layer_name: time

Maybe something similar could be implemented for situations when Nearest Match is not used (and to support custom dimensions too)? Geoserver would still return a blank image, but with the additional header the frontend could tell the difference between "we don't have the data yet" and "the data is a blank image".

I am not sure if this would solve the issue for Niklas and maybe there are better ways to handle such data. I would be happy to hear about experiences with similar data.

best regards,
Gyorgy

On 18. 8. 2021 6:36, Niklas Elelid wrote:
Dear Simone,

Thank you for your reply to my questions.

Let me try to explain in more detail and the use case, I'm starting with my second question because that is the most important one:

2. I am using GeoServer to present weather data in a mobile application for pilots. Since the pilots will be using the app in the air without internet connection it is important to make the map data available offline, by caching. In the app it is possible to request layers in the future as some are forecast maps, in 3 hour intervals. However, if a layer is not available yet for the time requested, I do not want a blank image to be returned because then that blank tile will be cached and would not refresh when the layer for the that same time becomes available on the server.  I also don't want the closest available time to be returned for the same reason. Therefore I would like to know if the layer is available for the requested time or not.So in the below example, if I request any time not listed in the time extent, I would want an exception returned. Is that possible?


Of course I could do that with a GetCapabilities request ahead of the GetMap request, but already now I sometimes get an exception (granule cannot be found) and sometimes not when I request an image for a time that is not available. That's what I am trying to figure out, why it's only sometimes an error and if it's possible to always get an error returned when the time is not available. The mosaic data is saved in Postgres and I am using version 2.18.2 (of course not 1.18.2 as I wrote initially)

1. Now for the first problem, the missing layer in GetCapabilities. Thank you for pointing me in the right direction. I am indeed seeing an error in the log when doing GetCapabilities. See below screenshot and log. (The default value always displays "Choose one" regardless of what I have saved previously).

Thanks and best regards

Niklas


2021-08-18 06:13:30,075 WARN [wms.capabilities] - Error writing metadata; skipping layer: smhi
java.lang.StringIndexOutOfBoundsException: start 0, end -1, length 0
    at java.base/java.lang.AbstractStringBuilder.checkRangeSIOOBE(AbstractStringBuilder.java:1724)     at java.base/java.lang.AbstractStringBuilder.substring(AbstractStringBuilder.java:1017)
    at java.base/java.lang.StringBuilder.substring(StringBuilder.java:85)
    at org.geoserver.wms.capabilities.DimensionHelper.getTemporalDomainRepresentation(DimensionHelper.java:558)     at org.geoserver.wms.capabilities.DimensionHelper.handleTimeDimensionRaster(DimensionHelper.java:393)     at org.geoserver.wms.capabilities.DimensionHelper.handleRasterLayerDimensions(DimensionHelper.java:307)     at org.geoserver.wms.capabilities.GetCapabilitiesTransformer$CapabilitiesTranslator.handleLayer(GetCapabilitiesTransformer.java:1043)     at org.geoserver.wms.capabilities.GetCapabilitiesTransformer$CapabilitiesTranslator.handleLayerTree(GetCapabilitiesTransformer.java:947)     at org.geoserver.wms.capabilities.GetCapabilitiesTransformer$CapabilitiesTranslator.handleLayers(GetCapabilitiesTransformer.java:722)     at org.geoserver.wms.capabilities.GetCapabilitiesTransformer$CapabilitiesTranslator.handleCapability(GetCapabilitiesTransformer.java:480)     at org.geoserver.wms.capabilities.GetCapabilitiesTransformer$CapabilitiesTranslator.encode(GetCapabilitiesTransformer.java:334)     at org.geotools.xml.transform.TransformerBase$XMLReaderSupport.parse(TransformerBase.java:990)     at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:485)     at org.geotools.xml.transform.TransformerBase$Task.run(TransformerBase.java:283)     at org.geotools.xml.transform.TransformerBase.transform(TransformerBase.java:118)     at org.geotools.xml.transform.TransformerBase.transform(TransformerBase.java:100)     at org.geoserver.wms.capabilities.GetCapabilitiesResponse.write(GetCapabilitiesResponse.java:104)     at org.geoserver.config.CapabilitiesCacheHeadersCallback$RevalidateTagResponse.write(CapabilitiesCacheHeadersCallback.java:133)
    at org.geoserver.ows.Dispatcher.response(Dispatcher.java:1030)
    at org.geoserver.ows.Dispatcher.handleRequestInternal(Dispatcher.java:269)     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:1040)     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)     at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:873)     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1623)     at org.geoserver.filters.ThreadLocalsCleanupFilter.doFilter(ThreadLocalsCleanupFilter.java:26)     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610)     at org.geoserver.filters.SpringDelegatingFilter$Chain.doFilter(SpringDelegatingFilter.java:69)     at org.geoserver.wms.animate.AnimatorFilter.doFilter(AnimatorFilter.java:70)     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:1610)     at org.geoserver.platform.AdvancedDispatchFilter.doFilter(AdvancedDispatchFilter.java:37)     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610)     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.GeoServerAuthenticationKeyFilter.doFilter(GeoServerAuthenticationKeyFilter.java:100)     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:358)     at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271)     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610)     at org.geoserver.filters.LoggingFilter.doFilter(LoggingFilter.java:101)     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610)     at org.geoserver.filters.XFrameOptionsFilter.doFilter(XFrameOptionsFilter.java:77)     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610)
    at org.geoserver.filters.GZIPFilter.doFilter(GZIPFilter.java:47)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610)     at org.geoserver.filters.SessionDebugFilter.doFilter(SessionDebugFilter.java:46)     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610)     at org.geoserver.filters.FlushSafeFilter.doFilter(FlushSafeFilter.java:42)     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610)     at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1602)     at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:540)     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:1700)     at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)     at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1345)     at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)     at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:480)     at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1667)     at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)     at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1247)     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:152)     at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at org.eclipse.jetty.server.Server.handle(Server.java:505)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:370)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:267)     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:117)     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:698)     at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:804)
    at java.base/java.lang.Thread.run(Thread.java:834)

On Tue, Aug 10, 2021 at 6:39 AM Niklas Elelid <nik...@swepilot.se <mailto:nik...@swepilot.se>> wrote:

    Hi!

    Sorry for another question but I'm not having any luck with
    finding the
    answer to this.

    I have 2 issues that might or might not be related, no idea really.

    1. A newly created ImageMosaic layer with TIME dimension (List)
    is not
    returned in the XML when requesting GetCapabilities. Doing GetMap
    requests with the times for which images are available works
    fine, no
    problem, it's just not shown in the capabilities XML. I have
    three other
    layers from other stores that ARE shown in the XML.


We need more info to be able to help.
What do you mean by "Doing GetMap
requests with the times for which images are available works fine, no
problem"?
Do you see any errors in the log when you issue a GetCap? You can make a single layer GetCap by adding /workspace/layer before ows to isolate.
Can you share a screenshot of the Dimensions tab content?


    2. All my layers have TIME dimension. I might have misunderstood
    the WMS
    specification but I am under the impression that if I make a GetMap
    request for a specific time that does not exist in the published
    layer,
    the server should return an exception. (E.g. images exist for the
    year
    2021 and if I make a request for a time in 2020 it should return an
    exception). My problem is that yes it does return an exception,
    sometimes.... Sometimes it returns just an empty png and it seems
    completely random. I do not have "Nearest match" enabled. I need
    to have
    an exception returned if the user requested time does not have a
corresponding image that exactly matches the time.

    Any recommendations/workarounds how to solve especially the
    second issue?

    I'm running version 1.18.2 and the ImageMosaic information is
    stored in
    Postgres.


I do not remember what the WMS spec says but GeoServer by default returns a blank Image if your request falls in the right bbox but does not meet any WMS dimension.
If you activate the Nearest Match it broadens the search period time.

I kind of remember that we added the possibility to return an exception when no TIME match is found but I can't find the issue now. Maybe @Andrea Aime <mailto:andrea.a...@geosolutionsgroup.com> remember about this?


    Thanks in advance for any assistance provided.

    /Niklas



    _______________________________________________
    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#/
    <http://www.ianturton.com/talks/foss4g.html#/>
    - The GeoServer user list posting guidelines:
    http://geoserver.org/comm/userlist-guidelines.html
    <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
    
<https://github.com/geoserver/geoserver/wiki/Successfully-requesting-and-integrating-new-features-and-improvements-in-GeoServer>


    Geoserver-users@lists.sourceforge.net
    <mailto:Geoserver-users@lists.sourceforge.net>
    https://lists.sourceforge.net/lists/listinfo/geoserver-users
    <https://lists.sourceforge.net/lists/listinfo/geoserver-users>




_______________________________________________
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

_______________________________________________
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

Reply via email to