The tiled map engine is used to support cached map services that provide tiles to the browser to draw the maps, as opposed to generating a complete map image.
If more than one crs, format or layer from a tiled map service is needed then multiple map engines must be created, each specifying a different crs, format or layer. Each tiled map engine can only represent a single map layer.
Performance/Quality improvements
As of 2.6.4 you can specify if a tiled map engine should aim for performance or quality when re-projecting tiles and also how many tiles should be fetched at in parallel.
reprojectMode
can be set to default
, speed
or quality
, and defaults to default
if not set, which is a balance between the two (but speed
is still significantly quicker than both default
and quality
).
fetchThread
, which defaults to 1, specifies how many tiles will be fetched at once from the back end tile provider. More threads mean better performance, but it currently defaults to 1 since it's a new feature.
<tiled:mapengine id="osm"> <type>osm</type> <format>image/png</format> <url>//a.tile.openstreetmap.org/${z}/${x}/${y}.png</url> <url>//b.tile.openstreetmap.org/${z}/${x}/${y}.png</url> <url>//c.tile.openstreetmap.org/${z}/${x}/${y}.png</url> <reprojectMode>speed</reprojectMode> <fetchThreads>8</fetchThreads> </tiled:mapengine>
GeoWebCache
<?xml version="1.0" encoding="UTF-8"?> <config xmlns='urn:com.cohga.server.config#1.0' xmlns:tiled="urn:com.cohga.server.map.tiled#1.0"> <tiled:mapengine id="mapengine.tiled"> <type>gwc</type> <url>http://mapserver/geowebcache/service/wms?TILED=true</url> <username>user</username> <password>ENCAZEPAMMBZAAUTUPMABFJEBZJAKFCXGME</password> <crs>EPSG:3857</crs> <format>image/jpeg</format> <layer>aerialphoto_2014_10_15</layer> </tiled:mapengine> </config>
The above example shows how to create a GeoWebCache tiled map engine.
The type
attribute defaults to "gwc" ("geowebcache" can also be used) and determines how the tiles are handled by the client.
The url
points to where the capabilities document for the tile service can be downloaded from. Generally with GeoWebCache tiled services it's a regular WMS url with the TILED=true
parameter included.
The username
and password
are optional (the password had been encrypted with the encrypt
command at the osgi console) and should be used if the service requires authentication.
The crs
parameter is required and specifies what coordinate reference system the tiles are projected in.
The format
parameter is required and specifies what image format the tiles are presented as.
The layer
parameter is required and specifies the layer within the service that should be used.
OpenStreetMap
<?xml version="1.0" encoding="UTF-8"?> <config xmlns='urn:com.cohga.server.config#1.0' xmlns:tiled="urn:com.cohga.server.map.tiled#1.0"> <tiled:mapengine id="mapengine.tiled"> <type>osm</type> <url>http://a.tile.openstreetmap.org/${z}/${x}/${y}.png</url> <url>http://b.tile.openstreetmap.org/${z}/${x}/${y}.png</url> <url>http://c.tile.openstreetmap.org/${z}/${x}/${y}.png</url> <format>image/png</format> <layer>0</layer> <label>image</label> <!-- The items shown here are the defaults and are just included to show what can be changed. Do not just cut and paste the following unless you intend changing it, and do not change it unless you know what you are doing. --> <tile> <resolutions>156543.03390625,78271.516953125,39135.7584765625,19567.87923828125,...<full list missing for brevity>...,0.5971642833948135</resolutions> <tileWidth>256</tileWidth> <tileHeight>256</tileHeight> </tile> <envelope crs="EPSG:3857" minx="-20037508.34" miny="-20037508.34" maxx="20037508.34" maxy="20037508.34" /> </tiled:mapengine> </config>
The above example shows how to create a OpenStreetMap (OSM) tiled map engine.
The type
attribute defaults to "osm" ("openstreetmap" can also be used) and determines how the tiles are handled by the client.
The url
points to where the tiles can be downloaded from, and must include place holders for the x, y and z values.
The format
parameter is optional and specifies what image format the tiles are presented as. The default format is "image/jpeg".
The layer
parameter is optional and specifies what will be used as the layer id. The default is "0".
The label
parameter is optional and specifies what will be used as the layer name. The default is "image".
The tile
parameter is optional and specifies settings related to the tiles provided. The default is set according to the OSM spec, and should only be changed if you're using your own OSM tiles.
The envelope
the parameter is optional and specifies the extent of the tiles. The default is set according to the OSM spec, and should only be changed if you're using your own OSM tiles.
Here
Please refer to the Here Developer Portal for more information about licensing and pricing https://developer.here.com/
See the documentation for the Map Tile REST Service offered by Here https://developer.here.com/documentation/map-tile/dev_guide/topics/introduction.html
<?xml version="1.0" encoding="UTF-8"?> <config xmlns='urn:com.cohga.server.config#1.0' xmlns:tiled="urn:com.cohga.server.map.tiled#1.0"> <?set HERE_APP_ID=YOUR_APP_ID?> <?set HERE_APP_CODE=YOUR_APP_CODE?> <tiled:mapengine id="mapengine.here.normal.day"> <type>osm</type> <url><![CDATA[https://1.base.maps.api.here.com/maptile/2.1/maptile/newest/normal.day/${z}/${x}/${y}/256/png8?app_id=${HERE_APP_ID}&app_code=${HERE_APP_CODE}]]></url> <url><![CDATA[https://2.base.maps.api.here.com/maptile/2.1/maptile/newest/normal.day/${z}/${x}/${y}/256/png8?app_id=${HERE_APP_ID}&app_code=${HERE_APP_CODE}]]></url> <format>image/png</format> <layer>0</layer> <label>Here Streetmap</label> </tiled:mapengine> <tiled:mapengine id="mapengine.here.satellite.day"> <type>osm</type> <url><![CDATA[https://1.aerial.maps.api.here.com/maptile/2.1/maptile/newest/satellite.day/${z}/${x}/${y}/256/png8?app_id=${HERE_APP_ID}&app_code=${HERE_APP_CODE}]]></url> <url><![CDATA[https://2.aerial.maps.api.here.com/maptile/2.1/maptile/newest/satellite.day/${z}/${x}/${y}/256/png8?app_id=${HERE_APP_ID}&app_code=${HERE_APP_CODE}]]></url> <format>image/png</format> <layer>0</layer> <label>Here Satellite</label> </tiled:mapengine> <tiled:mapengine id="mapengine.here.hybrid.day"> <type>osm</type> <url><![CDATA[https://1.aerial.maps.api.here.com/maptile/2.1/maptile/newest/hybrid.day/${z}/${x}/${y}/256/png8?app_id=${HERE_APP_ID}&app_code=${HERE_APP_CODE}]]></url> <url><![CDATA[https://2.aerial.maps.api.here.com/maptile/2.1/maptile/newest/hybrid.day/${z}/${x}/${y}/256/png8?app_id=${HERE_APP_ID}&app_code=${HERE_APP_CODE}]]></url> <format>image/png</format> <layer>0</layer> <label>Here Hybrid</label> </tiled:mapengine> <tiled:mapengine id="mapengine.here.terrain.day"> <type>osm</type> <url><![CDATA[https://1.aerial.maps.api.here.com/maptile/2.1/maptile/newest/terrain.day/${z}/${x}/${y}/256/png8?app_id=${HERE_APP_ID}&app_code=${HERE_APP_CODE}]]></url> <url><![CDATA[https://2.aerial.maps.api.here.com/maptile/2.1/maptile/newest/terrain.day/${z}/${x}/${y}/256/png8?app_id=${HERE_APP_ID}&app_code=${HERE_APP_CODE}]]></url> <format>image/png</format> <layer>0</layer> <label>Here Terrain</label> </tiled:mapengine> </config>
You can also access Google map tiles using the same algorithm as OpenStreetMap.
The following shows how to create a map engine to represent each of the display types that Google provides tiles for. Once this is done, the map engines can be treated like any other tiled map engine and be added to a toc model and a client config.
The URLs contain special characters so these need to be escaped, or CDATA
can be used to ensure they are interpreted correctly. Examples of both are shown below.
Note if you notice Google tiles using a different language then add &hl=en
to the end of the URL (for English)
<?xml version="1.0" encoding="UTF-8"?> <config xmlns='urn:com.cohga.server.config#1.0' xmlns:tiled="urn:com.cohga.server.map.tiled#1.0"> <tiled:mapengine id="google.standard"> <type>osm</type> <format>image/png</format> <url><![CDATA[//mt0.google.com/vt/lyrs=m&x=${x}&y=${y}&z=${z}]]></url> <url><![CDATA[//mt1.google.com/vt/lyrs=m&x=${x}&y=${y}&z=${z}]]></url> <url><![CDATA[//mt2.google.com/vt/lyrs=m&x=${x}&y=${y}&z=${z}]]></url> </tiled:mapengine> <tiled:mapengine id="google.satellite"> <type>osm</type> <format>image/png</format> <url><![CDATA[//mt0.google.com/vt/lyrs=s&x=${x}&y=${y}&z=${z}]]></url> <url><![CDATA[//mt1.google.com/vt/lyrs=s&x=${x}&y=${y}&z=${z}]]></url> <url><![CDATA[//mt2.google.com/vt/lyrs=s&x=${x}&y=${y}&z=${z}]]></url> </tiled:mapengine> <tiled:mapengine id="google.alt"> <type>osm</type> <format>image/png</format> <url><![CDATA[//mt0.google.com/vt/lyrs=r&x=${x}&y=${y}&z=${z}]]></url> <url><![CDATA[//mt1.google.com/vt/lyrs=r&x=${x}&y=${y}&z=${z}]]></url> <url><![CDATA[//mt2.google.com/vt/lyrs=r&x=${x}&y=${y}&z=${z}]]></url> </tiled:mapengine> <tiled:mapengine id="google.terrain"> <type>osm</type> <format>image/png</format> <url><![CDATA[//mt0.google.com/vt/lyrs=t&x=${x}&y=${y}&z=${z}]]></url> <url><![CDATA[//mt1.google.com/vt/lyrs=t&x=${x}&y=${y}&z=${z}]]></url> <url><![CDATA[//mt2.google.com/vt/lyrs=t&x=${x}&y=${y}&z=${z}]]></url> </tiled:mapengine> <tiled:mapengine id="google.alt.terrain"> <type>osm</type> <format>image/png</format> <url><![CDATA[//mt0.google.com/vt/lyrs=p&x=${x}&y=${y}&z=${z}]]></url> <url><![CDATA[//mt1.google.com/vt/lyrs=p&x=${x}&y=${y}&z=${z}]]></url> <url><![CDATA[//mt2.google.com/vt/lyrs=p&x=${x}&y=${y}&z=${z}]]></url> </tiled:mapengine> <tiled:mapengine id="google.roads"> <type>osm</type> <format>image/png</format> <url><![CDATA[//mt0.google.com/vt/lyrs=h&x=${x}&y=${y}&z=${z}]]></url> <url><![CDATA[//mt1.google.com/vt/lyrs=h&x=${x}&y=${y}&z=${z}]]></url> <url><![CDATA[//mt2.google.com/vt/lyrs=h&x=${x}&y=${y}&z=${z}]]></url> </tiled:mapengine> <tiled:mapengine id="google.hybrid"> <type>osm</type> <format>image/png</format> <url><![CDATA[//mt0.google.com/vt/lyrs=y&x=${x}&y=${y}&z=${z}]]></url> <url><![CDATA[//mt1.google.com/vt/lyrs=y&x=${x}&y=${y}&z=${z}]]></url> <url><![CDATA[//mt2.google.com/vt/lyrs=y&x=${x}&y=${y}&z=${z}]]></url> </tiled:mapengine> </config>
Note: Before using the Google Map Service, please ensure you read through the Google Maps Terms of Service and ensure that you have correctly setup licensing with Weave.
ArcGIS
There are two ArcGIS specific methods of providing tile cache support to Weave clients, this method is specifically provided to support exposing a local compressed ArcGIS map service tile cache, i.e. a tile cache created by ArcGIS where the tiles are stored in the compressed format (with .bundle, or with .bundle and .bundlx files) on the local file system of the Weave server. If this is not your situation then you should use the ArcGIS specific map engine to expose the tiles.
For the ArcGIS tiles map engine the type
value should be set to arcgis
and a tilingScheme
value must be provided that points to the local conf.xml
file.
<?xml version="1.0" encoding="UTF-8"?> <config xmlns='urn:com.cohga.server.config#1.0' xmlns:tiled="urn:com.cohga.server.map.tiled#1.0"> <tiled:mapengine id="ags.tiled.aerial10cm"> <type>arcgis</type> <tilingScheme>/data/spatial/raster/aerial10cm/Layers/conf.xml</tilingScheme> </tiled:mapengine> </config>
Client
Once the map engine is created it must be added to a ToC model and client map view the same as any other map engine. The client map engine configuration should specify only the map engine id. Weave provides all of the parameters required to configure the map engine and it obtains these by processing the 'capabilities document' of the map service.
<view id='com.cohga.html.client.map.mapView'> <mapEngine id="mapengine.tiled"/> <mapEngine id="mapengine.vector"/> <mapEngine id="mapengine.selection"> <options> <selection>true</selection> </options> </mapEngine> <!-- resolutions should match tiled map engine --> <resolutions>156543.03390625,78271.516953125,39135.7584765625,19567.87923828125,...full list missing for brevity...,0.5971642833948135</resolutions> <!-- CRS should match tiled map engine --> <crs>EPSG:3857</crs> </view>
Tile Subsets
It's possible to use a subset of tiles in the client that does not cover the entire zoom range available in that tile set. For example, if you're using a Google tile set and the corresponding resolutions, there are on average 20 different zoom levels available. However you might wish to include your own local tile set that cover a subset of those 20 zoom levels. Or, if you're using the Google or OpenStreetMap tile sets, you might want to limit the user to a smaller zoom range and not allow them to zoom out beyond a certain level. Both of these situations can be catered for in Weave.
To include your local tile set you need to configure the map engine to tell it at which zoom level it should start at and how many zoom levels it covers, otherwise it will assume that it starts at zoom level 0 and has 20 zoom levels available (assuming that you've setup the client with the default Google zoom levels).
This is done by setting the numZoomLevels
and zoomOffset
options for the map engine. Also you may need to reduce the number of resolutions listed for the map view.
For example, if we wanted to update the map view example above so that the user can only access the first 8 zoom levels, we set numZoomLevels
to 8 and set zoomOffset
to 12 (20, the default number of zoom levels for the map view, minus 8) and then change the client map view resolutions list to only include the resolutions we want to enable.
<view id='com.cohga.html.client.map.mapView'> <mapEngine id="mapengine.tiled"> <options> <numZoomLevels>8</numZoomLevels> <zoomOffset>12</zoomOffset> </options> </mapEngine> <mapEngine id="mapengine.vector"/> <mapEngine id="mapengine.selection"> <options> <selection>true</selection> </options> </mapEngine> <!-- resolutions should match tiled map engine --> <resolutions>38.218514137268066, 19.109257068634033, 9.554628534317017, 4.777314267158508, 2.388657133579254, 1.194328566789627, 0.5971642833948135, 0.298582142</resolutions> <!-- CRS should match tiled map engine --> <crs>EPSG:3857</crs> </view>
Alternatively, if you still wanted to allow 8 zoom levels but wanted to skip the first two lowest zoom levels so the user can't zoom in too far, then you'd still set numZoomLevels
to 8, but you'd set zoomOffset
to 10 (20, minus 8, minus 2) and set the map view resolutions to match the 8 zoom levels (skipping the two lowest resolutions).
<view id='com.cohga.html.client.map.mapView'> <mapEngine id="mapengine.tiled"> <options> <numZoomLevels>8</numZoomLevels> <zoomOffset>10</zoomOffset> </options> </mapEngine> <mapEngine id="mapengine.vector"/> <mapEngine id="mapengine.selection"> <options> <selection>true</selection> </options> </mapEngine> <!-- resolutions should match tiled map engine --> <resolutions>152.87405654907226, 76.43702827453613, 38.218514137268066, 19.109257068634033, 9.554628534317017, 4.777314267158508, 2.388657133579254, 1.194328566789627</resolutions> <!-- CRS should match tiled map engine --> <crs>EPSG:3857</crs> </view>
Server Resolutions
It is now possible to specify the resolutions provided by the tiles separately from those used by the client, and then have Weave choose the closest.
Note:
- This will cause the displayed tiles to not look as crisp as they would if the correct resolutions are used.
- The tiles must still be in the same projection as the client.
<view id='com.cohga.html.client.map.mapView'> <mapEngine id="mapengine.tiled"> <options> <serverResolutions>160000,80000,40000,20000,...full list missing for brevity...,0.5</serverResolutions> </options> <mapEngine id="mapengine.vector"/> <mapEngine id="mapengine.selection"> <options> <selection>true</selection> </options> </mapEngine> <resolutions>156543.03390625,78271.516953125,39135.7584765625,19567.87923828125,...full list missing for brevity...,0.5971642833948135</resolutions> <!-- CRS should match tiled map engine --> <crs>EPSG:3857</crs> </view>