MapProxy 1.16.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mapproxy/__init__.py +0 -0
- mapproxy/cache/__init__.py +36 -0
- mapproxy/cache/azureblob.py +145 -0
- mapproxy/cache/base.py +111 -0
- mapproxy/cache/compact.py +664 -0
- mapproxy/cache/couchdb.py +295 -0
- mapproxy/cache/dummy.py +34 -0
- mapproxy/cache/file.py +185 -0
- mapproxy/cache/geopackage.py +609 -0
- mapproxy/cache/legend.py +83 -0
- mapproxy/cache/mbtiles.py +392 -0
- mapproxy/cache/meta.py +78 -0
- mapproxy/cache/path.py +250 -0
- mapproxy/cache/redis.py +88 -0
- mapproxy/cache/renderd.py +95 -0
- mapproxy/cache/riak.py +202 -0
- mapproxy/cache/s3.py +177 -0
- mapproxy/cache/tile.py +699 -0
- mapproxy/client/__init__.py +0 -0
- mapproxy/client/arcgis.py +79 -0
- mapproxy/client/cgi.py +139 -0
- mapproxy/client/http.py +315 -0
- mapproxy/client/log.py +33 -0
- mapproxy/client/tile.py +150 -0
- mapproxy/client/wms.py +254 -0
- mapproxy/compat/__init__.py +46 -0
- mapproxy/compat/image.py +79 -0
- mapproxy/compat/itertools.py +29 -0
- mapproxy/compat/modules.py +13 -0
- mapproxy/config/__init__.py +22 -0
- mapproxy/config/config.py +201 -0
- mapproxy/config/coverage.py +107 -0
- mapproxy/config/defaults.py +98 -0
- mapproxy/config/loader.py +2286 -0
- mapproxy/config/spec.py +644 -0
- mapproxy/config/validator.py +239 -0
- mapproxy/config_template/__init__.py +0 -0
- mapproxy/config_template/base_config/config.wsgi +10 -0
- mapproxy/config_template/base_config/full_example.yaml +593 -0
- mapproxy/config_template/base_config/full_seed_example.yaml +79 -0
- mapproxy/config_template/base_config/log.ini +35 -0
- mapproxy/config_template/base_config/mapproxy.yaml +60 -0
- mapproxy/config_template/base_config/seed.yaml +27 -0
- mapproxy/exception.py +142 -0
- mapproxy/featureinfo.py +252 -0
- mapproxy/grid.py +1170 -0
- mapproxy/image/__init__.py +536 -0
- mapproxy/image/fonts/DejaVuSans.ttf +0 -0
- mapproxy/image/fonts/DejaVuSansMono.ttf +0 -0
- mapproxy/image/fonts/LICENSE +99 -0
- mapproxy/image/fonts/__init__.py +0 -0
- mapproxy/image/mask.py +75 -0
- mapproxy/image/merge.py +316 -0
- mapproxy/image/message.py +347 -0
- mapproxy/image/opts.py +182 -0
- mapproxy/image/tile.py +167 -0
- mapproxy/image/transform.py +350 -0
- mapproxy/layer.py +470 -0
- mapproxy/multiapp.py +231 -0
- mapproxy/proj.py +302 -0
- mapproxy/request/__init__.py +18 -0
- mapproxy/request/arcgis.py +259 -0
- mapproxy/request/base.py +476 -0
- mapproxy/request/tile.py +128 -0
- mapproxy/request/wms/__init__.py +793 -0
- mapproxy/request/wms/exception.py +99 -0
- mapproxy/request/wmts.py +436 -0
- mapproxy/response.py +237 -0
- mapproxy/script/__init__.py +0 -0
- mapproxy/script/conf/__init__.py +0 -0
- mapproxy/script/conf/app.py +195 -0
- mapproxy/script/conf/caches.py +45 -0
- mapproxy/script/conf/layers.py +54 -0
- mapproxy/script/conf/seeds.py +37 -0
- mapproxy/script/conf/sources.py +86 -0
- mapproxy/script/conf/utils.py +143 -0
- mapproxy/script/defrag.py +184 -0
- mapproxy/script/export.py +333 -0
- mapproxy/script/grids.py +188 -0
- mapproxy/script/scales.py +126 -0
- mapproxy/script/util.py +406 -0
- mapproxy/script/wms_capabilities.py +152 -0
- mapproxy/seed/__init__.py +0 -0
- mapproxy/seed/cachelock.py +121 -0
- mapproxy/seed/cleanup.py +187 -0
- mapproxy/seed/config.py +469 -0
- mapproxy/seed/script.py +388 -0
- mapproxy/seed/seeder.py +538 -0
- mapproxy/seed/spec.py +64 -0
- mapproxy/seed/util.py +254 -0
- mapproxy/service/__init__.py +14 -0
- mapproxy/service/base.py +46 -0
- mapproxy/service/demo.py +356 -0
- mapproxy/service/kml.py +331 -0
- mapproxy/service/ows.py +38 -0
- mapproxy/service/template_helper.py +53 -0
- mapproxy/service/templates/demo/capabilities_demo.html +16 -0
- mapproxy/service/templates/demo/demo.html +181 -0
- mapproxy/service/templates/demo/openlayers-demo.cfg +16 -0
- mapproxy/service/templates/demo/static/img/blank.gif +0 -0
- mapproxy/service/templates/demo/static/img/east-mini.png +0 -0
- mapproxy/service/templates/demo/static/img/north-mini.png +0 -0
- mapproxy/service/templates/demo/static/img/south-mini.png +0 -0
- mapproxy/service/templates/demo/static/img/west-mini.png +0 -0
- mapproxy/service/templates/demo/static/img/zoom-minus-mini.png +0 -0
- mapproxy/service/templates/demo/static/img/zoom-plus-mini.png +0 -0
- mapproxy/service/templates/demo/static/img/zoom-world-mini.png +0 -0
- mapproxy/service/templates/demo/static/logo.png +0 -0
- mapproxy/service/templates/demo/static/ol.css +345 -0
- mapproxy/service/templates/demo/static/ol.js +4 -0
- mapproxy/service/templates/demo/static/proj4.min.js +1 -0
- mapproxy/service/templates/demo/static/proj4defs.js +1 -0
- mapproxy/service/templates/demo/static/site.css +137 -0
- mapproxy/service/templates/demo/static/theme/default/framedCloud.css +0 -0
- mapproxy/service/templates/demo/static/theme/default/google.css +17 -0
- mapproxy/service/templates/demo/static/theme/default/ie6-style.css +10 -0
- mapproxy/service/templates/demo/static/theme/default/style.css +482 -0
- mapproxy/service/templates/demo/static.html +34 -0
- mapproxy/service/templates/demo/tms_demo.html +103 -0
- mapproxy/service/templates/demo/wms_demo.html +140 -0
- mapproxy/service/templates/demo/wmts_demo.html +110 -0
- mapproxy/service/templates/tms_capabilities.xml +13 -0
- mapproxy/service/templates/tms_exception.xml +4 -0
- mapproxy/service/templates/tms_root_resource.xml +7 -0
- mapproxy/service/templates/tms_tilemap_capabilities.xml +14 -0
- mapproxy/service/templates/wms100capabilities.xml +112 -0
- mapproxy/service/templates/wms100exception.xml +4 -0
- mapproxy/service/templates/wms110capabilities.xml +152 -0
- mapproxy/service/templates/wms110exception.xml +5 -0
- mapproxy/service/templates/wms111capabilities.xml +183 -0
- mapproxy/service/templates/wms111exception.xml +5 -0
- mapproxy/service/templates/wms130capabilities.xml +326 -0
- mapproxy/service/templates/wms130exception.xml +8 -0
- mapproxy/service/templates/wmts100capabilities.xml +155 -0
- mapproxy/service/templates/wmts100exception.xml +9 -0
- mapproxy/service/tile.py +536 -0
- mapproxy/service/wms.py +851 -0
- mapproxy/service/wmts.py +381 -0
- mapproxy/source/__init__.py +75 -0
- mapproxy/source/arcgis.py +39 -0
- mapproxy/source/error.py +39 -0
- mapproxy/source/mapnik.py +259 -0
- mapproxy/source/tile.py +96 -0
- mapproxy/source/wms.py +270 -0
- mapproxy/srs.py +726 -0
- mapproxy/template.py +54 -0
- mapproxy/test/__init__.py +0 -0
- mapproxy/test/conftest.py +7 -0
- mapproxy/test/helper.py +247 -0
- mapproxy/test/http.py +494 -0
- mapproxy/test/image.py +210 -0
- mapproxy/test/mocker.py +2268 -0
- mapproxy/test/schemas/inspire/common/1.0/common.xsd +1461 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_bul.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_cze.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_dan.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_dut.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_eng.xsd +155 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_est.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_fin.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_fre.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_ger.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_gle.xsd +109 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_gre.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_hun.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_ita.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_lav.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_lit.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_mlt.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_pol.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_por.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_rum.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_slo.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_slv.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_spa.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_swe.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/network.xsd +521 -0
- mapproxy/test/schemas/inspire/inspire_vs/1.0/inspire_vs.xsd +19 -0
- mapproxy/test/schemas/kml/2.2.0/ReadMe.txt +14 -0
- mapproxy/test/schemas/kml/2.2.0/atom-author-link.xsd +66 -0
- mapproxy/test/schemas/kml/2.2.0/ogckml22.xsd +1646 -0
- mapproxy/test/schemas/kml/2.2.0/xAL.xsd +1680 -0
- mapproxy/test/schemas/ows/1.1.0/ReadMe.txt +87 -0
- mapproxy/test/schemas/ows/1.1.0/ows19115subset.xsd +235 -0
- mapproxy/test/schemas/ows/1.1.0/owsAll.xsd +23 -0
- mapproxy/test/schemas/ows/1.1.0/owsCommon.xsd +157 -0
- mapproxy/test/schemas/ows/1.1.0/owsContents.xsd +86 -0
- mapproxy/test/schemas/ows/1.1.0/owsDataIdentification.xsd +127 -0
- mapproxy/test/schemas/ows/1.1.0/owsDomainType.xsd +279 -0
- mapproxy/test/schemas/ows/1.1.0/owsExceptionReport.xsd +76 -0
- mapproxy/test/schemas/ows/1.1.0/owsGetCapabilities.xsd +112 -0
- mapproxy/test/schemas/ows/1.1.0/owsGetResourceByID.xsd +51 -0
- mapproxy/test/schemas/ows/1.1.0/owsInputOutputData.xsd +59 -0
- mapproxy/test/schemas/ows/1.1.0/owsManifest.xsd +125 -0
- mapproxy/test/schemas/ows/1.1.0/owsOperationsMetadata.xsd +140 -0
- mapproxy/test/schemas/ows/1.1.0/owsServiceIdentification.xsd +60 -0
- mapproxy/test/schemas/ows/1.1.0/owsServiceProvider.xsd +47 -0
- mapproxy/test/schemas/sld/1.1.0/sld_capabilities.xsd +27 -0
- mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.dtd +353 -0
- mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.xml +188 -0
- mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.dtd +524 -0
- mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.xml +260 -0
- mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.dtd +273 -0
- mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.xml +303 -0
- mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.dtd +6 -0
- mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.xml +33 -0
- mapproxy/test/schemas/wms/1.1.1/OGC-exception.xsd +68 -0
- mapproxy/test/schemas/wms/1.1.1/WMS_DescribeLayerResponse.dtd +22 -0
- mapproxy/test/schemas/wms/1.1.1/WMS_MS_Capabilities.dtd +274 -0
- mapproxy/test/schemas/wms/1.1.1/WMS_exception_1_1_1.dtd +5 -0
- mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.dtd +276 -0
- mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.xml +303 -0
- mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.dtd +6 -0
- mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.xml +33 -0
- mapproxy/test/schemas/wms/1.3.0/ReadMe.txt +8 -0
- mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xml +277 -0
- mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xsd +611 -0
- mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xml +34 -0
- mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xsd +28 -0
- mapproxy/test/schemas/wmsc/1.1.1/OGC-exception.xsd +68 -0
- mapproxy/test/schemas/wmsc/1.1.1/WMS_DescribeLayerResponse.dtd +22 -0
- mapproxy/test/schemas/wmsc/1.1.1/WMS_MS_Capabilities.dtd +283 -0
- mapproxy/test/schemas/wmsc/1.1.1/WMS_exception_1_1_1.dtd +5 -0
- mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.dtd +276 -0
- mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.xml +303 -0
- mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.dtd +6 -0
- mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.xml +33 -0
- mapproxy/test/schemas/wmts/1.0/ReadMe.txt +32 -0
- mapproxy/test/schemas/wmts/1.0/wmts.xsd +28 -0
- mapproxy/test/schemas/wmts/1.0/wmtsAbstract.wsdl +151 -0
- mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_request.xsd +38 -0
- mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_response.xsd +564 -0
- mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_request.xsd +57 -0
- mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_response.xsd +72 -0
- mapproxy/test/schemas/wmts/1.0/wmtsGetTile_request.xsd +91 -0
- mapproxy/test/schemas/wmts/1.0/wmtsKVP.xsd +76 -0
- mapproxy/test/schemas/wmts/1.0/wmtsPayload_response.xsd +70 -0
- mapproxy/test/schemas/xlink/1.0.0/ReadMe.txt +6 -0
- mapproxy/test/schemas/xlink/1.0.0/xlinks.xsd +122 -0
- mapproxy/test/schemas/xml.xsd +287 -0
- mapproxy/test/system/__init__.py +98 -0
- mapproxy/test/system/fixture/arcgis.yaml +57 -0
- mapproxy/test/system/fixture/auth.yaml +70 -0
- mapproxy/test/system/fixture/cache.mbtiles +0 -0
- mapproxy/test/system/fixture/cache_azureblob.yaml +59 -0
- mapproxy/test/system/fixture/cache_band_merge.yaml +73 -0
- mapproxy/test/system/fixture/cache_bulk_meta_tiles.yaml +24 -0
- mapproxy/test/system/fixture/cache_data/dop_cache_EPSG3857/00/000/000/000/000/000/000.png +0 -0
- mapproxy/test/system/fixture/cache_data/wms_cache_EPSG900913/01/000/000/000/000/000/001.jpeg +0 -0
- mapproxy/test/system/fixture/cache_data/wms_cache_transparent_EPSG900913/01/000/000/000/000/000/001.png +0 -0
- mapproxy/test/system/fixture/cache_geopackage.yaml +56 -0
- mapproxy/test/system/fixture/cache_grid_names.yaml +50 -0
- mapproxy/test/system/fixture/cache_mbtiles.yaml +28 -0
- mapproxy/test/system/fixture/cache_s3.yaml +58 -0
- mapproxy/test/system/fixture/cache_source.yaml +81 -0
- mapproxy/test/system/fixture/combined_sources.yaml +130 -0
- mapproxy/test/system/fixture/coverage.yaml +77 -0
- mapproxy/test/system/fixture/demo.yaml +135 -0
- mapproxy/test/system/fixture/dimension.yaml +59 -0
- mapproxy/test/system/fixture/disable_storage.yaml +25 -0
- mapproxy/test/system/fixture/empty_ogrdata.geojson +1 -0
- mapproxy/test/system/fixture/formats.yaml +72 -0
- mapproxy/test/system/fixture/inspire.yaml +101 -0
- mapproxy/test/system/fixture/inspire_full.yaml +124 -0
- mapproxy/test/system/fixture/kml_layer.yaml +66 -0
- mapproxy/test/system/fixture/layer.yaml +260 -0
- mapproxy/test/system/fixture/layergroups.yaml +57 -0
- mapproxy/test/system/fixture/layergroups_root.yaml +106 -0
- mapproxy/test/system/fixture/legendgraphic.yaml +93 -0
- mapproxy/test/system/fixture/mapnik_source.yaml +66 -0
- mapproxy/test/system/fixture/mapproxy_export.yaml +12 -0
- mapproxy/test/system/fixture/mapserver.yaml +23 -0
- mapproxy/test/system/fixture/minimal_cgi.py +16 -0
- mapproxy/test/system/fixture/mixed_mode.yaml +49 -0
- mapproxy/test/system/fixture/multi_cache_layers.yaml +100 -0
- mapproxy/test/system/fixture/multiapp1.yaml +20 -0
- mapproxy/test/system/fixture/multiapp2.yaml +19 -0
- mapproxy/test/system/fixture/renderd_client.yaml +55 -0
- mapproxy/test/system/fixture/scalehints.yaml +70 -0
- mapproxy/test/system/fixture/seed.yaml +94 -0
- mapproxy/test/system/fixture/seed_mapproxy.yaml +39 -0
- mapproxy/test/system/fixture/seed_old.yaml +12 -0
- mapproxy/test/system/fixture/seed_timeouts.yaml +12 -0
- mapproxy/test/system/fixture/seed_timeouts_mapproxy.yaml +27 -0
- mapproxy/test/system/fixture/seedonly.yaml +51 -0
- mapproxy/test/system/fixture/sld.yaml +35 -0
- mapproxy/test/system/fixture/source_errors.yaml +84 -0
- mapproxy/test/system/fixture/source_errors_raise.yaml +82 -0
- mapproxy/test/system/fixture/tileservice_origin.yaml +26 -0
- mapproxy/test/system/fixture/tileservice_refresh.yaml +59 -0
- mapproxy/test/system/fixture/tilesource_minmax_res.yaml +22 -0
- mapproxy/test/system/fixture/util-conf-base-grids.yaml +5 -0
- mapproxy/test/system/fixture/util-conf-overwrite.yaml +13 -0
- mapproxy/test/system/fixture/util-conf-wms-111-cap.xml +90 -0
- mapproxy/test/system/fixture/util_grids.yaml +30 -0
- mapproxy/test/system/fixture/util_wms_capabilities111.xml +130 -0
- mapproxy/test/system/fixture/util_wms_capabilities130.xml +100 -0
- mapproxy/test/system/fixture/util_wms_capabilities_service_exception.xml +5 -0
- mapproxy/test/system/fixture/watermark.yaml +50 -0
- mapproxy/test/system/fixture/wms_srs_extent.yaml +39 -0
- mapproxy/test/system/fixture/wms_versions.yaml +38 -0
- mapproxy/test/system/fixture/wmts.yaml +134 -0
- mapproxy/test/system/fixture/wmts_dimensions.yaml +57 -0
- mapproxy/test/system/fixture/xslt_featureinfo.yaml +54 -0
- mapproxy/test/system/fixture/xslt_featureinfo_input.yaml +51 -0
- mapproxy/test/system/test_arcgis.py +156 -0
- mapproxy/test/system/test_auth.py +1134 -0
- mapproxy/test/system/test_behind_proxy.py +75 -0
- mapproxy/test/system/test_bulk_meta_tiles.py +106 -0
- mapproxy/test/system/test_cache_azureblob.py +127 -0
- mapproxy/test/system/test_cache_band_merge.py +103 -0
- mapproxy/test/system/test_cache_geopackage.py +144 -0
- mapproxy/test/system/test_cache_grid_names.py +89 -0
- mapproxy/test/system/test_cache_mbtiles.py +85 -0
- mapproxy/test/system/test_cache_s3.py +115 -0
- mapproxy/test/system/test_cache_source.py +146 -0
- mapproxy/test/system/test_combined_sources.py +335 -0
- mapproxy/test/system/test_coverage.py +140 -0
- mapproxy/test/system/test_decorate_img.py +214 -0
- mapproxy/test/system/test_demo.py +106 -0
- mapproxy/test/system/test_demo_with_extra_service.py +53 -0
- mapproxy/test/system/test_dimensions.py +278 -0
- mapproxy/test/system/test_disable_storage.py +42 -0
- mapproxy/test/system/test_formats.py +219 -0
- mapproxy/test/system/test_inspire_vs.py +173 -0
- mapproxy/test/system/test_kml.py +262 -0
- mapproxy/test/system/test_layergroups.py +160 -0
- mapproxy/test/system/test_legendgraphic.py +308 -0
- mapproxy/test/system/test_mapnik.py +161 -0
- mapproxy/test/system/test_mapserver.py +81 -0
- mapproxy/test/system/test_mixed_mode_format.py +195 -0
- mapproxy/test/system/test_multi_cache_layers.py +167 -0
- mapproxy/test/system/test_multiapp.py +92 -0
- mapproxy/test/system/test_refresh.py +207 -0
- mapproxy/test/system/test_renderd_client.py +304 -0
- mapproxy/test/system/test_response_headers.py +54 -0
- mapproxy/test/system/test_scalehints.py +140 -0
- mapproxy/test/system/test_seed.py +422 -0
- mapproxy/test/system/test_seed_only.py +93 -0
- mapproxy/test/system/test_sld.py +120 -0
- mapproxy/test/system/test_source_errors.py +377 -0
- mapproxy/test/system/test_tilesource_minmax_res.py +54 -0
- mapproxy/test/system/test_tms.py +276 -0
- mapproxy/test/system/test_tms_origin.py +46 -0
- mapproxy/test/system/test_util_conf.py +304 -0
- mapproxy/test/system/test_util_export.py +210 -0
- mapproxy/test/system/test_util_grids.py +88 -0
- mapproxy/test/system/test_util_wms_capabilities.py +182 -0
- mapproxy/test/system/test_watermark.py +91 -0
- mapproxy/test/system/test_wms.py +1611 -0
- mapproxy/test/system/test_wms_srs_extent.py +165 -0
- mapproxy/test/system/test_wms_version.py +85 -0
- mapproxy/test/system/test_wmsc.py +116 -0
- mapproxy/test/system/test_wmts.py +334 -0
- mapproxy/test/system/test_wmts_dimensions.py +206 -0
- mapproxy/test/system/test_wmts_restful.py +198 -0
- mapproxy/test/system/test_xslt_featureinfo.py +425 -0
- mapproxy/test/test_http_helper.py +219 -0
- mapproxy/test/unit/__init__.py +0 -0
- mapproxy/test/unit/epsg +2 -0
- mapproxy/test/unit/polygons/polygons.dbf +0 -0
- mapproxy/test/unit/polygons/polygons.shp +0 -0
- mapproxy/test/unit/polygons/polygons.shx +0 -0
- mapproxy/test/unit/test_async.py +245 -0
- mapproxy/test/unit/test_auth.py +419 -0
- mapproxy/test/unit/test_cache.py +1193 -0
- mapproxy/test/unit/test_cache_azureblob.py +94 -0
- mapproxy/test/unit/test_cache_compact.py +319 -0
- mapproxy/test/unit/test_cache_couchdb.py +114 -0
- mapproxy/test/unit/test_cache_geopackage.py +221 -0
- mapproxy/test/unit/test_cache_redis.py +67 -0
- mapproxy/test/unit/test_cache_riak.py +76 -0
- mapproxy/test/unit/test_cache_s3.py +84 -0
- mapproxy/test/unit/test_cache_tile.py +427 -0
- mapproxy/test/unit/test_client.py +479 -0
- mapproxy/test/unit/test_client_arcgis.py +73 -0
- mapproxy/test/unit/test_client_cgi.py +136 -0
- mapproxy/test/unit/test_collections.py +116 -0
- mapproxy/test/unit/test_concat_legends.py +37 -0
- mapproxy/test/unit/test_conf_loader.py +1061 -0
- mapproxy/test/unit/test_conf_validator.py +416 -0
- mapproxy/test/unit/test_config.py +117 -0
- mapproxy/test/unit/test_decorate_img.py +185 -0
- mapproxy/test/unit/test_exceptions.py +258 -0
- mapproxy/test/unit/test_featureinfo.py +291 -0
- mapproxy/test/unit/test_file_lock_load.py +49 -0
- mapproxy/test/unit/test_geom.py +503 -0
- mapproxy/test/unit/test_grid.py +1258 -0
- mapproxy/test/unit/test_image.py +1053 -0
- mapproxy/test/unit/test_image_mask.py +181 -0
- mapproxy/test/unit/test_image_messages.py +197 -0
- mapproxy/test/unit/test_image_options.py +160 -0
- mapproxy/test/unit/test_isodate.py +122 -0
- mapproxy/test/unit/test_multiapp.py +163 -0
- mapproxy/test/unit/test_ogr_reader.py +50 -0
- mapproxy/test/unit/test_request.py +745 -0
- mapproxy/test/unit/test_request_wmts.py +178 -0
- mapproxy/test/unit/test_response.py +79 -0
- mapproxy/test/unit/test_seed.py +365 -0
- mapproxy/test/unit/test_seed_cachelock.py +90 -0
- mapproxy/test/unit/test_srs.py +215 -0
- mapproxy/test/unit/test_tiled_source.py +122 -0
- mapproxy/test/unit/test_tilefilter.py +31 -0
- mapproxy/test/unit/test_times.py +25 -0
- mapproxy/test/unit/test_timeutils.py +50 -0
- mapproxy/test/unit/test_util_conf_utils.py +75 -0
- mapproxy/test/unit/test_utils.py +476 -0
- mapproxy/test/unit/test_wms_capabilities.py +44 -0
- mapproxy/test/unit/test_wms_layer.py +113 -0
- mapproxy/test/unit/test_yaml.py +69 -0
- mapproxy/tilefilter.py +59 -0
- mapproxy/util/__init__.py +0 -0
- mapproxy/util/async_.py +227 -0
- mapproxy/util/collections.py +132 -0
- mapproxy/util/coverage.py +329 -0
- mapproxy/util/escape.py +10 -0
- mapproxy/util/ext/__init__.py +14 -0
- mapproxy/util/ext/dictspec/__init__.py +1 -0
- mapproxy/util/ext/dictspec/spec.py +124 -0
- mapproxy/util/ext/dictspec/test/__init__.py +0 -0
- mapproxy/util/ext/dictspec/test/test_validator.py +274 -0
- mapproxy/util/ext/dictspec/validator.py +189 -0
- mapproxy/util/ext/local.py +196 -0
- mapproxy/util/ext/lockfile.py +138 -0
- mapproxy/util/ext/odict.py +330 -0
- mapproxy/util/ext/serving.py +508 -0
- mapproxy/util/ext/tempita/__init__.py +1174 -0
- mapproxy/util/ext/tempita/_looper.py +163 -0
- mapproxy/util/ext/tempita/compat3.py +46 -0
- mapproxy/util/ext/wmsparse/__init__.py +3 -0
- mapproxy/util/ext/wmsparse/duration.py +597 -0
- mapproxy/util/ext/wmsparse/parse.py +305 -0
- mapproxy/util/ext/wmsparse/test/__init__.py +0 -0
- mapproxy/util/ext/wmsparse/test/test_parse.py +162 -0
- mapproxy/util/ext/wmsparse/test/test_util.py +23 -0
- mapproxy/util/ext/wmsparse/test/wms-large-111.xml +2114 -0
- mapproxy/util/ext/wmsparse/test/wms-omniscale-111.xml +90 -0
- mapproxy/util/ext/wmsparse/test/wms-omniscale-130.xml +120 -0
- mapproxy/util/ext/wmsparse/test/wms_nasa_cap.xml +386 -0
- mapproxy/util/ext/wmsparse/util.py +187 -0
- mapproxy/util/fs.py +156 -0
- mapproxy/util/geom.py +295 -0
- mapproxy/util/lib.py +115 -0
- mapproxy/util/lock.py +163 -0
- mapproxy/util/ogr.py +231 -0
- mapproxy/util/py.py +81 -0
- mapproxy/util/times.py +75 -0
- mapproxy/util/yaml.py +56 -0
- mapproxy/version.py +31 -0
- mapproxy/wsgiapp.py +164 -0
- mapproxy-1.16.1.dist-info/METADATA +151 -0
- mapproxy-1.16.1.dist-info/RECORD +458 -0
- mapproxy-1.16.1.dist-info/WHEEL +5 -0
- mapproxy-1.16.1.dist-info/entry_points.txt +3 -0
- mapproxy-1.16.1.dist-info/licenses/AUTHORS.txt +33 -0
- mapproxy-1.16.1.dist-info/licenses/COPYING.txt +60 -0
- mapproxy-1.16.1.dist-info/licenses/LICENSE.txt +202 -0
- mapproxy-1.16.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Copyright (C) 2011 Omniscale <http://omniscale.de>
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
from __future__ import division
|
|
17
|
+
|
|
18
|
+
import os
|
|
19
|
+
import shutil
|
|
20
|
+
|
|
21
|
+
from io import BytesIO
|
|
22
|
+
|
|
23
|
+
from mapproxy.request.wms import WMS111MapRequest
|
|
24
|
+
from mapproxy.test.http import MockServ
|
|
25
|
+
from mapproxy.test.image import is_png, create_tmp_image
|
|
26
|
+
from mapproxy.test.system import SysTest
|
|
27
|
+
|
|
28
|
+
import pytest
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@pytest.fixture(scope="module")
|
|
32
|
+
def config_file():
|
|
33
|
+
return "cache_mbtiles.yaml"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@pytest.fixture(scope="class")
|
|
37
|
+
def fixture_gpkg(base_dir):
|
|
38
|
+
shutil.copy(
|
|
39
|
+
os.path.join(os.path.dirname(__file__), "fixture", "cache.mbtiles"),
|
|
40
|
+
base_dir.strpath,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@pytest.mark.usefixtures("fixture_gpkg")
|
|
45
|
+
class TestMBTilesCache(SysTest):
|
|
46
|
+
|
|
47
|
+
def setup(self):
|
|
48
|
+
self.common_map_req = WMS111MapRequest(
|
|
49
|
+
url="/service?",
|
|
50
|
+
param=dict(
|
|
51
|
+
service="WMS",
|
|
52
|
+
version="1.1.1",
|
|
53
|
+
bbox="-180,-80,0,0",
|
|
54
|
+
width="200",
|
|
55
|
+
height="200",
|
|
56
|
+
layers="mb",
|
|
57
|
+
srs="EPSG:4326",
|
|
58
|
+
format="image/png",
|
|
59
|
+
styles="",
|
|
60
|
+
request="GetMap",
|
|
61
|
+
),
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
def test_get_map_cached(self, app):
|
|
65
|
+
resp = app.get(self.common_map_req)
|
|
66
|
+
assert resp.content_type == "image/png"
|
|
67
|
+
data = BytesIO(resp.body)
|
|
68
|
+
assert is_png(data)
|
|
69
|
+
|
|
70
|
+
def test_get_map_uncached(self, app):
|
|
71
|
+
self.common_map_req.params.bbox = "-180,0,0,80"
|
|
72
|
+
serv = MockServ(port=42423)
|
|
73
|
+
serv.expects("/tiles/01/000/000/000/000/000/001.png")
|
|
74
|
+
serv.returns(create_tmp_image((256, 256)))
|
|
75
|
+
with serv:
|
|
76
|
+
resp = app.get(self.common_map_req)
|
|
77
|
+
assert resp.content_type == "image/png"
|
|
78
|
+
data = BytesIO(resp.body)
|
|
79
|
+
assert is_png(data)
|
|
80
|
+
|
|
81
|
+
# now cached
|
|
82
|
+
resp = app.get(self.common_map_req)
|
|
83
|
+
assert resp.content_type == "image/png"
|
|
84
|
+
data = BytesIO(resp.body)
|
|
85
|
+
assert is_png(data)
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Copyright (C) 2016 Omniscale <http://omniscale.de>
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
from __future__ import division
|
|
17
|
+
|
|
18
|
+
import sys
|
|
19
|
+
|
|
20
|
+
from io import BytesIO
|
|
21
|
+
|
|
22
|
+
from mapproxy.request.wms import WMS111MapRequest
|
|
23
|
+
from mapproxy.test.image import is_png, create_tmp_image
|
|
24
|
+
from mapproxy.test.system import SysTest
|
|
25
|
+
|
|
26
|
+
import pytest
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
try:
|
|
30
|
+
import boto3
|
|
31
|
+
from moto import mock_s3
|
|
32
|
+
except ImportError:
|
|
33
|
+
boto3 = None
|
|
34
|
+
mock_s3 = None
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@pytest.fixture(scope="module")
|
|
38
|
+
def config_file():
|
|
39
|
+
return "cache_s3.yaml"
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@pytest.fixture(scope="module")
|
|
43
|
+
def s3_buckets():
|
|
44
|
+
with mock_s3():
|
|
45
|
+
boto3.client("s3").create_bucket(Bucket="default_bucket")
|
|
46
|
+
boto3.client("s3").create_bucket(Bucket="tiles")
|
|
47
|
+
boto3.client("s3").create_bucket(Bucket="reversetiles")
|
|
48
|
+
|
|
49
|
+
yield
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@pytest.mark.skipif(not (boto3 and mock_s3), reason="boto3 and moto required")
|
|
53
|
+
@pytest.mark.xfail(
|
|
54
|
+
sys.version_info[:2] in ((3, 4), (3, 5)),
|
|
55
|
+
reason="moto tests unreliable with Python 3.4/3.5",
|
|
56
|
+
)
|
|
57
|
+
@pytest.mark.usefixtures("s3_buckets")
|
|
58
|
+
class TestS3Cache(SysTest):
|
|
59
|
+
|
|
60
|
+
def setup(self):
|
|
61
|
+
self.common_map_req = WMS111MapRequest(
|
|
62
|
+
url="/service?",
|
|
63
|
+
param=dict(
|
|
64
|
+
service="WMS",
|
|
65
|
+
version="1.1.1",
|
|
66
|
+
bbox="-150,-40,-140,-30",
|
|
67
|
+
width="100",
|
|
68
|
+
height="100",
|
|
69
|
+
layers="default",
|
|
70
|
+
srs="EPSG:4326",
|
|
71
|
+
format="image/png",
|
|
72
|
+
styles="",
|
|
73
|
+
request="GetMap",
|
|
74
|
+
),
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
def test_get_map_cached(self, app):
|
|
78
|
+
# mock_s3 interferes with MockServ, use boto to manually upload tile
|
|
79
|
+
tile = create_tmp_image((256, 256))
|
|
80
|
+
boto3.client("s3").upload_fileobj(
|
|
81
|
+
BytesIO(tile),
|
|
82
|
+
Bucket="default_bucket",
|
|
83
|
+
Key="default_cache/WebMerc/4/1/9.png",
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
resp = app.get(self.common_map_req)
|
|
87
|
+
assert resp.content_type == "image/png"
|
|
88
|
+
data = BytesIO(resp.body)
|
|
89
|
+
assert is_png(data)
|
|
90
|
+
|
|
91
|
+
def test_get_map_cached_quadkey(self, app):
|
|
92
|
+
# mock_s3 interferes with MockServ, use boto to manually upload tile
|
|
93
|
+
tile = create_tmp_image((256, 256))
|
|
94
|
+
boto3.client("s3").upload_fileobj(
|
|
95
|
+
BytesIO(tile), Bucket="tiles", Key="quadkeytiles/2003.png"
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
self.common_map_req.params.layers = "quadkey"
|
|
99
|
+
resp = app.get(self.common_map_req)
|
|
100
|
+
assert resp.content_type == "image/png"
|
|
101
|
+
data = BytesIO(resp.body)
|
|
102
|
+
assert is_png(data)
|
|
103
|
+
|
|
104
|
+
def test_get_map_cached_reverse_tms(self, app):
|
|
105
|
+
# mock_s3 interferes with MockServ, use boto to manually upload tile
|
|
106
|
+
tile = create_tmp_image((256, 256))
|
|
107
|
+
boto3.client("s3").upload_fileobj(
|
|
108
|
+
BytesIO(tile), Bucket="tiles", Key="reversetiles/9/1/4.png"
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
self.common_map_req.params.layers = "reverse"
|
|
112
|
+
resp = app.get(self.common_map_req)
|
|
113
|
+
assert resp.content_type == "image/png"
|
|
114
|
+
data = BytesIO(resp.body)
|
|
115
|
+
assert is_png(data)
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Copyright (C) 2012 Omniscale <http://omniscale.de>
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
import pytest
|
|
17
|
+
|
|
18
|
+
from mapproxy.request.wms import WMS111MapRequest
|
|
19
|
+
from mapproxy.test.image import tmp_image
|
|
20
|
+
from mapproxy.test.http import mock_httpd
|
|
21
|
+
from mapproxy.test.system import SysTest
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@pytest.fixture(scope="module")
|
|
25
|
+
def config_file():
|
|
26
|
+
return "cache_source.yaml"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class TestCacheSource(SysTest):
|
|
30
|
+
|
|
31
|
+
def test_tms_capabilities(self, app):
|
|
32
|
+
resp = app.get("/tms/1.0.0/")
|
|
33
|
+
assert "transformed tile source" in resp
|
|
34
|
+
xml = resp.lxml
|
|
35
|
+
|
|
36
|
+
assert xml.xpath("count(//TileMap)") == 3
|
|
37
|
+
|
|
38
|
+
def test_get_map_through_cache(self, app):
|
|
39
|
+
map_req = WMS111MapRequest(
|
|
40
|
+
url="/service?",
|
|
41
|
+
param=dict(
|
|
42
|
+
service="WMS",
|
|
43
|
+
version="1.1.1",
|
|
44
|
+
width="100",
|
|
45
|
+
height="100",
|
|
46
|
+
bbox="432890.564641,5872387.45834,466833.867667,5928359.08814",
|
|
47
|
+
layers="tms_transf",
|
|
48
|
+
srs="EPSG:25832",
|
|
49
|
+
format="image/png",
|
|
50
|
+
styles="",
|
|
51
|
+
request="GetMap",
|
|
52
|
+
),
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
expected_reqs = []
|
|
56
|
+
with tmp_image((256, 256), format="jpeg") as img:
|
|
57
|
+
img = img.read()
|
|
58
|
+
# tms_cache_out has meta_size of [2, 2] but we need larger extent for transformation
|
|
59
|
+
for tile in [
|
|
60
|
+
(132, 172, 8),
|
|
61
|
+
(133, 172, 8),
|
|
62
|
+
(134, 172, 8),
|
|
63
|
+
(132, 173, 8),
|
|
64
|
+
(133, 173, 8),
|
|
65
|
+
(134, 173, 8),
|
|
66
|
+
(132, 174, 8),
|
|
67
|
+
(133, 174, 8),
|
|
68
|
+
(134, 174, 8),
|
|
69
|
+
]:
|
|
70
|
+
expected_reqs.append(
|
|
71
|
+
(
|
|
72
|
+
{
|
|
73
|
+
"path": r"/tiles/%02d/000/000/%03d/000/000/%03d.png"
|
|
74
|
+
% (tile[2], tile[0], tile[1])
|
|
75
|
+
},
|
|
76
|
+
{"body": img, "headers": {"content-type": "image/png"}},
|
|
77
|
+
)
|
|
78
|
+
)
|
|
79
|
+
with mock_httpd(("localhost", 42423), expected_reqs, unordered=True):
|
|
80
|
+
resp = app.get(map_req)
|
|
81
|
+
assert resp.content_type == "image/png"
|
|
82
|
+
|
|
83
|
+
def test_get_tile_through_cache(self, app, cache_dir):
|
|
84
|
+
# request tile from tms_transf,
|
|
85
|
+
# should get tile from tms_source via tms_cache_in/out
|
|
86
|
+
expected_reqs = []
|
|
87
|
+
with tmp_image((256, 256), format="jpeg") as img:
|
|
88
|
+
for tile in [(8, 11, 4), (8, 10, 4)]:
|
|
89
|
+
expected_reqs.append(
|
|
90
|
+
(
|
|
91
|
+
{
|
|
92
|
+
"path": r"/tiles/%02d/000/000/%03d/000/000/%03d.png"
|
|
93
|
+
% (tile[2], tile[0], tile[1])
|
|
94
|
+
},
|
|
95
|
+
{"body": img.read(), "headers": {"content-type": "image/png"}},
|
|
96
|
+
)
|
|
97
|
+
)
|
|
98
|
+
with mock_httpd(("localhost", 42423), expected_reqs, unordered=True):
|
|
99
|
+
resp = app.get("/tms/1.0.0/tms_transf/EPSG25832/0/0/0.png")
|
|
100
|
+
assert resp.content_type == "image/png"
|
|
101
|
+
|
|
102
|
+
assert cache_dir.join(
|
|
103
|
+
"tms_cache_out_EPSG25832/00/000/000/000/000/000/000.png"
|
|
104
|
+
).check()
|
|
105
|
+
|
|
106
|
+
def test_get_tile_from_sub_grid(self, app, cache_dir):
|
|
107
|
+
# create tile in old cache
|
|
108
|
+
tile_filename = cache_dir.join(
|
|
109
|
+
"old_cache_EPSG3857/01/000/000/001/000/000/000.png"
|
|
110
|
+
)
|
|
111
|
+
# use text to check that mapproxy does not access the tile as image
|
|
112
|
+
tile_filename.write_binary(b"foo", ensure=True)
|
|
113
|
+
|
|
114
|
+
# access new cache, should get existing tile from old cache
|
|
115
|
+
resp = app.get("/tiles/new_cache_EPSG3857/0/0/0.png")
|
|
116
|
+
assert resp.content_type == "image/png"
|
|
117
|
+
assert resp.body == b"foo"
|
|
118
|
+
|
|
119
|
+
assert cache_dir.join(
|
|
120
|
+
"old_cache_EPSG3857/01/000/000/001/000/000/000.png"
|
|
121
|
+
).check()
|
|
122
|
+
assert cache_dir.join(
|
|
123
|
+
"new_cache_EPSG3857/00/000/000/000/000/000/000.png"
|
|
124
|
+
).check()
|
|
125
|
+
|
|
126
|
+
def test_get_tile_combined_cache(self, app):
|
|
127
|
+
# request from cache with two cache sources where only one
|
|
128
|
+
# is compatible (supports tiled_only)
|
|
129
|
+
expected_reqs = []
|
|
130
|
+
with tmp_image((256, 256), format="jpeg") as img:
|
|
131
|
+
img = img.read()
|
|
132
|
+
for tile in [
|
|
133
|
+
r"/tiles/04/000/000/008/000/000/011.png",
|
|
134
|
+
r"/tiles/04/000/000/008/000/000/010.png",
|
|
135
|
+
r"/tiles/utm/00/000/000/000/000/000/000.png",
|
|
136
|
+
]:
|
|
137
|
+
expected_reqs.append(
|
|
138
|
+
(
|
|
139
|
+
{"path": tile},
|
|
140
|
+
{"body": img, "headers": {"content-type": "image/png"}},
|
|
141
|
+
)
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
with mock_httpd(("localhost", 42423), expected_reqs, unordered=True):
|
|
145
|
+
resp = app.get("/tms/1.0.0/combined/EPSG25832/0/0/0.png")
|
|
146
|
+
assert resp.content_type == "image/png"
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Copyright (C) 2010 Omniscale <http://omniscale.de>
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
from __future__ import division
|
|
17
|
+
|
|
18
|
+
from io import BytesIO
|
|
19
|
+
|
|
20
|
+
import pytest
|
|
21
|
+
|
|
22
|
+
from mapproxy.request.wms import WMS111MapRequest
|
|
23
|
+
from mapproxy.compat.image import Image
|
|
24
|
+
from mapproxy.test.image import is_png, tmp_image, create_tmp_image
|
|
25
|
+
from mapproxy.test.http import mock_httpd
|
|
26
|
+
from mapproxy.test.system import SysTest
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@pytest.fixture(scope="module")
|
|
30
|
+
def config_file():
|
|
31
|
+
return "combined_sources.yaml"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class TestCoverageWMS(SysTest):
|
|
35
|
+
|
|
36
|
+
def setup(self):
|
|
37
|
+
self.common_map_req = WMS111MapRequest(
|
|
38
|
+
url="/service?",
|
|
39
|
+
param=dict(
|
|
40
|
+
service="WMS",
|
|
41
|
+
version="1.1.1",
|
|
42
|
+
bbox="9,50,10,51",
|
|
43
|
+
width="200",
|
|
44
|
+
height="200",
|
|
45
|
+
layers="combinable",
|
|
46
|
+
srs="EPSG:4326",
|
|
47
|
+
format="image/png",
|
|
48
|
+
styles="",
|
|
49
|
+
request="GetMap",
|
|
50
|
+
),
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
def test_combined(self, app):
|
|
54
|
+
common_params = (
|
|
55
|
+
r"?SERVICE=WMS&FORMAT=image%2Fpng"
|
|
56
|
+
"&REQUEST=GetMap&HEIGHT=200&SRS=EPSG%3A4326&styles="
|
|
57
|
+
"&VERSION=1.1.1&BBOX=9.0,50.0,10.0,51.0"
|
|
58
|
+
"&WIDTH=200&transparent=True"
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
with tmp_image((200, 200), format="png") as img:
|
|
62
|
+
img = img.read()
|
|
63
|
+
expected_req = [
|
|
64
|
+
(
|
|
65
|
+
{
|
|
66
|
+
"path": "/service_a"
|
|
67
|
+
+ common_params
|
|
68
|
+
+ "&layers=a_one,a_two,a_three,a_four"
|
|
69
|
+
},
|
|
70
|
+
{"body": img, "headers": {"content-type": "image/png"}},
|
|
71
|
+
),
|
|
72
|
+
(
|
|
73
|
+
{"path": "/service_b" + common_params + "&layers=b_one"},
|
|
74
|
+
{"body": img, "headers": {"content-type": "image/png"}},
|
|
75
|
+
),
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
with mock_httpd(("localhost", 42423), expected_req):
|
|
79
|
+
self.common_map_req.params.layers = "combinable"
|
|
80
|
+
resp = app.get(self.common_map_req)
|
|
81
|
+
assert resp.content_type == "image/png"
|
|
82
|
+
data = BytesIO(resp.body)
|
|
83
|
+
assert is_png(data)
|
|
84
|
+
|
|
85
|
+
def test_uncombined(self, app):
|
|
86
|
+
common_params = (
|
|
87
|
+
r"?SERVICE=WMS&FORMAT=image%2Fpng"
|
|
88
|
+
"&REQUEST=GetMap&HEIGHT=200&SRS=EPSG%3A4326&styles="
|
|
89
|
+
"&VERSION=1.1.1&BBOX=9.0,50.0,10.0,51.0"
|
|
90
|
+
"&WIDTH=200&transparent=True"
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
with tmp_image((200, 200), format="png") as img:
|
|
94
|
+
img = img.read()
|
|
95
|
+
expected_req = [
|
|
96
|
+
(
|
|
97
|
+
{"path": "/service_a" + common_params + "&layers=a_one"},
|
|
98
|
+
{"body": img, "headers": {"content-type": "image/png"}},
|
|
99
|
+
),
|
|
100
|
+
(
|
|
101
|
+
{"path": "/service_b" + common_params + "&layers=b_one"},
|
|
102
|
+
{"body": img, "headers": {"content-type": "image/png"}},
|
|
103
|
+
),
|
|
104
|
+
(
|
|
105
|
+
{"path": "/service_a" + common_params + "&layers=a_two,a_three"},
|
|
106
|
+
{"body": img, "headers": {"content-type": "image/png"}},
|
|
107
|
+
),
|
|
108
|
+
]
|
|
109
|
+
|
|
110
|
+
with mock_httpd(("localhost", 42423), expected_req):
|
|
111
|
+
self.common_map_req.params.layers = "uncombinable"
|
|
112
|
+
resp = app.get(self.common_map_req)
|
|
113
|
+
assert resp.content_type == "image/png"
|
|
114
|
+
data = BytesIO(resp.body)
|
|
115
|
+
assert is_png(data)
|
|
116
|
+
|
|
117
|
+
def test_combined_layers(self, app):
|
|
118
|
+
common_params = (
|
|
119
|
+
r"?SERVICE=WMS&FORMAT=image%2Fpng"
|
|
120
|
+
"&REQUEST=GetMap&HEIGHT=200&SRS=EPSG%3A4326&styles="
|
|
121
|
+
"&VERSION=1.1.1&BBOX=9.0,50.0,10.0,51.0"
|
|
122
|
+
"&WIDTH=200&transparent=True"
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
with tmp_image((200, 200), format="png") as img:
|
|
126
|
+
img = img.read()
|
|
127
|
+
expected_req = [
|
|
128
|
+
(
|
|
129
|
+
{"path": "/service_a" + common_params + "&layers=a_one"},
|
|
130
|
+
{"body": img, "headers": {"content-type": "image/png"}},
|
|
131
|
+
),
|
|
132
|
+
(
|
|
133
|
+
{"path": "/service_b" + common_params + "&layers=b_one"},
|
|
134
|
+
{"body": img, "headers": {"content-type": "image/png"}},
|
|
135
|
+
),
|
|
136
|
+
(
|
|
137
|
+
{
|
|
138
|
+
"path": "/service_a"
|
|
139
|
+
+ common_params
|
|
140
|
+
+ "&layers=a_two,a_three,a_four"
|
|
141
|
+
},
|
|
142
|
+
{"body": img, "headers": {"content-type": "image/png"}},
|
|
143
|
+
),
|
|
144
|
+
]
|
|
145
|
+
|
|
146
|
+
with mock_httpd(("localhost", 42423), expected_req):
|
|
147
|
+
self.common_map_req.params.layers = "uncombinable,single"
|
|
148
|
+
resp = app.get(self.common_map_req)
|
|
149
|
+
assert resp.content_type == "image/png"
|
|
150
|
+
data = BytesIO(resp.body)
|
|
151
|
+
assert is_png(data)
|
|
152
|
+
|
|
153
|
+
def test_layers_with_opacity(self, app):
|
|
154
|
+
# overlay with opacity -> request should not be combined
|
|
155
|
+
common_params = (
|
|
156
|
+
r"?SERVICE=WMS&FORMAT=image%2Fpng"
|
|
157
|
+
"&REQUEST=GetMap&HEIGHT=200&SRS=EPSG%3A4326&styles="
|
|
158
|
+
"&VERSION=1.1.1&BBOX=9.0,50.0,10.0,51.0"
|
|
159
|
+
"&WIDTH=200"
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
img_bg = create_tmp_image((200, 200), color=(0, 0, 0))
|
|
163
|
+
img_fg = create_tmp_image((200, 200), color=(255, 0, 128))
|
|
164
|
+
|
|
165
|
+
expected_req = [
|
|
166
|
+
(
|
|
167
|
+
{"path": "/service_a" + common_params + "&layers=a_one"},
|
|
168
|
+
{"body": img_bg, "headers": {"content-type": "image/png"}},
|
|
169
|
+
),
|
|
170
|
+
(
|
|
171
|
+
{"path": "/service_a" + common_params + "&layers=a_two"},
|
|
172
|
+
{"body": img_fg, "headers": {"content-type": "image/png"}},
|
|
173
|
+
),
|
|
174
|
+
]
|
|
175
|
+
|
|
176
|
+
with mock_httpd(("localhost", 42423), expected_req):
|
|
177
|
+
self.common_map_req.params.layers = "opacity_base,opacity_overlay"
|
|
178
|
+
resp = app.get(self.common_map_req)
|
|
179
|
+
assert resp.content_type == "image/png"
|
|
180
|
+
data = BytesIO(resp.body)
|
|
181
|
+
assert is_png(data)
|
|
182
|
+
img = Image.open(data)
|
|
183
|
+
assert img.getcolors()[0] == ((200 * 200), (127, 0, 64))
|
|
184
|
+
|
|
185
|
+
def test_combined_transp_color(self, app):
|
|
186
|
+
# merged to one request because both layers share the same transparent_color
|
|
187
|
+
common_params = (
|
|
188
|
+
r"?SERVICE=WMS&FORMAT=image%2Fpng"
|
|
189
|
+
"&REQUEST=GetMap&HEIGHT=200&SRS=EPSG%3A4326&styles="
|
|
190
|
+
"&VERSION=1.1.1&BBOX=9.0,50.0,10.0,51.0"
|
|
191
|
+
"&WIDTH=200&transparent=True"
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
with tmp_image((200, 200), color=(255, 0, 0), format="png") as img:
|
|
195
|
+
img = img.read()
|
|
196
|
+
expected_req = [
|
|
197
|
+
(
|
|
198
|
+
{
|
|
199
|
+
"path": "/service_a"
|
|
200
|
+
+ common_params
|
|
201
|
+
+ "&layers=a_iopts_one,a_iopts_two"
|
|
202
|
+
},
|
|
203
|
+
{"body": img, "headers": {"content-type": "image/png"}},
|
|
204
|
+
)
|
|
205
|
+
]
|
|
206
|
+
|
|
207
|
+
with mock_httpd(("localhost", 42423), expected_req):
|
|
208
|
+
self.common_map_req.params.layers = (
|
|
209
|
+
"layer_image_opts1,layer_image_opts2"
|
|
210
|
+
)
|
|
211
|
+
self.common_map_req.params.transparent = True
|
|
212
|
+
resp = app.get(self.common_map_req)
|
|
213
|
+
resp.content_type = "image/png"
|
|
214
|
+
data = BytesIO(resp.body)
|
|
215
|
+
assert is_png(data)
|
|
216
|
+
img = Image.open(data)
|
|
217
|
+
assert img.getcolors()[0] == ((200 * 200), (255, 0, 0, 0))
|
|
218
|
+
|
|
219
|
+
def test_combined_mixed_transp_color(self, app):
|
|
220
|
+
# not merged to one request because only one layer has transparent_color
|
|
221
|
+
common_params = (
|
|
222
|
+
r"?SERVICE=WMS&FORMAT=image%2Fpng"
|
|
223
|
+
"&REQUEST=GetMap&HEIGHT=200&SRS=EPSG%3A4326&styles="
|
|
224
|
+
"&VERSION=1.1.1&BBOX=9.0,50.0,10.0,51.0"
|
|
225
|
+
"&WIDTH=200&transparent=True"
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
with tmp_image((200, 200), color=(255, 0, 0), format="png") as img:
|
|
229
|
+
img = img.read()
|
|
230
|
+
expected_req = [
|
|
231
|
+
(
|
|
232
|
+
{"path": "/service_a" + common_params + "&layers=a_four"},
|
|
233
|
+
{"body": img, "headers": {"content-type": "image/png"}},
|
|
234
|
+
),
|
|
235
|
+
(
|
|
236
|
+
{"path": "/service_a" + common_params + "&layers=a_iopts_one"},
|
|
237
|
+
{"body": img, "headers": {"content-type": "image/png"}},
|
|
238
|
+
),
|
|
239
|
+
]
|
|
240
|
+
|
|
241
|
+
with mock_httpd(("localhost", 42423), expected_req):
|
|
242
|
+
self.common_map_req.params.layers = "single,layer_image_opts1"
|
|
243
|
+
self.common_map_req.params.transparent = True
|
|
244
|
+
resp = app.get(self.common_map_req)
|
|
245
|
+
resp.content_type = "image/png"
|
|
246
|
+
data = BytesIO(resp.body)
|
|
247
|
+
assert is_png(data)
|
|
248
|
+
|
|
249
|
+
def test_combined_same_fwd_req_params(self, app):
|
|
250
|
+
# merged to one request because all layers share the same time param in
|
|
251
|
+
# fwd_req_params config
|
|
252
|
+
with tmp_image((200, 200), format="png") as img:
|
|
253
|
+
img = img.read()
|
|
254
|
+
expected_req = [
|
|
255
|
+
(
|
|
256
|
+
{
|
|
257
|
+
"path": "/service_a?SERVICE=WMS&FORMAT=image%2Fpng"
|
|
258
|
+
"&REQUEST=GetMap&HEIGHT=200&SRS=EPSG%3A4326&styles="
|
|
259
|
+
"&VERSION=1.1.1&BBOX=9.0,50.0,10.0,51.0"
|
|
260
|
+
"&WIDTH=200&transparent=True&TIME=20041012"
|
|
261
|
+
"&layers=a_one,a_two,a_three,a_four"
|
|
262
|
+
},
|
|
263
|
+
{"body": img, "headers": {"content-type": "image/png"}},
|
|
264
|
+
)
|
|
265
|
+
]
|
|
266
|
+
|
|
267
|
+
with mock_httpd(("localhost", 42423), expected_req):
|
|
268
|
+
self.common_map_req.params.layers = "layer_fwdparams1,layer_fwdparams2"
|
|
269
|
+
self.common_map_req.params["time"] = "20041012"
|
|
270
|
+
self.common_map_req.params.transparent = True
|
|
271
|
+
resp = app.get(self.common_map_req)
|
|
272
|
+
resp.content_type = "image/png"
|
|
273
|
+
data = BytesIO(resp.body)
|
|
274
|
+
assert is_png(data)
|
|
275
|
+
|
|
276
|
+
def test_combined_no_fwd_req_params(self, app):
|
|
277
|
+
# merged to one request because no vendor param is set
|
|
278
|
+
with tmp_image((200, 200), format="png") as img:
|
|
279
|
+
img = img.read()
|
|
280
|
+
expected_req = [
|
|
281
|
+
(
|
|
282
|
+
{
|
|
283
|
+
"path": "/service_a?SERVICE=WMS&FORMAT=image%2Fpng"
|
|
284
|
+
"&REQUEST=GetMap&HEIGHT=200&SRS=EPSG%3A4326&styles="
|
|
285
|
+
"&VERSION=1.1.1&BBOX=9.0,50.0,10.0,51.0"
|
|
286
|
+
"&WIDTH=200&transparent=True"
|
|
287
|
+
"&layers=a_one,a_two,a_four"
|
|
288
|
+
},
|
|
289
|
+
{"body": img, "headers": {"content-type": "image/png"}},
|
|
290
|
+
)
|
|
291
|
+
]
|
|
292
|
+
|
|
293
|
+
with mock_httpd(("localhost", 42423), expected_req):
|
|
294
|
+
self.common_map_req.params.layers = "layer_fwdparams1,single"
|
|
295
|
+
self.common_map_req.params.transparent = True
|
|
296
|
+
resp = app.get(self.common_map_req)
|
|
297
|
+
resp.content_type = "image/png"
|
|
298
|
+
data = BytesIO(resp.body)
|
|
299
|
+
assert is_png(data)
|
|
300
|
+
|
|
301
|
+
def test_combined_mixed_fwd_req_params(self, app):
|
|
302
|
+
# not merged to one request because fwd_req_params are different
|
|
303
|
+
common_params = (
|
|
304
|
+
r"/service_a?SERVICE=WMS&FORMAT=image%2Fpng"
|
|
305
|
+
"&REQUEST=GetMap&HEIGHT=200&SRS=EPSG%3A4326&styles="
|
|
306
|
+
"&VERSION=1.1.1&BBOX=9.0,50.0,10.0,51.0"
|
|
307
|
+
"&WIDTH=200&transparent=True"
|
|
308
|
+
)
|
|
309
|
+
|
|
310
|
+
with tmp_image((200, 200), format="png") as img:
|
|
311
|
+
img = img.read()
|
|
312
|
+
expected_req = [
|
|
313
|
+
(
|
|
314
|
+
{"path": common_params + "&layers=a_one&TIME=20041012"},
|
|
315
|
+
{"body": img, "headers": {"content-type": "image/png"}},
|
|
316
|
+
),
|
|
317
|
+
(
|
|
318
|
+
{"path": common_params + "&layers=a_two&TIME=20041012&VENDOR=foo"},
|
|
319
|
+
{"body": img, "headers": {"content-type": "image/png"}},
|
|
320
|
+
),
|
|
321
|
+
(
|
|
322
|
+
{"path": common_params + "&layers=a_four"},
|
|
323
|
+
{"body": img, "headers": {"content-type": "image/png"}},
|
|
324
|
+
),
|
|
325
|
+
]
|
|
326
|
+
|
|
327
|
+
with mock_httpd(("localhost", 42423), expected_req):
|
|
328
|
+
self.common_map_req.params.layers = "layer_fwdparams1,single"
|
|
329
|
+
self.common_map_req.params["time"] = "20041012"
|
|
330
|
+
self.common_map_req.params["vendor"] = "foo"
|
|
331
|
+
self.common_map_req.params.transparent = True
|
|
332
|
+
resp = app.get(self.common_map_req)
|
|
333
|
+
resp.content_type = "image/png"
|
|
334
|
+
data = BytesIO(resp.body)
|
|
335
|
+
assert is_png(data)
|