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