Hi,

I've looked more into how to handle this irregular capabilities document within 
GeoTools, and found a solution that works without contacting NASA.
It isn't the prettiest thing, but it works. The main point is to make a custom 
WMTSConfiguration that overrides the binding for positiveInteger.

I've made a gist of the solution, if anyone is interested.

https://gist.github.com/roarbra/c676cdc933fe2c4880c9e17995e9516d 
<https://gist.github.com/roarbra/c676cdc933fe2c4880c9e17995e9516d>

Best regards,
Roar Brænden


> 2. des. 2022 kl. 16:09 skrev Matthijs Laan via GeoTools-GT2-Users 
> <geotools-gt2-users@lists.sourceforge.net>:
> 
> Looking further into this specific service, apparently this WMTS capabilities 
> document is generated by a Lua script that just copies the width and height 
> values from a YAML configuration file, without making sure the resulting 
> capabilities valid according to the WMTS schema.
> 
> The Lua code is here: 
> https://github.com/nasa-gibs/onearth/blob/main/src/modules/gc_service/gc_service.lua#L514
>  
> <https://github.com/nasa-gibs/onearth/blob/main/src/modules/gc_service/gc_service.lua#L514>
> 
> An example YAML file with a 85.5 height for a legend is here, among other 
> places: 
> https://github.com/nasa-gibs/onearth/blob/main/docker/sample_configs/layers/epsg4326/best/GEDI_ISS_L3_Elevation_Mean_Lowest_Mode_201904-202004.yaml#L43
>  
> <https://github.com/nasa-gibs/onearth/blob/main/docker/sample_configs/layers/epsg4326/best/GEDI_ISS_L3_Elevation_Mean_Lowest_Mode_201904-202004.yaml#L43>
> 
> Maybe you can send an e-mail to supp...@earthdata.nasa.gov 
> <mailto:supp...@earthdata.nasa.gov> to ask them to change their YAML files to 
> use integer legend widths and heights or create an issue in their GitHub 
> repository.
> 
> Matthijs
> 
> On 02/12/2022 11.15, Matthijs Laan via GeoTools-GT2-Users wrote:
>> XML Schema says Capabilities are invalid.
>> 
>>                     <attribute name="width" type="positiveInteger">
>>                         <annotation>
>>                             <documentation>Width (in pixels) of the legend 
>> image</documentation>
>>                         </annotation>
>>                     </attribute>
>>                     <attribute name="height" type="positiveInteger">
>>                         <annotation>
>>                             <documentation>Height (in pixels) of the legend 
>> image</documentation>
>>                         </annotation>
>>                     </attribute>
>> 
>> Matthijs
>> 
>> On 30/11/2022 15.55, Roar Brænden wrote:
>>> Hi,
>>> 
>>> It seems like this height=85.5 is coming from the capabilities document. 
>>> Here for instance:
>>> 
>>> <Style isDefault="true">
>>> <ows:Title xml:lang="en">default</ows:Title>
>>> <ows:Identifier>default</ows:Identifier>
>>> <LegendURL width="378" 
>>> xlink:href="https://gibs.earthdata.nasa.gov/legends/AMSU_Brightness_Temp_H.svg
>>>  <https://gibs.earthdata.nasa.gov/legends/AMSU_Brightness_Temp_H.svg>" 
>>> xlink:role="http://earthdata.nasa.gov/gibs/legend-type/horizontal 
>>> <http://earthdata.nasa.gov/gibs/legend-type/horizontal>" height="85.5" 
>>> format="image/svg+xml" xlink:title="GIBS Color Map Legend: Horizontal" 
>>> xlink:type="simple"/>
>>> <LegendURL width="135" 
>>> xlink:href="https://gibs.earthdata.nasa.gov/legends/AMSU_Brightness_Temp_V.svg
>>>  <https://gibs.earthdata.nasa.gov/legends/AMSU_Brightness_Temp_V.svg>" 
>>> xlink:role="http://earthdata.nasa.gov/gibs/legend-type/vertical 
>>> <http://earthdata.nasa.gov/gibs/legend-type/vertical>" height="288" 
>>> format="image/svg+xml" xlink:title="GIBS Color Map Legend: Vertical" 
>>> xlink:type="simple"/>
>>> </Style>
>>> 
>>> Haven't looked in the WMTS specification to see if that is against the 
>>> rules, but sure isn't anything the user could fix. Geotools is tolerant 
>>> elsewhere, so it could certainly be a place for a little flexibility. Not 
>>> sure how to handle it though.
>>> 
>>> Best regards,
>>> 
>>> Roar Brænden
>>> 
>>> 
>>>> 30. nov. 2022 kl. 10:11 skrev Ian Turton <ijtur...@gmail.com 
>>>> <mailto:ijtur...@gmail.com>>:
>>>> 
>>>> Height is in pixels and is an integer value so your value of 85.5 is a 
>>>> problem, your code example doesn't show how you are generating the size 
>>>> request but I would expect a height/width of 255 or 512 for a WMTS 
>>>> request. It's possible that the GeoTools WMTS code doesn't understand the 
>>>> TIME dimension or the value RESTful as an encoding, you'll need to turn 
>>>> the logging level up to find out exactly why that URL is being used.
>>>> 
>>>> Ian
>>>> 
>>>> On Wed, 30 Nov 2022 at 08:45, Daniel Kindermann <daniel.k...@gmx.de 
>>>> <mailto:daniel.k...@gmx.de>> wrote:
>>>> Hello GeoTools community,
>>>>  
>>>> I'm new to GeoTools. Currently I'm trying to establish a connection to a 
>>>> WMTS. I followed the instructions in the WMTS — GeoTools 28-SNAPSHOT User 
>>>> Guide 
>>>> <https://docs.geotools.org/stable/userguide/extension/wmts/index.html#wmtstileservice>.
>>>>  Unfortunately the request to the WMTS failes.
>>>>  
>>>> Here are my system information:
>>>>  
>>>> GeoTools version 28-SNAPSHOT (built from 
>>>> r175672287370cf2c54eb30f2bbaa04f743835523)
>>>> Java version: 17.0.4.1
>>>> Operating system: Windows 10 10.0
>>>> GeoTools jars on classpath:
>>>>  
>>>> I use Maven. My pom.xml is pretty much the one from the quickstart 
>>>> tutorial but of course I added the gt-wmts dependency.
>>>>  
>>>> Here is my error message:
>>>>  
>>>> Nov. 30, 2022 9:39:18 AM org.geotools.data.ows.AbstractOpenWebService 
>>>> internalIssueRequest
>>>> SCHWERWIEGEND: Failed to execute request 
>>>> https://gibs.earthdata.nasa.gov/wmts/epsg4326/best/wmts.cgi?REQUEST=GetCapabilities&VERSION=1.0.0&SERVICE=WMTS
>>>>  
>>>> <https://gibs.earthdata.nasa.gov/wmts/epsg4326/best/wmts.cgi?REQUEST=GetCapabilities&VERSION=1.0.0&SERVICE=WMTS>
>>>> Exception in thread "main" java.lang.RuntimeException: Parsing failed for 
>>>> height: java.lang.NumberFormatException: For input string: "85.5"
>>>>     at org.geotools.xsd.impl.ParseExecutor.visit(ParseExecutor.java:153)
>>>>     at 
>>>> org.geotools.xsd.impl.BindingWalker$BindingExecutionChain.execute(BindingWalker.java:218)
>>>>     at org.geotools.xsd.impl.BindingWalker.walk(BindingWalker.java:184)
>>>>     at org.geotools.xsd.impl.BindingWalker.walk(BindingWalker.java:188)
>>>>     at 
>>>> org.geotools.xsd.impl.ElementHandlerImpl.startElement(ElementHandlerImpl.java:180)
>>>>     at 
>>>> org.geotools.xsd.impl.ParserHandler.startElement(ParserHandler.java:378)
>>>>     at 
>>>> java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:518)
>>>>     at 
>>>> java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:183)
>>>>     at 
>>>> java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:351)
>>>>     at 
>>>> java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2726)
>>>>     at 
>>>> java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:605)
>>>>     at 
>>>> java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
>>>>     at 
>>>> java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:542)
>>>>     at 
>>>> java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:889)
>>>>     at 
>>>> java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:825)
>>>>     at 
>>>> java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
>>>>     at 
>>>> java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1224)
>>>>     at 
>>>> java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:637)
>>>>     at 
>>>> java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:326)
>>>>     at org.geotools.xsd.Parser.parse(Parser.java:183)
>>>>     at org.geotools.xsd.Parser.parse(Parser.java:125)
>>>>     at 
>>>> org.geotools.ows.wmts.response.WMTSGetCapabilitiesResponse.<init>(WMTSGetCapabilitiesResponse.java:84)
>>>>     at 
>>>> org.geotools.ows.wmts.WMTSSpecification$GetCapsRequest.createResponse(WMTSSpecification.java:415)
>>>>     at 
>>>> org.geotools.ows.wmts.WMTSSpecification$GetCapsRequest.createResponse(WMTSSpecification.java:387)
>>>>     at 
>>>> org.geotools.data.ows.AbstractOpenWebService.internalIssueRequest(AbstractOpenWebService.java:461)
>>>>     at 
>>>> org.geotools.data.ows.AbstractOpenWebService.issueRequest(AbstractOpenWebService.java:489)
>>>>     at 
>>>> org.geotools.data.ows.AbstractOpenWebService.negotiateVersion(AbstractOpenWebService.java:287)
>>>>     at 
>>>> org.geotools.data.ows.AbstractOpenWebService.<init>(AbstractOpenWebService.java:124)
>>>>     at 
>>>> org.geotools.data.ows.AbstractOpenWebService.<init>(AbstractOpenWebService.java:97)
>>>>     at 
>>>> org.geotools.data.ows.AbstractOpenWebService.<init>(AbstractOpenWebService.java:88)
>>>>     at 
>>>> org.geotools.data.ows.AbstractOpenWebService.<init>(AbstractOpenWebService.java:77)
>>>>     at 
>>>> org.geotools.ows.wmts.WebMapTileServer.<init>(WebMapTileServer.java:151)
>>>>     at org.geotools.tutorial.App.main(App.java:28)
>>>> Caused by: java.lang.NumberFormatException: For input string: "85.5"
>>>>     at 
>>>> java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
>>>>     at java.base/java.lang.Integer.parseInt(Integer.java:668)
>>>>     at java.base/java.math.BigInteger.<init>(BigInteger.java:536)
>>>>     at java.base/java.math.BigInteger.<init>(BigInteger.java:674)
>>>>     at 
>>>> org.geotools.xs.bindings.XSIntegerBinding.parse(XSIntegerBinding.java:96)
>>>>     at org.geotools.xsd.impl.ParseExecutor.visit(ParseExecutor.java:142)
>>>>     ... 32 more
>>>>  
>>>> Here is my code sample: 
>>>>  
>>>> public class App {
>>>>     public static void main(String[] args) throws ServiceException, 
>>>> IOException {
>>>>         
>>>>         System.out.println(GeoTools.getAboutInfo());
>>>>         
>>>>         URL url = null;
>>>>         try {
>>>>           url = new 
>>>> URL("https://gibs.earthdata.nasa.gov/wmts/epsg4326/best/wmts.cgi 
>>>> <https://gibs.earthdata.nasa.gov/wmts/epsg4326/best/wmts.cgi>");
>>>>         } catch (MalformedURLException e) {
>>>>           // will not happen
>>>>         }
>>>>         WebMapTileServer wmts = null;
>>>>         try {
>>>>           wmts = new WebMapTileServer(url);
>>>>         } catch (IOException e) {
>>>>           // There was an error communicating with the server
>>>>           // For example, the server is down
>>>>         } catch (ServiceException e) {
>>>>           // The server returned a ServiceException (unusual in this case)
>>>>         } catch (SAXException e) {
>>>>           // Unable to parse the response from the server
>>>>           // For example, the capabilities it returned was not valid
>>>>         }
>>>>         
>>>>         System.out.println(wmts.getCapabilities().getService().getName());
>>>>     }
>>>> }
>>>> 
>>>> I tried different servers. I get a response to a manual request from all 
>>>> of them.
>>>>  
>>>> It would be very much appreciated if anyone has a solution or a hint for 
>>>> me.
>>>>  
>>>> Thanks in advance,
>>>>  
>>>> Daniel
>>>> _______________________________________________
>>>> GeoTools-GT2-Users mailing list
>>>> GeoTools-GT2-Users@lists.sourceforge.net 
>>>> <mailto:GeoTools-GT2-Users@lists.sourceforge.net>
>>>> https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users 
>>>> <https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users>
>>>> 
>>>> 
>>>> -- 
>>>> Ian Turton
>>>> _______________________________________________
>>>> GeoTools-GT2-Users mailing list
>>>> GeoTools-GT2-Users@lists.sourceforge.net 
>>>> <mailto:GeoTools-GT2-Users@lists.sourceforge.net>
>>>> https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users 
>>>> <https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users>
>>> 
>>> 
>>> 
>>> 
>>> _______________________________________________
>>> GeoTools-GT2-Users mailing list
>>> GeoTools-GT2-Users@lists.sourceforge.net 
>>> <mailto:GeoTools-GT2-Users@lists.sourceforge.net>
>>> https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users 
>>> <https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users>
>> 
>> 
>> 
>> 
>> _______________________________________________
>> GeoTools-GT2-Users mailing list
>> GeoTools-GT2-Users@lists.sourceforge.net 
>> <mailto:GeoTools-GT2-Users@lists.sourceforge.net>
>> https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users 
>> <https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users>
> 
> _______________________________________________
> GeoTools-GT2-Users mailing list
> GeoTools-GT2-Users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users

_______________________________________________
GeoTools-GT2-Users mailing list
GeoTools-GT2-Users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users

Reply via email to