MapProxy 2.1.0__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-2.1.0.dist-info/AUTHORS.txt +33 -0
- MapProxy-2.1.0.dist-info/COPYING.txt +60 -0
- MapProxy-2.1.0.dist-info/LICENSE.txt +202 -0
- MapProxy-2.1.0.dist-info/METADATA +165 -0
- MapProxy-2.1.0.dist-info/RECORD +459 -0
- MapProxy-2.1.0.dist-info/WHEEL +5 -0
- MapProxy-2.1.0.dist-info/entry_points.txt +4 -0
- MapProxy-2.1.0.dist-info/top_level.txt +1 -0
- mapproxy/__init__.py +0 -0
- mapproxy/cache/__init__.py +36 -0
- mapproxy/cache/azureblob.py +145 -0
- mapproxy/cache/base.py +120 -0
- mapproxy/cache/compact.py +665 -0
- mapproxy/cache/couchdb.py +301 -0
- mapproxy/cache/dummy.py +36 -0
- mapproxy/cache/file.py +200 -0
- mapproxy/cache/geopackage.py +647 -0
- mapproxy/cache/legend.py +87 -0
- mapproxy/cache/mbtiles.py +411 -0
- mapproxy/cache/meta.py +80 -0
- mapproxy/cache/path.py +261 -0
- mapproxy/cache/redis.py +152 -0
- mapproxy/cache/renderd.py +100 -0
- mapproxy/cache/riak.py +206 -0
- mapproxy/cache/s3.py +209 -0
- mapproxy/cache/tile.py +736 -0
- mapproxy/client/__init__.py +0 -0
- mapproxy/client/arcgis.py +82 -0
- mapproxy/client/cgi.py +141 -0
- mapproxy/client/http.py +295 -0
- mapproxy/client/log.py +33 -0
- mapproxy/client/tile.py +158 -0
- mapproxy/client/wms.py +255 -0
- mapproxy/compat/__init__.py +0 -0
- mapproxy/compat/image.py +86 -0
- mapproxy/config/__init__.py +22 -0
- mapproxy/config/config-schema.json +813 -0
- mapproxy/config/config.py +213 -0
- mapproxy/config/coverage.py +108 -0
- mapproxy/config/defaults.py +102 -0
- mapproxy/config/loader.py +2399 -0
- mapproxy/config/spec.py +657 -0
- mapproxy/config/validator.py +242 -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 +598 -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 +149 -0
- mapproxy/featureinfo.py +251 -0
- mapproxy/grid.py +1199 -0
- mapproxy/image/__init__.py +549 -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 +79 -0
- mapproxy/image/merge.py +323 -0
- mapproxy/image/message.py +357 -0
- mapproxy/image/opts.py +185 -0
- mapproxy/image/tile.py +171 -0
- mapproxy/image/transform.py +350 -0
- mapproxy/layer.py +489 -0
- mapproxy/multiapp.py +230 -0
- mapproxy/proj.py +309 -0
- mapproxy/request/__init__.py +18 -0
- mapproxy/request/arcgis.py +268 -0
- mapproxy/request/base.py +466 -0
- mapproxy/request/tile.py +131 -0
- mapproxy/request/wms/__init__.py +829 -0
- mapproxy/request/wms/exception.py +107 -0
- mapproxy/request/wmts.py +442 -0
- mapproxy/response.py +237 -0
- mapproxy/script/__init__.py +0 -0
- mapproxy/script/conf/__init__.py +0 -0
- mapproxy/script/conf/app.py +222 -0
- mapproxy/script/conf/caches.py +44 -0
- mapproxy/script/conf/geopackage.py +136 -0
- mapproxy/script/conf/layers.py +54 -0
- mapproxy/script/conf/seeds.py +36 -0
- mapproxy/script/conf/sources.py +88 -0
- mapproxy/script/conf/utils.py +148 -0
- mapproxy/script/defrag.py +187 -0
- mapproxy/script/export.py +337 -0
- mapproxy/script/grids.py +198 -0
- mapproxy/script/scales.py +134 -0
- mapproxy/script/util.py +410 -0
- mapproxy/script/wms_capabilities.py +160 -0
- mapproxy/seed/__init__.py +0 -0
- mapproxy/seed/cachelock.py +127 -0
- mapproxy/seed/cleanup.py +191 -0
- mapproxy/seed/config.py +481 -0
- mapproxy/seed/script.py +391 -0
- mapproxy/seed/seeder.py +551 -0
- mapproxy/seed/spec.py +66 -0
- mapproxy/seed/util.py +266 -0
- mapproxy/service/__init__.py +14 -0
- mapproxy/service/base.py +45 -0
- mapproxy/service/demo.py +364 -0
- mapproxy/service/kml.py +333 -0
- mapproxy/service/ows.py +39 -0
- mapproxy/service/template_helper.py +55 -0
- mapproxy/service/templates/demo/capabilities_demo.html +18 -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 +117 -0
- mapproxy/service/templates/demo/wms_demo.html +144 -0
- mapproxy/service/templates/demo/wmts_demo.html +118 -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 +540 -0
- mapproxy/service/wms.py +868 -0
- mapproxy/service/wmts.py +387 -0
- mapproxy/source/__init__.py +83 -0
- mapproxy/source/arcgis.py +39 -0
- mapproxy/source/error.py +40 -0
- mapproxy/source/mapnik.py +262 -0
- mapproxy/source/tile.py +97 -0
- mapproxy/source/wms.py +273 -0
- mapproxy/srs.py +734 -0
- mapproxy/template.py +54 -0
- mapproxy/test/__init__.py +0 -0
- mapproxy/test/conftest.py +8 -0
- mapproxy/test/helper.py +255 -0
- mapproxy/test/http.py +511 -0
- mapproxy/test/image.py +219 -0
- mapproxy/test/mocker.py +2291 -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_coverage.yaml +84 -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 +111 -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 +29 -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 +1133 -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_coverage.py +168 -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 +56 -0
- mapproxy/test/system/test_demo_with_extra_service.py +57 -0
- mapproxy/test/system/test_dimensions.py +279 -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 +264 -0
- mapproxy/test/system/test_layergroups.py +160 -0
- mapproxy/test/system/test_legendgraphic.py +308 -0
- mapproxy/test/system/test_mapnik.py +162 -0
- mapproxy/test/system/test_mapserver.py +83 -0
- mapproxy/test/system/test_mixed_mode_format.py +201 -0
- mapproxy/test/system/test_multi_cache_layers.py +169 -0
- mapproxy/test/system/test_multiapp.py +92 -0
- mapproxy/test/system/test_refresh.py +206 -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 +425 -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 +277 -0
- mapproxy/test/system/test_tms_origin.py +46 -0
- mapproxy/test/system/test_util_conf.py +434 -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 +1616 -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 +423 -0
- mapproxy/test/test_http_helper.py +217 -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 +242 -0
- mapproxy/test/unit/test_auth.py +430 -0
- mapproxy/test/unit/test_cache.py +1356 -0
- mapproxy/test/unit/test_cache_azureblob.py +97 -0
- mapproxy/test/unit/test_cache_compact.py +324 -0
- mapproxy/test/unit/test_cache_couchdb.py +118 -0
- mapproxy/test/unit/test_cache_geopackage.py +256 -0
- mapproxy/test/unit/test_cache_redis.py +123 -0
- mapproxy/test/unit/test_cache_riak.py +80 -0
- mapproxy/test/unit/test_cache_s3.py +93 -0
- mapproxy/test/unit/test_cache_tile.py +477 -0
- mapproxy/test/unit/test_client.py +488 -0
- mapproxy/test/unit/test_client_arcgis.py +74 -0
- mapproxy/test/unit/test_client_cgi.py +140 -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 +1267 -0
- mapproxy/test/unit/test_conf_validator.py +427 -0
- mapproxy/test/unit/test_config.py +118 -0
- mapproxy/test/unit/test_decorate_img.py +185 -0
- mapproxy/test/unit/test_exceptions.py +270 -0
- mapproxy/test/unit/test_featureinfo.py +313 -0
- mapproxy/test/unit/test_file_lock_load.py +49 -0
- mapproxy/test/unit/test_geom.py +512 -0
- mapproxy/test/unit/test_grid.py +1279 -0
- mapproxy/test/unit/test_image.py +1051 -0
- mapproxy/test/unit/test_image_mask.py +181 -0
- mapproxy/test/unit/test_image_messages.py +209 -0
- mapproxy/test/unit/test_image_options.py +160 -0
- mapproxy/test/unit/test_isodate.py +118 -0
- mapproxy/test/unit/test_multiapp.py +163 -0
- mapproxy/test/unit/test_ogr_reader.py +51 -0
- mapproxy/test/unit/test_request.py +745 -0
- mapproxy/test/unit/test_request_wmts.py +178 -0
- mapproxy/test/unit/test_response.py +78 -0
- mapproxy/test/unit/test_seed.py +365 -0
- mapproxy/test/unit/test_seed_cachelock.py +91 -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 +68 -0
- mapproxy/tilefilter.py +61 -0
- mapproxy/util/__init__.py +0 -0
- mapproxy/util/async_.py +229 -0
- mapproxy/util/collections.py +134 -0
- mapproxy/util/coverage.py +337 -0
- mapproxy/util/ext/__init__.py +14 -0
- mapproxy/util/ext/dictspec/__init__.py +1 -0
- mapproxy/util/ext/dictspec/spec.py +131 -0
- mapproxy/util/ext/dictspec/test/__init__.py +0 -0
- mapproxy/util/ext/dictspec/test/test_validator.py +278 -0
- mapproxy/util/ext/dictspec/validator.py +194 -0
- mapproxy/util/ext/local.py +198 -0
- mapproxy/util/ext/lockfile.py +140 -0
- mapproxy/util/ext/odict.py +321 -0
- mapproxy/util/ext/serving.py +491 -0
- mapproxy/util/ext/tempita/__init__.py +1093 -0
- mapproxy/util/ext/tempita/_looper.py +163 -0
- mapproxy/util/ext/tempita/string_utils.py +24 -0
- mapproxy/util/ext/wmsparse/__init__.py +3 -0
- mapproxy/util/ext/wmsparse/duration.py +600 -0
- mapproxy/util/ext/wmsparse/parse.py +307 -0
- mapproxy/util/ext/wmsparse/test/__init__.py +0 -0
- mapproxy/util/ext/wmsparse/test/test_parse.py +111 -0
- mapproxy/util/ext/wmsparse/test/test_util.py +23 -0
- mapproxy/util/ext/wmsparse/test/wms-example-111.xml +90 -0
- mapproxy/util/ext/wmsparse/test/wms-example-130.xml +120 -0
- mapproxy/util/ext/wmsparse/test/wms-large-111.xml +2114 -0
- mapproxy/util/ext/wmsparse/test/wms_nasa_cap.xml +386 -0
- mapproxy/util/ext/wmsparse/util.py +189 -0
- mapproxy/util/fs.py +164 -0
- mapproxy/util/geom.py +307 -0
- mapproxy/util/lib.py +117 -0
- mapproxy/util/lock.py +171 -0
- mapproxy/util/ogr.py +247 -0
- mapproxy/util/py.py +75 -0
- mapproxy/util/times.py +78 -0
- mapproxy/util/yaml.py +58 -0
- mapproxy/version.py +33 -0
- mapproxy/wsgiapp.py +167 -0
|
@@ -0,0 +1,308 @@
|
|
|
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
|
+
import json
|
|
22
|
+
|
|
23
|
+
from mapproxy.compat.image import Image
|
|
24
|
+
from mapproxy.request.wms import (
|
|
25
|
+
WMS111MapRequest,
|
|
26
|
+
WMS111CapabilitiesRequest,
|
|
27
|
+
WMS130CapabilitiesRequest,
|
|
28
|
+
WMS111LegendGraphicRequest,
|
|
29
|
+
WMS130LegendGraphicRequest,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
from mapproxy.test.image import is_png, tmp_image
|
|
33
|
+
from mapproxy.test.helper import validate_with_dtd, validate_with_xsd
|
|
34
|
+
from mapproxy.test.http import mock_httpd
|
|
35
|
+
from mapproxy.test.system import SysTest
|
|
36
|
+
from mapproxy.test.system.test_wms import is_111_capa, assert_xpath_wms130, ns130
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@pytest.fixture(scope="module")
|
|
40
|
+
def config_file():
|
|
41
|
+
return "legendgraphic.yaml"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def is_130_capa(xml):
|
|
45
|
+
return validate_with_xsd(xml, xsd_name="sld/1.1.0/sld_capabilities.xsd")
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class TestWMSLegendgraphic(SysTest):
|
|
49
|
+
|
|
50
|
+
# we use a class scoped cache_dir as tests build up on each other
|
|
51
|
+
@pytest.fixture(scope="class")
|
|
52
|
+
def cache_dir(self, base_dir):
|
|
53
|
+
return base_dir.join("cache_data")
|
|
54
|
+
|
|
55
|
+
def setup_method(self):
|
|
56
|
+
self.common_req = WMS111MapRequest(
|
|
57
|
+
url="/service?", param=dict(service="WMS", version="1.1.1")
|
|
58
|
+
)
|
|
59
|
+
self.common_lg_req_111 = WMS111LegendGraphicRequest(
|
|
60
|
+
url="/service?",
|
|
61
|
+
param=dict(format="image/png", layer="wms_legend", sld_version="1.1.0"),
|
|
62
|
+
)
|
|
63
|
+
self.common_lg_req_130 = WMS130LegendGraphicRequest(
|
|
64
|
+
url="/service?",
|
|
65
|
+
param=dict(format="image/png", layer="wms_legend", sld_version="1.1.0"),
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
# test_00, test_01, test_02 need to run first in order to run the other tests properly
|
|
69
|
+
def test_00_get_legendgraphic_multiple_sources_111(self, app):
|
|
70
|
+
self.common_lg_req_111.params["layer"] = "wms_mult_sources"
|
|
71
|
+
with tmp_image((256, 256), format="png") as img:
|
|
72
|
+
img_data = img.read()
|
|
73
|
+
expected_req1 = (
|
|
74
|
+
{
|
|
75
|
+
"path": r"/service?LAYER=foo&SERVICE=WMS&FORMAT=image%2Fpng"
|
|
76
|
+
"&REQUEST=GetLegendGraphic&"
|
|
77
|
+
"&VERSION=1.1.1&SLD_VERSION=1.1.0"
|
|
78
|
+
},
|
|
79
|
+
{"body": img_data, "headers": {"content-type": "image/png"}},
|
|
80
|
+
)
|
|
81
|
+
expected_req2 = (
|
|
82
|
+
{
|
|
83
|
+
"path": r"/service?LAYER=bar&SERVICE=WMS&FORMAT=image%2Fpng"
|
|
84
|
+
"&REQUEST=GetLegendGraphic&"
|
|
85
|
+
"&VERSION=1.1.1&SLD_VERSION=1.1.0"
|
|
86
|
+
},
|
|
87
|
+
{"body": img_data, "headers": {"content-type": "image/png"}},
|
|
88
|
+
)
|
|
89
|
+
expected_req3 = (
|
|
90
|
+
{
|
|
91
|
+
"path": r"/service?LAYER=spam&SERVICE=WMS&FORMAT=image%2Fpng"
|
|
92
|
+
"&REQUEST=GetLegendGraphic&"
|
|
93
|
+
"&VERSION=1.1.1&SLD_VERSION=1.1.0"
|
|
94
|
+
},
|
|
95
|
+
{"body": img_data, "headers": {"content-type": "image/png"}},
|
|
96
|
+
)
|
|
97
|
+
with mock_httpd(
|
|
98
|
+
("localhost", 42423), [expected_req1, expected_req2, expected_req3]
|
|
99
|
+
):
|
|
100
|
+
resp = app.get(self.common_lg_req_111)
|
|
101
|
+
assert resp.content_type == "image/png"
|
|
102
|
+
data = BytesIO(resp.body)
|
|
103
|
+
assert is_png(data)
|
|
104
|
+
assert Image.open(data).size == (256, 768)
|
|
105
|
+
|
|
106
|
+
def test_01_get_legendgraphic_source_static_url(self, app):
|
|
107
|
+
self.common_lg_req_111.params["layer"] = "wms_source_static_url"
|
|
108
|
+
with tmp_image((256, 256), format="png") as img:
|
|
109
|
+
img_data = img.read()
|
|
110
|
+
expected_req1 = (
|
|
111
|
+
{"path": r"/staticlegend_source.png"},
|
|
112
|
+
{"body": img_data, "headers": {"content-type": "image/png"}},
|
|
113
|
+
)
|
|
114
|
+
with mock_httpd(("localhost", 42423), [expected_req1]):
|
|
115
|
+
resp = app.get(self.common_lg_req_111)
|
|
116
|
+
assert resp.content_type == "image/png"
|
|
117
|
+
data = BytesIO(resp.body)
|
|
118
|
+
assert is_png(data)
|
|
119
|
+
assert Image.open(data).size == (256, 256)
|
|
120
|
+
|
|
121
|
+
def test_02_get_legendgraphic_layer_static_url(self, app):
|
|
122
|
+
self.common_lg_req_111.params["layer"] = "wms_layer_static_url"
|
|
123
|
+
with tmp_image((256, 256), format="png") as img:
|
|
124
|
+
img_data = img.read()
|
|
125
|
+
expected_req1 = (
|
|
126
|
+
{"path": r"/staticlegend_layer.png"},
|
|
127
|
+
{"body": img_data, "headers": {"content-type": "image/png"}},
|
|
128
|
+
)
|
|
129
|
+
with mock_httpd(("localhost", 42423), [expected_req1]):
|
|
130
|
+
resp = app.get(self.common_lg_req_111)
|
|
131
|
+
assert resp.content_type == "image/png"
|
|
132
|
+
data = BytesIO(resp.body)
|
|
133
|
+
assert is_png(data)
|
|
134
|
+
assert Image.open(data).size == (256, 256)
|
|
135
|
+
|
|
136
|
+
def test_capabilities_111(self, app):
|
|
137
|
+
req = WMS111CapabilitiesRequest(url="/service?").copy_with_request_params(
|
|
138
|
+
self.common_req
|
|
139
|
+
)
|
|
140
|
+
resp = app.get(req)
|
|
141
|
+
xml = resp.lxml
|
|
142
|
+
assert xml.xpath("//Request/GetLegendGraphic")[0].tag == "GetLegendGraphic"
|
|
143
|
+
legend_sizes = (
|
|
144
|
+
xml.xpath("//Layer/Style/LegendURL/@width"),
|
|
145
|
+
xml.xpath("//Layer/Style/LegendURL/@height"),
|
|
146
|
+
)
|
|
147
|
+
assert legend_sizes == (
|
|
148
|
+
["256", "256", "256", "256"],
|
|
149
|
+
["512", "768", "256", "256"],
|
|
150
|
+
)
|
|
151
|
+
layer_urls = xml.xpath(
|
|
152
|
+
"//Layer/Style/LegendURL/OnlineResource/@xlink:href", namespaces=ns130
|
|
153
|
+
)
|
|
154
|
+
for layer_url in layer_urls:
|
|
155
|
+
assert layer_url.startswith("http://")
|
|
156
|
+
assert "GetLegendGraphic" in layer_url
|
|
157
|
+
assert is_111_capa(xml)
|
|
158
|
+
|
|
159
|
+
def test_capabilities_130(self, app):
|
|
160
|
+
req = WMS130CapabilitiesRequest(url="/service?").copy_with_request_params(
|
|
161
|
+
self.common_req
|
|
162
|
+
)
|
|
163
|
+
resp = app.get(req)
|
|
164
|
+
xml = resp.lxml
|
|
165
|
+
assert xml.xpath("//wms:Request/sld:GetLegendGraphic", namespaces=ns130)[
|
|
166
|
+
0
|
|
167
|
+
].tag == "{%s}GetLegendGraphic" % (ns130["sld"])
|
|
168
|
+
layer_urls = xml.xpath(
|
|
169
|
+
"//Layer/Style/LegendURL/OnlineResource/@xlink:href", namespaces=ns130
|
|
170
|
+
)
|
|
171
|
+
for layer_url in layer_urls:
|
|
172
|
+
assert layer_url.startswith("http://")
|
|
173
|
+
assert "GetLegendGraphic" in layer_url
|
|
174
|
+
assert is_130_capa(xml)
|
|
175
|
+
|
|
176
|
+
def test_get_legendgraphic_111(self, app):
|
|
177
|
+
self.common_lg_req_111.params["scale"] = "5.0"
|
|
178
|
+
with tmp_image((256, 256), format="png") as img:
|
|
179
|
+
img_data = img.read()
|
|
180
|
+
expected_req1 = (
|
|
181
|
+
{
|
|
182
|
+
"path": r"/service?LAYER=foo&SERVICE=WMS&FORMAT=image%2Fpng"
|
|
183
|
+
"&REQUEST=GetLegendGraphic&SCALE=5.0&"
|
|
184
|
+
"&VERSION=1.1.1&SLD_VERSION=1.1.0"
|
|
185
|
+
},
|
|
186
|
+
{"body": img_data, "headers": {"content-type": "image/png"}},
|
|
187
|
+
)
|
|
188
|
+
expected_req2 = (
|
|
189
|
+
{
|
|
190
|
+
"path": r"/service?LAYER=bar&SERVICE=WMS&FORMAT=image%2Fpng"
|
|
191
|
+
"&REQUEST=GetLegendGraphic&SCALE=5.0&"
|
|
192
|
+
"&VERSION=1.1.1&SLD_VERSION=1.1.0"
|
|
193
|
+
},
|
|
194
|
+
{"body": img_data, "headers": {"content-type": "image/png"}},
|
|
195
|
+
)
|
|
196
|
+
with mock_httpd(("localhost", 42423), [expected_req1, expected_req2]):
|
|
197
|
+
resp = app.get(self.common_lg_req_111)
|
|
198
|
+
assert resp.content_type == "image/png"
|
|
199
|
+
data = BytesIO(resp.body)
|
|
200
|
+
assert is_png(data)
|
|
201
|
+
assert Image.open(data).size == (256, 512)
|
|
202
|
+
|
|
203
|
+
def test_get_legendgraphic_no_legend_111(self, app):
|
|
204
|
+
self.common_lg_req_111.params["layer"] = "wms_no_legend"
|
|
205
|
+
resp = app.get(self.common_lg_req_111)
|
|
206
|
+
assert resp.content_type == "application/vnd.ogc.se_xml"
|
|
207
|
+
xml = resp.lxml
|
|
208
|
+
assert (
|
|
209
|
+
"wms_no_legend has no legend graphic"
|
|
210
|
+
in xml.xpath("//ServiceException/text()")[0]
|
|
211
|
+
)
|
|
212
|
+
assert validate_with_dtd(xml, "wms/1.1.1/exception_1_1_1.dtd")
|
|
213
|
+
|
|
214
|
+
def test_get_legendgraphic_missing_params_111(self, app):
|
|
215
|
+
req = (
|
|
216
|
+
str(self.common_lg_req_111)
|
|
217
|
+
.replace("sld_version", "invalid")
|
|
218
|
+
.replace("format", "invalid")
|
|
219
|
+
)
|
|
220
|
+
resp = app.get(req)
|
|
221
|
+
assert resp.content_type == "application/vnd.ogc.se_xml"
|
|
222
|
+
xml = resp.lxml
|
|
223
|
+
assert "missing parameters" in xml.xpath("//ServiceException/text()")[0]
|
|
224
|
+
assert validate_with_dtd(xml, "wms/1.1.1/exception_1_1_1.dtd")
|
|
225
|
+
|
|
226
|
+
def test_get_legendgraphic_invalid_sld_version_111(self, app):
|
|
227
|
+
req = str(self.common_lg_req_111).replace(
|
|
228
|
+
"sld_version=1.1.0", "sld_version=1.0.0"
|
|
229
|
+
)
|
|
230
|
+
resp = app.get(req)
|
|
231
|
+
assert resp.content_type == "application/vnd.ogc.se_xml"
|
|
232
|
+
xml = resp.lxml
|
|
233
|
+
assert "invalid sld_version" in xml.xpath("//ServiceException/text()")[0]
|
|
234
|
+
assert validate_with_dtd(xml, "wms/1.1.1/exception_1_1_1.dtd")
|
|
235
|
+
|
|
236
|
+
def test_get_legendgraphic_no_legend_130(self, app):
|
|
237
|
+
self.common_lg_req_130.params["layer"] = "wms_no_legend"
|
|
238
|
+
resp = app.get(self.common_lg_req_130)
|
|
239
|
+
assert resp.content_type == "text/xml"
|
|
240
|
+
xml = resp.lxml
|
|
241
|
+
assert_xpath_wms130(xml, "/ogc:ServiceExceptionReport/@version", "1.3.0")
|
|
242
|
+
assert_xpath_wms130(
|
|
243
|
+
xml,
|
|
244
|
+
"//ogc:ServiceException/text()",
|
|
245
|
+
"layer wms_no_legend has no legend graphic",
|
|
246
|
+
)
|
|
247
|
+
assert validate_with_xsd(xml, xsd_name="wms/1.3.0/exceptions_1_3_0.xsd")
|
|
248
|
+
|
|
249
|
+
def test_get_legendgraphic_missing_params_130(self, app):
|
|
250
|
+
req = str(self.common_lg_req_130).replace("format", "invalid")
|
|
251
|
+
resp = app.get(req)
|
|
252
|
+
assert resp.content_type == "text/xml"
|
|
253
|
+
xml = resp.lxml
|
|
254
|
+
assert_xpath_wms130(xml, "/ogc:ServiceExceptionReport/@version", "1.3.0")
|
|
255
|
+
assert_xpath_wms130(
|
|
256
|
+
xml, "//ogc:ServiceException/text()", "missing parameters ['format']"
|
|
257
|
+
)
|
|
258
|
+
assert validate_with_xsd(xml, xsd_name="wms/1.3.0/exceptions_1_3_0.xsd")
|
|
259
|
+
|
|
260
|
+
def test_get_legendgraphic_invalid_sld_version_130(self, app):
|
|
261
|
+
req = str(self.common_lg_req_130).replace(
|
|
262
|
+
"sld_version=1.1.0", "sld_version=1.0.0"
|
|
263
|
+
)
|
|
264
|
+
resp = app.get(req)
|
|
265
|
+
assert resp.content_type == "text/xml"
|
|
266
|
+
xml = resp.lxml
|
|
267
|
+
assert_xpath_wms130(xml, "/ogc:ServiceExceptionReport/@version", "1.3.0")
|
|
268
|
+
assert_xpath_wms130(
|
|
269
|
+
xml, "//ogc:ServiceException/text()", "invalid sld_version 1.0.0"
|
|
270
|
+
)
|
|
271
|
+
assert validate_with_xsd(xml, xsd_name="wms/1.3.0/exceptions_1_3_0.xsd")
|
|
272
|
+
|
|
273
|
+
def test_get_legendgraphic_json_single_source_multiple_sub_layers(self, app):
|
|
274
|
+
"""
|
|
275
|
+
this.common_lg_req_130 request fetches layer 'wms_legend'
|
|
276
|
+
layer 'wms_legend' contains:
|
|
277
|
+
- single source 'legend_cache'
|
|
278
|
+
- multiple sub layers: 'foo' and 'bar'
|
|
279
|
+
- see also 'test/system/fixture/legendgraphic.yaml'
|
|
280
|
+
"""
|
|
281
|
+
self.common_lg_req_130.params["format"] = "application/json"
|
|
282
|
+
json_data_foo = "{\"Legend\": [{\"layerName\": \"foo\"}]}"
|
|
283
|
+
json_data_bar = "{\"Legend\": [{\"layerName\": \"bar\"}]}"
|
|
284
|
+
expected_req1 = (
|
|
285
|
+
{
|
|
286
|
+
"path": r"/service?LAYER=foo&SERVICE=WMS&FORMAT=application%2Fjson"
|
|
287
|
+
"&REQUEST=GetLegendGraphic&"
|
|
288
|
+
"&VERSION=1.1.1&SLD_VERSION=1.1.0"
|
|
289
|
+
},
|
|
290
|
+
{"body": json_data_foo.encode(), "headers": {"content-type": "application/json"}},
|
|
291
|
+
)
|
|
292
|
+
expected_req2 = (
|
|
293
|
+
{
|
|
294
|
+
"path": r"/service?LAYER=bar&SERVICE=WMS&FORMAT=application%2Fjson"
|
|
295
|
+
"&REQUEST=GetLegendGraphic&"
|
|
296
|
+
"&VERSION=1.1.1&SLD_VERSION=1.1.0"
|
|
297
|
+
},
|
|
298
|
+
{"body": json_data_bar.encode(), "headers": {"content-type": "application/json"}},
|
|
299
|
+
)
|
|
300
|
+
with mock_httpd(
|
|
301
|
+
("localhost", 42423), [expected_req1, expected_req2]
|
|
302
|
+
):
|
|
303
|
+
resp = app.get(self.common_lg_req_130)
|
|
304
|
+
assert resp.content_type == "application/json"
|
|
305
|
+
json_str = resp.body.decode("utf-8")
|
|
306
|
+
json_data = json.loads(json_str)
|
|
307
|
+
assert json_data['Legend'][0]['layerName'] == 'foo'
|
|
308
|
+
assert json_data['Legend'][1]['layerName'] == 'bar'
|
|
@@ -0,0 +1,162 @@
|
|
|
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
|
+
from io import BytesIO
|
|
19
|
+
|
|
20
|
+
import pytest
|
|
21
|
+
|
|
22
|
+
from mapproxy.compat.image import Image
|
|
23
|
+
from mapproxy.test.system import SysTest
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
has_mapnik = True
|
|
27
|
+
try:
|
|
28
|
+
import mapnik
|
|
29
|
+
except ImportError:
|
|
30
|
+
try:
|
|
31
|
+
import mapnik2 as mapnik # noqa
|
|
32
|
+
except ImportError:
|
|
33
|
+
has_mapnik = False
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
mapnik_xml = (
|
|
37
|
+
b"""
|
|
38
|
+
<?xml version="1.0"?>
|
|
39
|
+
<!DOCTYPE Map>
|
|
40
|
+
<Map background-color="#ff0000" bgcolor="#ff0000" srs="+proj=latlong +datum=WGS84">
|
|
41
|
+
<Layer name="marker">
|
|
42
|
+
<StyleName>marker</StyleName>
|
|
43
|
+
<Datasource>
|
|
44
|
+
<Parameter name="type">ogr</Parameter>
|
|
45
|
+
<Parameter name="file">test_point.geojson</Parameter>
|
|
46
|
+
<Parameter name="layer">OGRGeoJSON</Parameter>
|
|
47
|
+
</Datasource>
|
|
48
|
+
</Layer>
|
|
49
|
+
<Style name="marker">
|
|
50
|
+
<Rule>
|
|
51
|
+
<MarkersSymbolizer fill="transparent" width="10" height="10" stroke="black" stroke-width="3"
|
|
52
|
+
placement="point" marker-type="ellipse"/>
|
|
53
|
+
</Rule>
|
|
54
|
+
</Style>
|
|
55
|
+
</Map>
|
|
56
|
+
""".strip()
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
test_point_geojson = (
|
|
60
|
+
b"""
|
|
61
|
+
{"type": "Feature", "geometry": {"type": "Point", "coordinates": [-45, -45]}, "properties": {}}
|
|
62
|
+
""".strip()
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
mapnik_transp_xml = (
|
|
66
|
+
b"""
|
|
67
|
+
<?xml version="1.0"?>
|
|
68
|
+
<!DOCTYPE Map>
|
|
69
|
+
<Map background-color="transparent" srs="+proj=latlong +datum=WGS84">
|
|
70
|
+
</Map>
|
|
71
|
+
""".strip()
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@pytest.mark.skipif(not has_mapnik, reason="requires mapnik")
|
|
76
|
+
class TestMapnikSource(SysTest):
|
|
77
|
+
|
|
78
|
+
@pytest.fixture(scope="class")
|
|
79
|
+
def config_file(self):
|
|
80
|
+
return "mapnik_source.yaml"
|
|
81
|
+
|
|
82
|
+
@pytest.fixture(scope="class")
|
|
83
|
+
def additional_files(self, base_dir):
|
|
84
|
+
base_dir.join("test_point.geojson").write_binary(test_point_geojson)
|
|
85
|
+
base_dir.join("mapnik.xml").write_binary(mapnik_xml)
|
|
86
|
+
base_dir.join("mapnik-transparent.xml").write_binary(mapnik_transp_xml)
|
|
87
|
+
|
|
88
|
+
def test_get_map(self, app):
|
|
89
|
+
req = (
|
|
90
|
+
r"/service?LAYERs=mapnik&SERVICE=WMS&FORMAT=image%2Fpng"
|
|
91
|
+
"&REQUEST=GetMap&HEIGHT=200&SRS=EPSG%3A4326"
|
|
92
|
+
"&VERSION=1.1.1&BBOX=-90,-90,0,0&styles="
|
|
93
|
+
"&WIDTH=200&"
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
resp = app.get(req)
|
|
97
|
+
data = BytesIO(resp.body)
|
|
98
|
+
img = Image.open(data)
|
|
99
|
+
colors = sorted(img.getcolors(), reverse=True)
|
|
100
|
+
# map bg color + black marker
|
|
101
|
+
assert 39700 < colors[0][0] < 39900, colors[0][0]
|
|
102
|
+
assert colors[0][1] == (255, 0, 0, 255)
|
|
103
|
+
assert 50 < colors[1][0] < 150, colors[1][0]
|
|
104
|
+
assert colors[1][1] == (0, 0, 0, 255)
|
|
105
|
+
|
|
106
|
+
def test_get_map_hq(self, app):
|
|
107
|
+
req = (
|
|
108
|
+
r"/service?LAYERs=mapnik_hq&SERVICE=WMS&FORMAT=image%2Fpng"
|
|
109
|
+
"&REQUEST=GetMap&HEIGHT=200&SRS=EPSG%3A4326"
|
|
110
|
+
"&VERSION=1.1.1&BBOX=-90,-90,0,0&styles="
|
|
111
|
+
"&WIDTH=200&"
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
resp = app.get(req)
|
|
115
|
+
data = BytesIO(resp.body)
|
|
116
|
+
img = Image.open(data)
|
|
117
|
+
colors = sorted(img.getcolors(), reverse=True)
|
|
118
|
+
# map bg color + black marker (like above, but marker is scaled up)
|
|
119
|
+
assert 39500 < colors[0][0] < 39600, colors[0][0]
|
|
120
|
+
assert colors[0][1] == (255, 0, 0, 255)
|
|
121
|
+
assert 250 < colors[1][0] < 350, colors[1][0]
|
|
122
|
+
assert colors[1][1] == (0, 0, 0, 255)
|
|
123
|
+
|
|
124
|
+
def test_get_map_outside_coverage(self, app):
|
|
125
|
+
req = (
|
|
126
|
+
r"/service?LAYERs=mapnik&SERVICE=WMS&FORMAT=image%2Fpng"
|
|
127
|
+
"&REQUEST=GetMap&HEIGHT=200&SRS=EPSG%3A4326"
|
|
128
|
+
"&VERSION=1.1.1&BBOX=-175,-85,-172,-82&styles="
|
|
129
|
+
"&WIDTH=200&&BGCOLOR=0x00ff00"
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
resp = app.get(req)
|
|
133
|
+
data = BytesIO(resp.body)
|
|
134
|
+
img = Image.open(data)
|
|
135
|
+
colors = sorted(img.getcolors(), reverse=True)
|
|
136
|
+
# wms request bg color
|
|
137
|
+
assert colors[0] == (40000, (0, 255, 0))
|
|
138
|
+
|
|
139
|
+
def test_get_map_unknown_file(self, app):
|
|
140
|
+
req = (
|
|
141
|
+
r"/service?LAYERs=mapnik_unknown&SERVICE=WMS&FORMAT=image%2Fpng"
|
|
142
|
+
"&REQUEST=GetMap&HEIGHT=200&SRS=EPSG%3A4326"
|
|
143
|
+
"&VERSION=1.1.1&BBOX=-90,-90,0,0&styles="
|
|
144
|
+
"&WIDTH=200&&BGCOLOR=0x00ff00"
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
resp = app.get(req)
|
|
148
|
+
assert "unknown.xml" in resp.body, resp.body
|
|
149
|
+
|
|
150
|
+
def test_get_map_transparent(self, app):
|
|
151
|
+
req = (
|
|
152
|
+
r"/service?LAYERs=mapnik_transparent&SERVICE=WMS&FORMAT=image%2Fpng"
|
|
153
|
+
"&REQUEST=GetMap&HEIGHT=200&SRS=EPSG%3A4326"
|
|
154
|
+
"&VERSION=1.1.1&BBOX=-90,-90,0,0&styles="
|
|
155
|
+
"&WIDTH=200&transparent=True"
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
resp = app.get(req)
|
|
159
|
+
data = BytesIO(resp.body)
|
|
160
|
+
img = Image.open(data)
|
|
161
|
+
colors = sorted(img.getcolors(), reverse=True)
|
|
162
|
+
assert colors[0] == (40000, (0, 0, 0, 0))
|
|
@@ -0,0 +1,83 @@
|
|
|
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 sys
|
|
20
|
+
import stat
|
|
21
|
+
import shutil
|
|
22
|
+
|
|
23
|
+
from io import BytesIO
|
|
24
|
+
|
|
25
|
+
import pytest
|
|
26
|
+
|
|
27
|
+
from mapproxy.request.wms import WMS111MapRequest
|
|
28
|
+
from mapproxy.compat.image import Image
|
|
29
|
+
from mapproxy.test.image import is_png
|
|
30
|
+
from mapproxy.test.system import SysTest
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
pytestmark = pytest.mark.skipif(
|
|
34
|
+
sys.platform == "win32", reason="CGI tests not ported for Windows"
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@pytest.fixture(scope="module")
|
|
39
|
+
def config_file():
|
|
40
|
+
return "mapserver.yaml"
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@pytest.mark.skipif(sys.version_info < (3, 0), reason="tests skipped for python 2")
|
|
44
|
+
class TestMapServerCGI(SysTest):
|
|
45
|
+
|
|
46
|
+
@pytest.fixture(scope="class")
|
|
47
|
+
def additional_files(self, base_dir):
|
|
48
|
+
shutil.copy(
|
|
49
|
+
os.path.join(os.path.dirname(__file__), "fixture", "minimal_cgi.py"),
|
|
50
|
+
base_dir.strpath,
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
os.chmod(
|
|
54
|
+
base_dir.join("minimal_cgi.py").strpath, stat.S_IXUSR | stat.S_IRUSR | stat.S_IWUSR
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
base_dir.join("tmp").mkdir()
|
|
58
|
+
|
|
59
|
+
def setup_method(self):
|
|
60
|
+
self.common_map_req = WMS111MapRequest(
|
|
61
|
+
url="/service?",
|
|
62
|
+
param=dict(
|
|
63
|
+
service="WMS",
|
|
64
|
+
version="1.1.1",
|
|
65
|
+
bbox="-180,0,0,80",
|
|
66
|
+
width="200",
|
|
67
|
+
height="200",
|
|
68
|
+
layers="ms",
|
|
69
|
+
srs="EPSG:4326",
|
|
70
|
+
format="image/png",
|
|
71
|
+
styles="",
|
|
72
|
+
request="GetMap",
|
|
73
|
+
),
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
def test_get_map(self, app):
|
|
77
|
+
resp = app.get(self.common_map_req)
|
|
78
|
+
assert resp.content_type == "image/png"
|
|
79
|
+
data = BytesIO(resp.body)
|
|
80
|
+
assert is_png(data)
|
|
81
|
+
img = Image.open(data)
|
|
82
|
+
img = img.convert("RGB")
|
|
83
|
+
assert img.getcolors() == [(200 * 200, (255, 0, 0))]
|