0

I'm cascading a WMTS service through GeoServer so I can consume it as a WMS service. This part now works with the below urls thanks to a very recent bug fix. I'm now attempting to reproject the coordinate system in order to allow WMS service calls using the localized coordinate system. Unfortunately all WMS calls using the reprojected SRS result in transparent images being served up rather than the expected imagery.

Any ideas of any steps I might be missing, problems with the WMS urls I'm constructing, or whether this might be due to a bug in GeoServer?

I'm consuming the following NZ Topo50 Maps service using the following WMTS capabilities endpoint:

Then I'm reprojecting the layer using the following settings:

enter image description here

An example WMS request I'm attempting to make using a bbox of 1221300,4965200,1293300,5037200 in the native EPSG:2193 coordinates:

  • http://localhost:8080/geoserver/wms?service=WMS&version=1.1.1&request=GetMap&layers=gavin%3Anztopo50&bbox=1221300%2C4965200%2C1293300%2C5037200&srs=EPSG%3A2193&width=500&height=500&format=image%2Fpng

This is the area of imagery I'm expecting to see instead of the transparent image: enter image description here

Workaround attempt...

Based on the feedback from Ian Turton I decided to try a work-around where I took the original WMTS capabilities XML served up by LINZ, stripped out the EPSG:3857 capabilities, then hosted the modified XML myself to register with GeoServer.

All looked promising, with GeoServer defaulting to EPSG:2193. However all requests made for imagery resulted in the following error being returned:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE ServiceExceptionReport SYSTEM "http://localhost:8080/geoserver/schemas/wms/1.1.1/WMS_exception_1_1_1.dtd">
<ServiceExceptionReport version="1.1.1" >
    <ServiceException>
        Error rendering coverage on the fast path
        java.lang.IllegalArgumentException: Width (0) and height (0) cannot be &lt;= 0
        Width (0) and height (0) cannot be &lt;= 0
    </ServiceException>
</ServiceExceptionReport>

The modified capabilities XML:

<?xml version="1.0" encoding="utf-8"?>
<Capabilities xmlns="http://www.opengis.net/wmts/1.0"
    xmlns:ows="http://www.opengis.net/ows/1.1"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:gml="http://www.opengis.net/gml"
    xsi:schemaLocation="http://www.opengis.net/wmts/1.0 http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd"
    version="1.0.0">

  <ows:ServiceIdentification>
  <ows:Title>LINZ Data Service</ows:Title>
  
  
  <ows:ServiceType>OGC WMTS</ows:ServiceType>
  <ows:ServiceTypeVersion>1.0.0</ows:ServiceTypeVersion>
  
  
</ows:ServiceIdentification>

<ows:ServiceProvider>
  <ows:ProviderName>Land Information New Zealand</ows:ProviderName>
  <ows:ProviderSite xlink:href="https://data.linz.govt.nz" />
  <ows:ServiceContact>
    
    
  </ows:ServiceContact>
</ows:ServiceProvider>


  <ows:OperationsMetadata>
    <ows:Operation name="GetCapabilities">
      <ows:DCP>
        <ows:HTTP>
          <ows:Get xlink:href="https://data.linz.govt.nz/services%3Bkey%3Daf6ec2bb1582427f84fbcd3a024b882f/wmts/1.0.0/layer/50767/WMTSCapabilities.xml?">
            <ows:Constraint name="GetEncoding">
              <ows:AllowedValues>
                <ows:Value>KVP</ows:Value>
              </ows:AllowedValues>
            </ows:Constraint>
          </ows:Get>
        </ows:HTTP>
      </ows:DCP>
    </ows:Operation>
    <ows:Operation name="GetFeatureInfo">
      <ows:DCP>
        <ows:HTTP>
          <ows:Get xlink:href="https://data.linz.govt.nz/services;key=af6ec2bb1582427f84fbcd3a024b882f/wmts/?">
            <ows:Constraint name="GetEncoding">
              <ows:AllowedValues>
                <ows:Value>KVP</ows:Value>
              </ows:AllowedValues>
            </ows:Constraint>
          </ows:Get>
        </ows:HTTP>
      </ows:DCP>
    </ows:Operation>
  </ows:OperationsMetadata>

  <Contents>




