ThinkGeo.com    |     Documentation    |     Premium Support

WMTS overlays in 7.0 (and 8.0) - 6 questions

Hello,



I’ve finally gotten around to implementing a map with a WmtsOverlay. I’m doing this in 7.0, as I yet have to install 8.0.



As I see it, there are several assumptions in the implementation, parameters I cannot set in the code. I need to verify which limitations are present in the current implementation of the WmtsOverlay class.



1) I cannot set the bounding box of the entire matrixtileset. I’ve tried to set it via Map.CurrentExtent, but the upper-left corner is always located on (-20,000,000,-20,000,000). Is this correct ? 



2) How to I set the extent used by the WmtsOverlay class to a custom value ?



3) I cannot set the level numbers range (min or max), which I do assume is numbers. Am I correct to assume that the WmtsOverlay class uses 0 as the top level, and has no lowest level except what is enforced by the ZoomLevelSet’s ?



4) The WmtsOverlay class assumes a tileset with a single top tile. Is this correct ?



5) The WmtsOverlay class assumes that the projection used is similar to the current map. Correct ?



6) Is the WmtsOverlay class the same in 8.0 as in 7.0 ?



Cheers



Lars I Nielsen

Geopartner A/S

Hi again,



Pending answers to my previous questions, let me reverse my question to make it simple:



How do I bring a WMTS service defined in UTM zone 32 North (ETRS89) covering Denmark into MapSuite 8.0 ?



The raw service has 3x2 top tiles, but I’ve built a proxy to enable it work as a single-top-tile service.



I’d like to add whichever of these to services into Map Suite. How to do ???



I can send the specs for the service in question, or code samples of my previous efforts.



Cheers

Hi Lars,



I will answer your questions one by one:

1) The boundingbox of the matrixTileSet is decided by WMTS service metadata(GetCapabilities response). Your wmts service map upper-left is always on (-20000000,20000000) means its TileMatrix TopLeftCorner is assigned for it. Here is a wmts capabilities file, please check and you will notice those information server.caris.com/spatialfusionserver/services/ows/wmts/NaturalEarth/1.0.0/WMTSCapabilities.xml

2) Sorry I am not very clear what’s the mean. Do you mean you want to set an extent for WmtsOverlay? 

3) We can set the TileMatrixIds property of the WmtsOverlay for that. If a list of strings is provided, each item should be the matrix identifier that corresponds to the map zoom level. Additionally, a list of objects can be provided.  Each object should describe the matrix as presented in the WMTS capabilities.  These objects should have the propertes shown below.

4) The WmtsOverlay uses multi tiles to render the current wmts layer.

5) The wmtsOverlay projection is decided by the Tilematrixset and we can get the information from WMTS service metadata.
6) We almost didn’t do any updates on WmtsOverlay from 7.0 to 8.0.



In fact, The wmtsOverlay class will collect the required properties for a wmts service layer, and in the end, we will use those information to build a WMTS layer instance from OpenLayers(which is Web Edition render library in client). So, what I means is if there are some limitations on map suite WmtsOverlay class, we can still do more extensions with WMTS layer in client. Here is a document about this layer. 

dev.openlayers.org/docs/file…TS-js.html

svn.osgeo.org/tilecache/bra…SGuide.txt



If anything I misunderstand, please feel free to let me know.

Thanks,

Troy

Hi Troy,



The WMTS service in question doesn’t not have (-20m,-20m) as its upper-left corner, and it isn’t defined in the Google/Bing/Popular Mercator projection, but in UTM zone 32 north, as I wrote.



Have a look at its capabilities document HERE



It seems clear to me, that the (-20m,-20m) is hard coded into Map Suite. This is a show stopper for me (and all others with local WMTS services).



Cheers

Lars I



Ps! I just made a demo app with Map Suite 8.0, and it’s the same as in 7.0. I’ll see if I can get it online for you.

Hi Lars, 
  
 Just like Troy said, our WmtsOverlay is based on WMTS of OpenLayers (dev.openlayers.org/docs/files/OpenLayers/Layer/WMTS-js.html). 
  
 And I think why your map have a upper-left corner(-20, -20) that should because your extent cannot be split to multiply complete tiles, so the map snap current extent to nearest zoom level, that’s the OpenLayers logic. 
  
 I am not sure whether calculate and set custom zoomlevel is helpful, I think we will have more research about your issue and please feel free to upload your demo if it built succeed. 
  
 Regards, 
  
 Don

Hi Don,



Not (-20,-20), but (-20m,-20m), i.e. (-20,000,000,-20,000,000). Just my shorthand notation.



This corresponds to upper-left for the Popular Mercator/Visualization projection, which is roughly defined as +/- 20M meters.



You say that the WmtsOverlay is modelled to mimic the OpenLayers implementation. 



But if I look at that definition (using the link you sent), I see the two properties “tileOrigin” and “tileFullExtent”. These are absent from the WmtsOverlay class implementation, as far as I can see. Hence my suspicion that these have been hardcoded.



