iShare v6 and later uses MapProxy to create and display cached map data, for example aerial or historic maps. MapProxy may also be useful in other circumstances, for example:
You may have to provide a customer API Key in the URL for each request, as in the case with the OS Maps API. If this were to be used directly in iShare, the key would have to be transferred to the client which could expose it to misuse.
Proxying the basemap through MapProxy allows us to also query it directly with WMS which then means that it should work seamlessly with printing.
Configuration Overview
MapProxy uses a YAML configuration file to define the service - this file will normally be stored with the MapProxy application, for example at D:/mapproxy/mapproxy.yaml. Full documentation on configuring the YAML file are at: https://mapproxy.org/docs/latest/configuration.html, and a sample YAML file is attached to this page.
Configuration of MapProxy layers in Studio is covered in this section: BaseMaps Details .
The YAML file can be edited in a text editor such as Notepad++. The following are the main sections of the YAML file which need to be configured for each layer:
Layers: the layers that are available in the service
Caches: where the cache is stored
Sources: the source of the data to be cached
Grid: the Coordinate Reference System used in the layer, and the scales/resolutions available.
Troubleshooting configuration
Bear in mind the following when setting up a MapProxy installation:
the syntax and indentation shown in the example file and in the MapProxy documentation should be followed exactly in order to avoid errors
any errors will be recorded in the mapproxy.log file, which is normally in the same folder as the mapproxy.yaml file
you will need to make sure that any referenced folders are accessible by the MapProxy IIS application pool, and that the MapServer application pool has access to the source data and images
Detailed Configuration
Layers
This section defines one or more layers to be served by MapProxy. Each layer should have:
name: used as a reference by Studio in the Details dialog
title: descriptive name for display purposes
sources: a reference to one or more sources defined elsewhere in the YAML file, defining the data to be displayed
See the example below.
layers: - name: aerial2013 title: Aerial 2013 sources: [aerial2013_cache] - name: aerial2018 title: Aerial 2018 sources: [aerial2018_cache] - name: basemap title: Colour sources: [basemap_cache]
Caches
This section defines the location of the cached data. The cache reference in the first line is referenced by the layers section, and the cache also identifies the source of the data.
Each cache will have:
grid: a reference to a grid definition elsewhere in the YAML file
sources: a reference to one or more source sections - if this is a MapServer WMS, the source includes both the reference to the source name in the YAML file (e.g. aerial_wms_2013) and the name of the layer or group in the map file (e.g. aerial2013)
cache: details of the cache itself, containing
type: the type of cache storage
filename: the location of the cache
caches: aerial2013_cache: grids: [grid_gb] sources: ['aerial_wms_2013:aerial2013'] cache: type: mbtiles filename: E:\Tiles\aerial2013.mbtiles aerial2018_cache: grids: [grid_gb] sources: ['aerial_wms_2018:aerial2018'] cache: type: mbtiles filename: E:\Tiles\aerial2018.mbtiles
Sources
This section defines the source of the data to be displayed and cached. It will contain one or more sources, of which a single layer can reference one or more. The first line of the source will be used in the sources section of the layer as a reference. Each source will also have:
type: the type of source being referenced
wms: for example a MapServer layer configured in Studio, or an external WMS
tile: for example an existing tilecache on an iShare server
grid: a reference to a grid definition elsewhere in the YAML file
url: the location for the tilecache or WMS
sources: aerial_wms_2013: type: wms req: url: http://127.0.0.1/Mapserver/ms761?map=E:/iShareData/LIVE/_MapServerConfig/base_raster_aerial_2013.map http: ssl_no_cert_checks: true aerial_wms_2018: type: wms req: url: http://127.0.0.1/Mapserver/ms761?map=E:/iShareData/LIVE/_MapServerConfig/base_raster_aerial_2018.map http: ssl_no_cert_checks: true
Grids
This section contains details of the coordinate reference system used by the cache. The first line contains the referenced used by the caches section. Each grid contains:
origin: the origin point of the grid in relation to the grid area - the default is sw
srs: the coordinate reference system/spatial reference system being used by the data, using the EPSG code
bbox: the bounding box of the grid, i.e. the extent of the data, using the units specified in bbox_srs
bbox_srs: the SRS of the units specified in bbox
res: the resolutions that MapProxy will cache - see the section below on Adding Scales for more detail on this.
grd_os_raster_road: origin: nw srs: 'EPSG:27700' bbox: [-238375.0,0.0,900000.0,1376256.0] bbox_srs: 'EPSG:27700' res: [896.0, 448.0, 224.0, 112.0, 56.0, 28.0, 14.0, 7.0, 3.5, 1.75]
Adding Scales
The default scales may not cover the range of scales you wish to provide for your basemap, and MapProxy can help with this. The cache upscale_tiles
as described in the cache documentation can scale tiles up depending on your requirements.
chc_my_basemap: grids: [ "grd_my_basemap" ] sources: [ "src_my_basemap"] meta_buffer: 0 minimize_meta_requests: true upscale_tiles: 1 cache_rescaled_tiles: true
This lets MapProxy know that any tiles that cannot be retrieved from the source should be rescaled from the next level up. Please note that this will not happen if there is an error returned from the source, just if the source is limited on what resolutions it can return. Again, please read the documentation for more information.
sources: src_my_basemap: type: tile grid: grd_my_basemap url: https://mymaps.com/maps/raster/v1/wmts?height=256&width=256&style=default&layer=My_Basemap&version=1.0.0&service=WMTS&Request=GetTile&format=image/png&TileMatrixSet=EPSG:27700&TileMatrix=EPSG:27700:%(z)s&TileRow=%(y)s&TileCol=%(x)s max_res: 0.109375 min_res: 896.0
We need to set a max_res
and min_res
in the source to specify what resolutions the source supports returning.
grd_my_basemap: origin: nw srs: 'EPSG:27700' bbox: [-238375.0,0.0,900000.0,1376256.0] bbox_srs: 'EPSG:27700' res: [896.0, 448.0, 224.0, 112.0, 56.0, 28.0, 14.0, 7.0, 3.5, 1.75, 0.875, 0.4375, 0.21875, 0.109375, 0.0546875, 0.02734375, 0.013671875, 0.0068359375]
The final step is to increase the number of resolutions that are available for the basemap so that the client will pick them up, just remember that any specific WMTS scale is the previous scale divided by two. In the example above, the following resolutions will be scaled as they are outside the source max/min res limits.
0.0546875, 0.02734375, 0.013671875, 0.0068359375