<Layer>
  <ows:Title>NZ Topo50 Maps</ows:Title>
  <ows:Abstract>The Topo50 map series provides topographic mapping for the New Zealand mainland, the Chatham Islands, and offshore islands at 1:50,000 scale.


Along with the paper-based Topo50 map series, digital images of the maps are also publicly available.

Georeferenced raster digital images are provided at a resolution of 300 DPI. Georeferencing allows adjacent maps to be accurately and automatically aligned within GIS systems. 

For more information, and a description of the georeferencing keys:
http://www.linz.govt.nz/topography/topo-maps/topo50/digital-images

Please be aware of the following:

- Representation of a road or track does not necessarily indicate public right of access.  For access rights, maps and other information, contact the New Zealand Walking Access Commission - www.walkingaccess.govt.nz 

- The Department of Conservation and other agencies should be contacted for the latest information on tracks and back country huts. Closed tracks are defined as being no longer maintained or passable and should not be used.  

- Not all aerial wires, cableways and obstructions that could be hazardous to aircraft are held in the data. 

- Contours and spot elevations in forest and snow areas may be less accurate.

- Not all pipelines including both underground and above ground are held in the data or shown on the printed maps. For the latest information please contact the utility and infrastructure agencies

- Permits may be required to visit some sensitive and special islands and areas.  Contact the Department of Conservation to see if you need to apply for a permit.</ows:Abstract>

  <ows:Identifier>layer-50767</ows:Identifier>
  
  <ows:BoundingBox crs="urn:ogc:def:crs:EPSG::2193"><ows:LowerCorner>4722000.451500 1083997.883199</ows:LowerCorner><ows:UpperCorner>6234002.116809 2092005.116774</ows:UpperCorner></ows:BoundingBox>
  

  <ows:WGS84BoundingBox crs="urn:ogc:def:crs:OGC:2:84"><ows:LowerCorner>166.315719 -47.534529</ows:LowerCorner><ows:UpperCorner>178.610868 -34.030252</ows:UpperCorner></ows:WGS84BoundingBox>

  
  <Style isDefault="true">
    <ows:Title>Automatic Style</ows:Title>
    
    <ows:Identifier>style=auto</ows:Identifier>
    
  </Style>
  
  

  <Format>image/png</Format>
  

  
  <TileMatrixSetLink>
    <TileMatrixSet>EPSG:2193</TileMatrixSet>
  </TileMatrixSetLink>
  

  <ResourceURL format="image/png" resourceType="tile"
      template="https://tiles-a.data-cdn.linz.govt.nz/services;key=af6ec2bb1582427f84fbcd3a024b882f/tiles/v4/layer=50767,{style}/{TileMatrixSet}/{TileMatrix}/{TileCol}/{TileRow}.png" />
  
</Layer>


    
    