If I had access to set these properties to custom values, I would most likely be able to use the WMTS service in question.



You can see my demo application HERE



Here’s the Page_Load sub of the application (the only source code, it’s really simple):




Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not IsPostBack Then
            Me.Header.Title += " (" + Map.Version + “)”
            With Map1
                .BackColor = Drawing.Color.WhiteSmoke
                .MapUnit = ThinkGeo.MapSuite.Core.GeographyUnit.Meter
                With .MapTools
                    .MouseCoordinate.Enabled = True
                    With .OverlaySwitcher
                        .Enabled = True
                        .BackgroundColor = GeoColor.FromArgb(127, 0, 0, 0)
                    End With
                    With .MouseMapTool
                        .Enabled = True
                        .IsMouseWheelDisabled = False
                    End With
                End With
                'SRS ???
                .CurrentExtent = New RectangleShape(120000, 6500000, 1000000, 5900000) 'from capabilities
                .ZoomTo(New PointShape(-8850000, 11500000), 80000000) 'works for now
                '-- add WMTS (via proxy)
                Dim gst1 As New WmtsOverlay(“GST1”)
                With gst1
                    .Name = “KF Skærmkort”
                    .ServerUris.Add(New Uri("<a href=“hvmgo01.hvenegaard.dk/kortforsyningen.kms.dk/Service.ashx?servicename=topo_skaermkort&service=WMTS&version=1.1.1&login=&password=&”>hvmgo01.hvenegaard.dk/kortfo…word=&</a>"))
                    'SRS ???
                    .TileMatrixSetName = “View1”
                    .OutputFormat = “image/jpeg”
                    .ActiveLayerName = “dtk_skaermkort”
                    .ActiveStyleName = “default”
                    .WmtsSeverEncodingType = WmtsSeverEncodingType.Kvp 'url arguments
                    .IsBaseOverlay = True
                    .IsVisibleInOverlaySwitcher = True
                End With
                Map1.CustomOverlays.Add(gst1)
 
                Dim gst2 As New WmtsOverlay(“GST2”)
                With gst2
                    .Name = “KF Luftfoto”
                    .ServerUris.Add(New Uri("<a href=“hvmgo01.hvenegaard.dk/kortforsyningen.kms.dk/Service.ashx?servicename=orto_foraar&service=WMTS&version=1.1.1&login=&password=&”>hvmgo01.hvenegaard.dk/kortfo…word=&</a>"))
                    'SRS ???
                    .TileMatrixSetName = “View1”
                    .OutputFormat = “image/jpeg”
                    .ActiveLayerName = “orto_foraar”
                    .ActiveStyleName = “default”
                    .WmtsSeverEncodingType = WmtsSeverEncodingType.Kvp 'url arguments
                    .IsBaseOverlay = True
                    .IsVisibleInOverlaySwitcher = True
                End With
                Map1.CustomOverlays.Add(gst2)
 
            End With 'Map1
        End If
End Sub





I did remove the login specs, as I’m not at liberty to publish these openly. I can send it in a PM if need be.



Cheers

Hi again,



Actually it doesn’t seem like Map Suite sets the mentioned OpenLayers.WMTS properties - “tileOrigin” and “tileExtent” - at all.



Which means that WmtsOverlay is simply incapable of utilizing any non-world WMTS service.



Please log this as a high priority enhancement request. It’s a complete show-stopper for utilizing all non-world WMTS services.



It ought to be a simple task of adding support for these two properties.



Cheers


Hi Cheers,



Thanks for your sample, please remove your sample link in previous reply, it will public your login information.



If you will modify your password please PM me the new one.



Attached is a WMTS sample from OpenLayers, I modified it.



At first I want to use this sample to see whether “tileOrigin” and “tileExtent” can work for your issue, but I found it’s strange that I cannot shows all shapes when initialize no matter how to set the center point.



I am not sure whether that’s related with this issue, could you please have a look at the sample?



Here is original sample address: openlayers.org/dev/examples/wmts.html.



Regards,



Don

olwmts_examples.zip (1.43 KB)

Hi Don,



My name’s Lars, not Cheers. That’s just a greeting :-)



I got the sample working with two WMTS layers. And the coordinates are correct (epsg:25832).



The trick was to add the WMTS bounds to the Map definition. This is in turn is inherited by the WMTS layers.




var kf_bounds = [ 120000, 4822278, 1797722, 6500000 ];
 
map = new OpenLayers.Map({
        div: “map”,
        maxExtent: kf_bounds,
        projection: “EPSG:25832”
});    

I put this online HERE, which also has a link to the JS source code.



Is it possible in Map Suite Web Edition setting such a “maxExtent” on the map, that’ll produce JSOn like above ? If so, how ?



Cheers

Lars

Hi Lars, 
  
 I am very sorry I haven’t noticed that’s not your name… 
  
 And thanks your enhancement for the sample so make it works. 
  
 I think maybe we can add maxExtent to Parameters field in WmtsOverlay class, but I am not very clear about that. Because I haven’t created a sample for test that and today I don’t have enough time for that. 
  
 I will go on work for it, and today if you found the Parameters is useful please let me know. 
  
 Regards, 
  
 Don