<TileMatrixSet>
  <ows:Title>NZTM2000</ows:Title>
  <ows:Abstract></ows:Abstract>
  <ows:Identifier>EPSG:2193</ows:Identifier>
  <ows:BoundingBox crs="urn:ogc:def:crs:EPSG::2193"><ows:LowerCorner>3087000.000000 274000.000000</ows:LowerCorner><ows:UpperCorner>7173000.000000 3327000.000000</ows:UpperCorner></ows:BoundingBox>
  <ows:SupportedCRS>urn:ogc:def:crs:EPSG::2193</ows:SupportedCRS>
  

  
  
  <TileMatrix>
    <ows:Identifier>0</ows:Identifier>
    <ScaleDenominator>32000000</ScaleDenominator>
    <TopLeftCorner>10000000.0 -1000000.0</TopLeftCorner>
    <TileWidth>256</TileWidth>
    <TileHeight>256</TileHeight>
    <MatrixWidth>2</MatrixWidth>
    <MatrixHeight>4</MatrixHeight>
  </TileMatrix>
  
  
  <TileMatrix>
    <ows:Identifier>1</ows:Identifier>
    <ScaleDenominator>16000000</ScaleDenominator>
    <TopLeftCorner>10000000.0 -1000000.0</TopLeftCorner>
    <TileWidth>256</TileWidth>
    <TileHeight>256</TileHeight>
    <MatrixWidth>4</MatrixWidth>
    <MatrixHeight>7</MatrixHeight>
  </TileMatrix>
  
  
  <TileMatrix>
    <ows:Identifier>2</ows:Identifier>
    <ScaleDenominator>8000000</ScaleDenominator>
    <TopLeftCorner>10000000.0 -1000000.0</TopLeftCorner>
    <TileWidth>256</TileWidth>
    <TileHeight>256</TileHeight>
    <MatrixWidth>8</MatrixWidth>
    <MatrixHeight>13</MatrixHeight>
  </TileMatrix>
  
  
  <TileMatrix>
    <ows:Identifier>3</ows:Identifier>
    <ScaleDenominator>4000000</ScaleDenominator>
    <TopLeftCorner>10000000.0 -1000000.0</TopLeftCorner>
    <TileWidth>256</TileWidth>
    <TileHeight>256</TileHeight>
    <MatrixWidth>16</MatrixWidth>
    <MatrixHeight>25</MatrixHeight>
  </TileMatrix>
  
  
  <TileMatrix>
    <ows:Identifier>4</ows:Identifier>
    <ScaleDenominator>2000000</ScaleDenominator>
    <TopLeftCorner>10000000.0 -1000000.0</TopLeftCorner>
    <TileWidth>256</TileWidth>
    <TileHeight>256</TileHeight>
    <MatrixWidth>31</MatrixWidth>
    <MatrixHeight>49</MatrixHeight>
  </TileMatrix>
  
  
  <TileMatrix>
    <ows:Identifier>5</ows:Identifier>
    <ScaleDenominator>1000000</ScaleDenominator>
    <TopLeftCorner>10000000.0 -1000000.0</TopLeftCorner>
    <TileWidth>256</TileWidth>
    <TileHeight>256</TileHeight>
    <MatrixWidth>61</MatrixWidth>
    <MatrixHeight>97</MatrixHeight>
  </TileMatrix>
  
  
  <TileMatrix>
    <ows:Identifier>6</ows:Identifier>
    <ScaleDenominator>500000</ScaleDenominator>
    <TopLeftCorner>10000000.0 -1000000.0</TopLeftCorner>
    <TileWidth>256</TileWidth>
    <TileHeight>256</TileHeight>
    <MatrixWidth>121</MatrixWidth>
    <MatrixHeight>193</MatrixHeight>
  </TileMatrix>
  
  
  <TileMatrix>
    <ows:Identifier>7</ows:Identifier>
    <ScaleDenominator>250000</ScaleDenominator>
    <TopLeftCorner>10000000.0 -1000000.0</TopLeftCorner>
    <TileWidth>256</TileWidth>
    <TileHeight>256</TileHeight>
    <MatrixWidth>242</MatrixWidth>
    <MatrixHeight>386</MatrixHeight>
  </TileMatrix>
  
  
  <TileMatrix>
    <ows:Identifier>8</ows:Identifier>
    <ScaleDenominator>100000</ScaleDenominator>
    <TopLeftCorner>10000000.0 -1000000.0</TopLeftCorner>
    <TileWidth>256</TileWidth>
    <TileHeight>256</TileHeight>
    <MatrixWidth>604</MatrixWidth>
    <MatrixHeight>965</MatrixHeight>
  </TileMatrix>
  
  
  <TileMatrix>
    <ows:Identifier>9</ows:Identifier>
    <ScaleDenominator>50000</ScaleDenominator>
    <TopLeftCorner>10000000.0 -1000000.0</TopLeftCorner>
    <TileWidth>256</TileWidth>
    <TileHeight>256</TileHeight>
    <MatrixWidth>1208</MatrixWidth>
    <MatrixHeight>1929</MatrixHeight>
  </TileMatrix>
  
  
  <TileMatrix>
    <ows:Identifier>10</ows:Identifier>
    <ScaleDenominator>25000</ScaleDenominator>
    <TopLeftCorner>10000000.0 -1000000.0</TopLeftCorner>
    <TileWidth>256</TileWidth>
    <TileHeight>256</TileHeight>
    <MatrixWidth>2415</MatrixWidth>
    <MatrixHeight>3858</MatrixHeight>
  </TileMatrix>
  
  
  <TileMatrix>
    <ows:Identifier>11</ows:Identifier>
    <ScaleDenominator>10000</ScaleDenominator>
    <TopLeftCorner>10000000.0 -1000000.0</TopLeftCorner>
    <TileWidth>256</TileWidth>
    <TileHeight>256</TileHeight>
    <MatrixWidth>6037</MatrixWidth>
    <MatrixHeight>9645</MatrixHeight>
  </TileMatrix>
  
  
  <TileMatrix>
    <ows:Identifier>12</ows:Identifier>
    <ScaleDenominator>5000</ScaleDenominator>
    <TopLeftCorner>10000000.0 -1000000.0</TopLeftCorner>
    <TileWidth>256</TileWidth>
    <TileHeight>256</TileHeight>
    <MatrixWidth>12074</MatrixWidth>
    <MatrixHeight>19289</MatrixHeight>
  </TileMatrix>
  
  
  <TileMatrix>
    <ows:Identifier>13</ows:Identifier>
    <ScaleDenominator>2500</ScaleDenominator>
    <TopLeftCorner>10000000.0 -1000000.0</TopLeftCorner>
    <TileWidth>256</TileWidth>
    <TileHeight>256</TileHeight>
    <MatrixWidth>24147</MatrixWidth>
    <MatrixHeight>38578</MatrixHeight>
  </TileMatrix>
  
  
  <TileMatrix>
    <ows:Identifier>14</ows:Identifier>
    <ScaleDenominator>1000</ScaleDenominator>
    <TopLeftCorner>10000000.0 -1000000.0</TopLeftCorner>
    <TileWidth>256</TileWidth>
    <TileHeight>256</TileHeight>
    <MatrixWidth>60366</MatrixWidth>
    <MatrixHeight>96443</MatrixHeight>
  </TileMatrix>
  
  
  <TileMatrix>
    <ows:Identifier>15</ows:Identifier>
    <ScaleDenominator>500</ScaleDenominator>
    <TopLeftCorner>10000000.0 -1000000.0</TopLeftCorner>
    <TileWidth>256</TileWidth>
    <TileHeight>256</TileHeight>
    <MatrixWidth>120732</MatrixWidth>
    <MatrixHeight>192886</MatrixHeight>
  </TileMatrix>
  
  
  <TileMatrix>
    <ows:Identifier>16</ows:Identifier>
    <ScaleDenominator>250</ScaleDenominator>
    <TopLeftCorner>10000000.0 -1000000.0</TopLeftCorner>
    <TileWidth>256</TileWidth>
    <TileHeight>256</TileHeight>
    <MatrixWidth>241463</MatrixWidth>
    <MatrixHeight>385771</MatrixHeight>
  </TileMatrix>
  
</TileMatrixSet>

    
  </Contents>
  <ServiceMetadataURL xlink:href="" />
</Capabilities>

The full error stack from GeoServer log:

2020-11-27 09:35:07,587 ERROR [geoserver.ows] - 
org.geoserver.platform.ServiceException: Error rendering coverage on the fast path
    at org.geoserver.wms.map.RenderedImageMapOutputFormat.produceMap(RenderedImageMapOutputFormat.java:348)
    at org.geoserver.wms.map.RenderedImageMapOutputFormat.produceMap(RenderedImageMapOutputFormat.java:261)
    at org.geoserver.wms.map.RenderedImageMapOutputFormat.produceMap(RenderedImageMapOutputFormat.java:127)
    at org.geoserver.wms.GetMap.executeInternal(GetMap.java:749)
    at org.geoserver.wms.GetMap.run(GetMap.java:300)
    at org.geoserver.wms.GetMap.run(GetMap.java:123)
    at org.geoserver.wms.DefaultWebMapService.getMap(DefaultWebMapService.java:246)
    at jdk.internal.reflect.GeneratedMethodAccessor408.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.geoserver.kml.WebMapServiceKmlInterceptor.invoke(WebMapServiceKmlInterceptor.java:38)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.geoserver.gwc.wms.CacheSeedingWebMapService.invoke(CacheSeedingWebMapService.java:55)
    at org.geoserver.gwc.wms.CacheSeedingWebMapService.invoke(CacheSeedingWebMapService.java:31)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.geoserver.gwc.wms.CachingWebMapService.invoke(CachingWebMapService.java:61)
    at org.geoserver.gwc.wms.CachingWebMapService.invoke(CachingWebMapService.java:41)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.geoserver.ows.util.RequestObjectLogger.invoke(RequestObjectLogger.java:50)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
    at com.sun.proxy.$Proxy115.getMap(Unknown Source)
    at jdk.internal.reflect.GeneratedMethodAccessor363.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.geoserver.ows.Dispatcher.execute(Dispatcher.java:877)
    at org.geoserver.ows.Dispatcher.handleRequestInternal(Dispatcher.java:265)
    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.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:119)
    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: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)