Hi Don,



No worries about the name :-)





As for using the Parameters collection, "maxExtent" belongs to the Layer object in OpenLayers, not the Layer.WMTS object.



The latter instead has "tileOrigin" and "tileFullExtent". These are the ones to utilize in the WmtsOverlay class.



My sample just had the Layer.WMTS inherit the "maxExtent" set on Layer, as per the OpenLayers documentation.





I will try to modify the sample to move the necessary parameter setting from Layer to Layer.WMTS.



If this works, are you saying that I can use the Parameters collection in WmtsOverlay to accomplish setting "tileOrigin" and "tileFullExtent" here-and-now in the OpenLayers client ??



Cheers

Lars

Hi again Don,



I tried to modify my example application, moving the extent information from Layer.maxExtent to Layer.WMTS.tileOrigin and Layer.WMTS.tileFullExtent.



I’ve had limited success.



Despite what the OpenLayers documentation says (“If not supplied, the layer’s maxExtent property will be used.”), setting “maxExtent” in Layer will overrule setting “tileFullExtent” in Layer.WMTS.



The Layer.WMTS.tileOrigin is used it seems, but without a correct extent the client “scales” the tiles wrt the Layer.maxExtent.



So the Layer.maxExtent has to be both set to a value, and set to the same value as Layer.WMTS.tileFullExtent apparently :-(



My updated sample is HERE



I’m trying to file a bug report with OpenLayers so they’re alerted to the problem.



Cheers

Lars

And to answer my own previous question about the Parameters collection i WmtsOverlay: No, it doesn’t work with tileOrigin and tileFullExtent.



The Parameters collection in Map Suite is sent as a “params” object to Layer.WMTS, and according to the docs, these are used in tile request only, not in defining the Layer.WMTS :



params



{Object} Extra parameters to include in tile requests.  …





I’ve looked at the OpenLayers javascript code that Map Suite emits, and this bit seems to be hardcoded:




var jsonMap1={ (…) ,“maxExtent”:{“left”:-1000000000,“bottom”:-1000000000,“right”:1003745822.33726,“top”:1003745822.33726}, (…) }



Cheers

Lars

Hi,



Any confirmation on whether the WmtsOverlay implementation uses a hard-coded extent setting ?



And whether a date can be given when access to the relevant settings in OpenLayers will be implemented ?



Cheers

Lars

Hi Lars, 
  
 Thanks for your research, but the WmtsOverlay is implemented very simple and I haven’t found any hard-code part.  
  
 I research all the JS code, found the only hard-code maxExtent is we set default value for projection 900913: 
  
 units: “m”, 
 maxExtent: [-1000000000, -1000000000, 1000000000, 1000000000] 
  
 In fact, if we can make the map shows correct via Javascript setting, we can modify it in client side like this: 
  
  
(script language=“javascript”  type=“text/javascript”)
function OnMapCreated(map) {
            // Do anything for map object
        }
(/script)
 
  
 We can modify any value or setting for map(include any OpenLayers setting) here. So if we found edit openlayers setting can make that works, we can directly modify the values in OnMapCreated function. 
  
 Generally when we want to add public property, we need to modify JavaScript to make it works, if that works and is useful for object, we will append an inner issue, then developer will add it in current development dlls or next release. 
  
 Regards, 
  
 Don

Hi Don,



But this is precisely the hardcoding I’ve been talking about I



I don’t want to use the Google projection (which by the way is EPSG:3857 nowadays), I want to use the UTM zone 32N projection on ETRS89, i.e. EPSG:25832 ! This is the definition of our local WMTS services.



And I’d prefer setting the necessary parameter server-side in Map Suite. Doing it in JavaScript is a buggy-prone work-around, imho.



Please add access to both Layer.maxExtent and to tileOrigin and tileFullExtent accessable via WmtsOverlay into your development cycle asap.



Cheers

Lars

Hi Lars, 
  
 I just know the setting will also used for other projection like your 25832. 
  
 I have let our developer knows your question, the maxExtent will be opened in Map level, and tileFullExtent will be accessible for WmtsOverlay, for tileOrigin our developer need make sure how to open it with further research. 
  
 BTW, I think our WMTSLayer can be used also and it contains all necessary settings. 
  
 I will update this topic if any progress. 
  
 Regards, 
  
 Don

Hi Don,



Thanks for passing this problem/request on to the developers.



And no, the properties in question are not present in Thinkgeo.MapSuite.Core.WmtsLayer either.



Cheers

Lars

Hi Lars, 
  
 Now we can set MaxExtent, TileFullExtent and TileOrigin. 
  
 MaxExtent is the property of Map, the others are the properties of WmtsOverlay. 
  
 You can get them in 8.0.79.0 or higher version. 
  
 Please let me know whether they works for you. 
  
 Regards, 
  
 Don