Caused by: org.geoserver.platform.ServiceException: java.lang.IllegalArgumentException: Width (0) and height (0) cannot be <= 0
    at org.geoserver.wms.map.RenderedImageMapOutputFormat.directRasterRender(RenderedImageMapOutputFormat.java:1096)
    at org.geoserver.wms.map.RenderedImageMapOutputFormat.produceMap(RenderedImageMapOutputFormat.java:345)
    ... 126 more
Caused by: java.lang.IllegalArgumentException: Width (0) and height (0) cannot be <= 0
    at java.desktop/java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1016)
    at java.desktop/java.awt.image.BufferedImage.<init>(BufferedImage.java:333)
    at org.geotools.ows.wmts.map.WMTSCoverageReader.getMap(WMTSCoverageReader.java:317)
    at org.geotools.ows.wmts.map.WMTSCoverageReader.read(WMTSCoverageReader.java:272)
    at org.geotools.renderer.lite.gridcoverage2d.GridCoverageReaderHelper.readSingleCoverage(GridCoverageReaderHelper.java:642)
    at org.geotools.renderer.lite.gridcoverage2d.GridCoverageReaderHelper.readCoverage(GridCoverageReaderHelper.java:207)
    at org.geotools.renderer.lite.gridcoverage2d.GridCoverageRenderer.renderImage(GridCoverageRenderer.java:676)
    at org.geotools.renderer.lite.gridcoverage2d.GridCoverageRenderer.renderImage(GridCoverageRenderer.java:639)
    at org.geoserver.wms.map.RenderedImageMapOutputFormat.directRasterRender(RenderedImageMapOutputFormat.java:944)
    ... 127 more
0

I don't think that will work (as you have seen) - The project handling code in the WMTS (and WMS) cascading code is fairly rudimentary as it just picks the first one it recognises as valid, when it should really populate the Native Projections pull down with all the possible choices provided by the remote host.

I think the only current way to do what you want at present is to leave the native and declared SRS as they are and just request your WMS map in the projection you want (EPSG:2193) GeoServer will then either reproject to that or if it is smart request the correct tiles directly without reprojecting (I'd have to check the code but I don't recall it being that smart).

One thing to try is setting Force Declared rather than Reproject to Declared as that might force it to request the correct tiles.

It would be worth raising a bug report that declaring a supported CRS doesn't work, and may be an enhancement request to look at the whole WMS and WMTS projections issue (but with out sponsorship that is unlikely to get fixed soon).

  • Thanks for your insights, it's very much appreciated as always. I've now raised a bug request as per your instructions - osgeo-org.atlassian.net/browse/GEOS-9811 – Gavin Nov 26 '20 at 19:59
  • Based on your feedback I decided to host my own WTMS capabilities XML file with all the non-EPSG:2193 stripped out. Looked promising initially, but errored on every image request unfortunately. I've updated my original question with the work-around details & error logs in case you're curious or have any insights. – Gavin Nov 26 '20 at 21:52

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.