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
mapproxy/proj.py
ADDED
|
@@ -0,0 +1,302 @@
|
|
|
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
|
+
"""
|
|
17
|
+
ctypes based replacement of pyroj (with pyproj fallback) of the old PROJ 4 API.
|
|
18
|
+
|
|
19
|
+
This module implements the `Proj`, `transform` and `set_datapath` class/functions. This
|
|
20
|
+
module is a drop-in replacement for pyproj. It does implement just enough to work for
|
|
21
|
+
MapProxy, i.e. there is no numpy support, etc.
|
|
22
|
+
|
|
23
|
+
It uses the C libproj library. If the library could not be found/loaded it will fallback
|
|
24
|
+
to pyroj. You can force the usage of either backend by setting the environment variables
|
|
25
|
+
MAPPROXY_USE_LIBPROJ or MAPPROXY_USE_PYPROJ to any value.
|
|
26
|
+
|
|
27
|
+
The new PROJ >=5 API is only supported via pyproj. See USE_PROJ4_API.
|
|
28
|
+
|
|
29
|
+
"""
|
|
30
|
+
from __future__ import print_function
|
|
31
|
+
|
|
32
|
+
import os
|
|
33
|
+
import sys
|
|
34
|
+
from mapproxy.util.lib import load_library
|
|
35
|
+
|
|
36
|
+
import ctypes
|
|
37
|
+
from ctypes import (
|
|
38
|
+
c_void_p,
|
|
39
|
+
c_char_p,
|
|
40
|
+
c_int,
|
|
41
|
+
c_double,
|
|
42
|
+
c_long,
|
|
43
|
+
POINTER,
|
|
44
|
+
create_string_buffer,
|
|
45
|
+
addressof,
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
c_double_p = POINTER(c_double)
|
|
49
|
+
FINDERCMD = ctypes.CFUNCTYPE(c_char_p, c_char_p)
|
|
50
|
+
|
|
51
|
+
import logging
|
|
52
|
+
log_system = logging.getLogger('mapproxy.system')
|
|
53
|
+
|
|
54
|
+
__all__ = ['Proj', 'transform', 'set_datapath', 'ProjError']
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def init_libproj():
|
|
58
|
+
libproj = load_library('libproj')
|
|
59
|
+
|
|
60
|
+
if libproj is None: return
|
|
61
|
+
|
|
62
|
+
if hasattr(libproj, 'proj_create'):
|
|
63
|
+
log_system.warning('Found libproj >=5. Using this library without pyproj is '
|
|
64
|
+
'deprecated and not fully supported. Please install pyproj >= 2.')
|
|
65
|
+
|
|
66
|
+
libproj.pj_init_plus.argtypes = [c_char_p]
|
|
67
|
+
libproj.pj_init_plus.restype = c_void_p
|
|
68
|
+
|
|
69
|
+
libproj.pj_is_latlong.argtypes = [c_void_p]
|
|
70
|
+
libproj.pj_is_latlong.restype = c_int
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
libproj.pj_get_def.argtypes = [c_void_p, c_int]
|
|
74
|
+
libproj.pj_get_def.restype = c_void_p
|
|
75
|
+
|
|
76
|
+
libproj.pj_strerrno.argtypes = [c_int]
|
|
77
|
+
libproj.pj_strerrno.restype = c_char_p
|
|
78
|
+
|
|
79
|
+
libproj.pj_get_errno_ref.argtypes = []
|
|
80
|
+
libproj.pj_get_errno_ref.restype = POINTER(c_int)
|
|
81
|
+
|
|
82
|
+
# free proj objects
|
|
83
|
+
libproj.pj_free.argtypes = [c_void_p]
|
|
84
|
+
# free() wrapper
|
|
85
|
+
libproj.pj_dalloc.argtypes = [c_void_p]
|
|
86
|
+
|
|
87
|
+
libproj.pj_transform.argtypes = [c_void_p, c_void_p, c_long, c_int,
|
|
88
|
+
c_double_p, c_double_p, c_double_p]
|
|
89
|
+
libproj.pj_transform.restype = c_int
|
|
90
|
+
|
|
91
|
+
if hasattr(libproj, 'pj_set_searchpath'):
|
|
92
|
+
libproj.pj_set_searchpath.argtypes = [c_int, POINTER(c_char_p)]
|
|
93
|
+
libproj.pj_set_finder.argtypes = [FINDERCMD]
|
|
94
|
+
|
|
95
|
+
return libproj
|
|
96
|
+
|
|
97
|
+
class SearchPath(object):
|
|
98
|
+
def __init__(self):
|
|
99
|
+
self.path = None
|
|
100
|
+
self.finder_results = {}
|
|
101
|
+
|
|
102
|
+
def clear(self):
|
|
103
|
+
self.path = None
|
|
104
|
+
self.finder_results = {}
|
|
105
|
+
|
|
106
|
+
def set_searchpath(self, path):
|
|
107
|
+
self.clear()
|
|
108
|
+
if path is not None:
|
|
109
|
+
path = path.encode(sys.getfilesystemencoding() or 'utf-8')
|
|
110
|
+
self.path = path
|
|
111
|
+
|
|
112
|
+
def finder(self, name):
|
|
113
|
+
if self.path is None:
|
|
114
|
+
return None
|
|
115
|
+
|
|
116
|
+
if name in self.finder_results:
|
|
117
|
+
result = self.finder_results[name]
|
|
118
|
+
else:
|
|
119
|
+
sysname = os.path.join(self.path, name)
|
|
120
|
+
result = self.finder_results[name] = create_string_buffer(sysname)
|
|
121
|
+
|
|
122
|
+
return addressof(result)
|
|
123
|
+
|
|
124
|
+
# search_path and finder_func must be defined in module
|
|
125
|
+
# context to avoid garbage collection
|
|
126
|
+
search_path = SearchPath()
|
|
127
|
+
finder_func = FINDERCMD(search_path.finder)
|
|
128
|
+
_finder_callback_set = False
|
|
129
|
+
|
|
130
|
+
class ProjError(RuntimeError):
|
|
131
|
+
pass
|
|
132
|
+
|
|
133
|
+
class ProjInitError(ProjError):
|
|
134
|
+
pass
|
|
135
|
+
|
|
136
|
+
def try_pyproj4_import():
|
|
137
|
+
try:
|
|
138
|
+
from pyproj import Proj, transform, set_datapath
|
|
139
|
+
except ImportError:
|
|
140
|
+
return False
|
|
141
|
+
log_system.info('using pyproj with old Proj4 API for coordinate transformation')
|
|
142
|
+
return Proj, transform, set_datapath
|
|
143
|
+
|
|
144
|
+
def try_pyproj_import():
|
|
145
|
+
try:
|
|
146
|
+
from pyproj import CRS
|
|
147
|
+
from pyproj.transformer import Transformer
|
|
148
|
+
from pyproj.datadir import set_data_dir
|
|
149
|
+
except ImportError:
|
|
150
|
+
return False
|
|
151
|
+
log_system.info('using pyproj for coordinate transformation')
|
|
152
|
+
return CRS, Transformer, set_data_dir
|
|
153
|
+
|
|
154
|
+
def try_libproj_import():
|
|
155
|
+
libproj = init_libproj()
|
|
156
|
+
|
|
157
|
+
if libproj is None:
|
|
158
|
+
return False
|
|
159
|
+
|
|
160
|
+
log_system.info('using libproj for coordinate transformation')
|
|
161
|
+
|
|
162
|
+
RAD_TO_DEG = 57.29577951308232
|
|
163
|
+
DEG_TO_RAD = .0174532925199432958
|
|
164
|
+
|
|
165
|
+
class Proj(object):
|
|
166
|
+
def __init__(self, proj_def=None, init=None):
|
|
167
|
+
if init:
|
|
168
|
+
self._proj = libproj.pj_init_plus(b'+init=' + init.encode('ascii'))
|
|
169
|
+
else:
|
|
170
|
+
self._proj = libproj.pj_init_plus(proj_def.encode('ascii'))
|
|
171
|
+
if not self._proj:
|
|
172
|
+
errno = libproj.pj_get_errno_ref().contents
|
|
173
|
+
raise ProjInitError('error initializing Proj(proj_def=%r, init=%r): %s' %
|
|
174
|
+
(proj_def, init, libproj.pj_strerrno(errno)))
|
|
175
|
+
|
|
176
|
+
self.srs = self._srs()
|
|
177
|
+
self._latlong = bool(libproj.pj_is_latlong(self._proj))
|
|
178
|
+
|
|
179
|
+
def is_latlong(self):
|
|
180
|
+
"""
|
|
181
|
+
>>> Proj(init='epsg:4326').is_latlong()
|
|
182
|
+
True
|
|
183
|
+
>>> Proj(init='epsg:4258').is_latlong()
|
|
184
|
+
True
|
|
185
|
+
>>> Proj(init='epsg:31467').is_latlong()
|
|
186
|
+
False
|
|
187
|
+
>>> Proj('+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 '
|
|
188
|
+
... '+lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m '
|
|
189
|
+
... '+nadgrids=@null +no_defs').is_latlong()
|
|
190
|
+
False
|
|
191
|
+
"""
|
|
192
|
+
return self._latlong
|
|
193
|
+
|
|
194
|
+
def _srs(self):
|
|
195
|
+
res = libproj.pj_get_def(self._proj, 0)
|
|
196
|
+
srs_def = ctypes.c_char_p(res).value
|
|
197
|
+
libproj.pj_dalloc(res)
|
|
198
|
+
return srs_def
|
|
199
|
+
|
|
200
|
+
def __del__(self):
|
|
201
|
+
if self._proj and libproj:
|
|
202
|
+
libproj.pj_free(self._proj)
|
|
203
|
+
self._proj = None
|
|
204
|
+
|
|
205
|
+
def transform(from_srs, to_srs, x, y, z=None):
|
|
206
|
+
if from_srs == to_srs:
|
|
207
|
+
return (x, y) if z is None else (x, y, z)
|
|
208
|
+
|
|
209
|
+
if isinstance(x, (float, int)):
|
|
210
|
+
x = [x]
|
|
211
|
+
y = [y]
|
|
212
|
+
assert len(x) == len(y)
|
|
213
|
+
|
|
214
|
+
if from_srs.is_latlong():
|
|
215
|
+
x = [x*DEG_TO_RAD for x in x]
|
|
216
|
+
y = [y*DEG_TO_RAD for y in y]
|
|
217
|
+
|
|
218
|
+
x = (c_double * len(x))(*x)
|
|
219
|
+
y = (c_double * len(y))(*y)
|
|
220
|
+
if z is not None:
|
|
221
|
+
z = (c_double * len(z))(*z)
|
|
222
|
+
else:
|
|
223
|
+
# use explicit null pointer instead of None
|
|
224
|
+
# http://bugs.python.org/issue4606
|
|
225
|
+
z = c_double_p()
|
|
226
|
+
|
|
227
|
+
res = libproj.pj_transform(from_srs._proj, to_srs._proj,
|
|
228
|
+
len(x), 0, x, y, z)
|
|
229
|
+
|
|
230
|
+
if res:
|
|
231
|
+
raise ProjError(libproj.pj_strerrno(res))
|
|
232
|
+
|
|
233
|
+
if to_srs.is_latlong():
|
|
234
|
+
x = [x*RAD_TO_DEG for x in x]
|
|
235
|
+
y = [y*RAD_TO_DEG for y in y]
|
|
236
|
+
else:
|
|
237
|
+
x = x[:]
|
|
238
|
+
y = y[:]
|
|
239
|
+
|
|
240
|
+
if len(x) == 1:
|
|
241
|
+
x = x[0]
|
|
242
|
+
y = y[0]
|
|
243
|
+
z = z[0] if z else None
|
|
244
|
+
|
|
245
|
+
return (x, y) if z is None else (x, y, z)
|
|
246
|
+
|
|
247
|
+
def set_datapath(path):
|
|
248
|
+
global _finder_callback_set
|
|
249
|
+
if not _finder_callback_set:
|
|
250
|
+
libproj.pj_set_finder(finder_func)
|
|
251
|
+
_finder_callback_set = True
|
|
252
|
+
search_path.set_searchpath(path)
|
|
253
|
+
|
|
254
|
+
return Proj, transform, set_datapath
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
proj_imports = []
|
|
258
|
+
|
|
259
|
+
if 'MAPPROXY_USE_LIBPROJ' in os.environ:
|
|
260
|
+
proj_imports = [try_libproj_import]
|
|
261
|
+
|
|
262
|
+
if 'MAPPROXY_USE_PYPROJ' in os.environ:
|
|
263
|
+
proj_imports = [try_pyproj_import, try_pyproj4_import]
|
|
264
|
+
|
|
265
|
+
if not proj_imports:
|
|
266
|
+
if sys.platform == 'win32':
|
|
267
|
+
# prefer pyproj on windows
|
|
268
|
+
proj_imports = [try_pyproj_import, try_pyproj4_import, try_libproj_import]
|
|
269
|
+
else:
|
|
270
|
+
proj_imports = [try_pyproj_import, try_libproj_import, try_pyproj4_import]
|
|
271
|
+
|
|
272
|
+
# try different imports in previously defined order
|
|
273
|
+
for try_import in proj_imports:
|
|
274
|
+
if try_import == try_pyproj_import:
|
|
275
|
+
res = try_import()
|
|
276
|
+
if res:
|
|
277
|
+
CRS, Transformer, set_datapath = res
|
|
278
|
+
Proj, transform = None, None
|
|
279
|
+
USE_PROJ4_API = False
|
|
280
|
+
break
|
|
281
|
+
else:
|
|
282
|
+
res = try_import()
|
|
283
|
+
if res:
|
|
284
|
+
Proj, transform, set_datapath = res
|
|
285
|
+
CRS, Transformer = None, None
|
|
286
|
+
USE_PROJ4_API = True
|
|
287
|
+
break
|
|
288
|
+
else:
|
|
289
|
+
raise ImportError('could not find pyproj (Python library) or libproj (C library, deprecated)')
|
|
290
|
+
|
|
291
|
+
if __name__ == '__main__':
|
|
292
|
+
|
|
293
|
+
prj1 = Proj(init='epsg:4326')
|
|
294
|
+
prj2 = Proj(init='epsg:31467')
|
|
295
|
+
|
|
296
|
+
coords = [(8.2, 8.22, 8.3), (53.1, 53.15, 53.2)]
|
|
297
|
+
# coords = [(8, 9, 10), (50, 50, 50)]
|
|
298
|
+
print(coords)
|
|
299
|
+
coords = transform(prj1, prj2, *coords)
|
|
300
|
+
print(coords)
|
|
301
|
+
coords = transform(prj2, prj1, *coords)
|
|
302
|
+
print(coords)
|
|
@@ -0,0 +1,18 @@
|
|
|
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 mapproxy.request.base import Request, url_decode
|
|
17
|
+
|
|
18
|
+
__all__ = ['Request', 'url_decode']
|
|
@@ -0,0 +1,259 @@
|
|
|
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 functools import partial as fp
|
|
17
|
+
from mapproxy.compat import string_type
|
|
18
|
+
from mapproxy.compat.modules import urlparse
|
|
19
|
+
from mapproxy.request.base import RequestParams, BaseRequest
|
|
20
|
+
from mapproxy.srs import make_lin_transf
|
|
21
|
+
|
|
22
|
+
class ArcGISExportRequestParams(RequestParams):
|
|
23
|
+
"""
|
|
24
|
+
Supported params f, bbox(required), size, dpi, imageSR, bboxSR, format, layerDefs,
|
|
25
|
+
layers, transparent, time, layerTimeOptions.
|
|
26
|
+
|
|
27
|
+
@param layers: Determines which layers appear on the exported map. There are
|
|
28
|
+
four ways to specify layers: show, hide, include, exclude.
|
|
29
|
+
(ex show:1,2)
|
|
30
|
+
"""
|
|
31
|
+
def _get_format(self):
|
|
32
|
+
"""
|
|
33
|
+
The requested format as string (w/o any 'image/', 'text/', etc prefixes)
|
|
34
|
+
"""
|
|
35
|
+
return self["format"]
|
|
36
|
+
def _set_format(self, format):
|
|
37
|
+
self["format"] = format.rsplit("/")[-1]
|
|
38
|
+
format = property(_get_format, _set_format)
|
|
39
|
+
del _get_format
|
|
40
|
+
del _set_format
|
|
41
|
+
|
|
42
|
+
def _get_bbox(self):
|
|
43
|
+
"""
|
|
44
|
+
``bbox`` as a tuple (minx, miny, maxx, maxy).
|
|
45
|
+
"""
|
|
46
|
+
if 'bbox' not in self.params or self.params['bbox'] is None:
|
|
47
|
+
return None
|
|
48
|
+
points = [float(val) for val in self.params['bbox'].split(',')]
|
|
49
|
+
return tuple(points[:4])
|
|
50
|
+
def _set_bbox(self, value):
|
|
51
|
+
if value is not None and not isinstance(value, string_type):
|
|
52
|
+
value = ','.join(str(x) for x in value)
|
|
53
|
+
self['bbox'] = value
|
|
54
|
+
bbox = property(_get_bbox, _set_bbox)
|
|
55
|
+
del _get_bbox
|
|
56
|
+
del _set_bbox
|
|
57
|
+
|
|
58
|
+
def _get_size(self):
|
|
59
|
+
"""
|
|
60
|
+
Size of the request in pixel as a tuple (width, height),
|
|
61
|
+
or None if one is missing.
|
|
62
|
+
"""
|
|
63
|
+
if 'size' not in self.params or self.params['size'] is None:
|
|
64
|
+
return None
|
|
65
|
+
dim = [float(val) for val in self.params['size'].split(',')]
|
|
66
|
+
return tuple(dim[:2])
|
|
67
|
+
def _set_size(self, value):
|
|
68
|
+
if value is not None and not isinstance(value, string_type):
|
|
69
|
+
value = ','.join(str(x) for x in value)
|
|
70
|
+
self['size'] = value
|
|
71
|
+
size = property(_get_size, _set_size)
|
|
72
|
+
del _get_size
|
|
73
|
+
del _set_size
|
|
74
|
+
|
|
75
|
+
def _get_srs(self, key):
|
|
76
|
+
return self.params.get(key, None)
|
|
77
|
+
def _set_srs(self, srs, key):
|
|
78
|
+
if hasattr(srs, 'srs_code'):
|
|
79
|
+
code = srs.srs_code
|
|
80
|
+
else:
|
|
81
|
+
code = srs
|
|
82
|
+
self.params[key] = code.rsplit(":", 1)[-1]
|
|
83
|
+
|
|
84
|
+
bboxSR = property(fp(_get_srs, key="bboxSR"), fp(_set_srs, key="bboxSR"))
|
|
85
|
+
imageSR = property(fp(_get_srs, key="imageSR"), fp(_set_srs, key="imageSR"))
|
|
86
|
+
del _get_srs
|
|
87
|
+
del _set_srs
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class ArcGISIdentifyRequestParams(ArcGISExportRequestParams):
|
|
92
|
+
def _get_format(self):
|
|
93
|
+
"""
|
|
94
|
+
The requested format as string (w/o any 'image/', 'text/', etc prefixes)
|
|
95
|
+
"""
|
|
96
|
+
return self["format"]
|
|
97
|
+
def _set_format(self, format):
|
|
98
|
+
self["format"] = format.rsplit("/")[-1]
|
|
99
|
+
format = property(_get_format, _set_format)
|
|
100
|
+
del _get_format
|
|
101
|
+
del _set_format
|
|
102
|
+
|
|
103
|
+
def _get_bbox(self):
|
|
104
|
+
"""
|
|
105
|
+
``bbox`` as a tuple (minx, miny, maxx, maxy).
|
|
106
|
+
"""
|
|
107
|
+
if 'mapExtent' not in self.params or self.params['mapExtent'] is None:
|
|
108
|
+
return None
|
|
109
|
+
points = [float(val) for val in self.params['mapExtent'].split(',')]
|
|
110
|
+
return tuple(points[:4])
|
|
111
|
+
def _set_bbox(self, value):
|
|
112
|
+
if value is not None and not isinstance(value, string_type):
|
|
113
|
+
value = ','.join(str(x) for x in value)
|
|
114
|
+
self['mapExtent'] = value
|
|
115
|
+
bbox = property(_get_bbox, _set_bbox)
|
|
116
|
+
del _get_bbox
|
|
117
|
+
del _set_bbox
|
|
118
|
+
|
|
119
|
+
def _get_size(self):
|
|
120
|
+
"""
|
|
121
|
+
Size of the request in pixel as a tuple (width, height),
|
|
122
|
+
or None if one is missing.
|
|
123
|
+
"""
|
|
124
|
+
if 'imageDisplay' not in self.params or self.params['imageDisplay'] is None:
|
|
125
|
+
return None
|
|
126
|
+
dim = [float(val) for val in self.params['imageDisplay'].split(',')]
|
|
127
|
+
return tuple(dim[:2])
|
|
128
|
+
def _set_size(self, value):
|
|
129
|
+
if value is not None and not isinstance(value, string_type):
|
|
130
|
+
value = ','.join(str(x) for x in value) + ',96'
|
|
131
|
+
self['imageDisplay'] = value
|
|
132
|
+
size = property(_get_size, _set_size)
|
|
133
|
+
del _get_size
|
|
134
|
+
del _set_size
|
|
135
|
+
|
|
136
|
+
def _get_pos(self):
|
|
137
|
+
size = self.size
|
|
138
|
+
vals = self['geometry'].split(',')
|
|
139
|
+
x, y = float(vals[0]), float(vals[1])
|
|
140
|
+
return make_lin_transf(self.bbox, (0, 0, size[0], size[1]))((x, y))
|
|
141
|
+
|
|
142
|
+
def _set_pos(self, value):
|
|
143
|
+
size = self.size
|
|
144
|
+
req_coord = make_lin_transf((0, 0, size[0], size[1]), self.bbox)(value)
|
|
145
|
+
self['geometry'] = '%f,%f' % req_coord
|
|
146
|
+
pos = property(_get_pos, _set_pos)
|
|
147
|
+
del _get_pos
|
|
148
|
+
del _set_pos
|
|
149
|
+
|
|
150
|
+
@property
|
|
151
|
+
def srs(self):
|
|
152
|
+
srs = self.params.get('sr', None)
|
|
153
|
+
if srs:
|
|
154
|
+
return 'EPSG:%s' % srs
|
|
155
|
+
|
|
156
|
+
@srs.setter
|
|
157
|
+
def srs(self, srs):
|
|
158
|
+
if hasattr(srs, 'srs_code'):
|
|
159
|
+
code = srs.srs_code
|
|
160
|
+
else:
|
|
161
|
+
code = srs
|
|
162
|
+
self.params['sr'] = code.rsplit(':', 1)[-1]
|
|
163
|
+
|
|
164
|
+
class ArcGISRequest(BaseRequest):
|
|
165
|
+
request_params = ArcGISExportRequestParams
|
|
166
|
+
fixed_params = {"f": "image"}
|
|
167
|
+
|
|
168
|
+
def __init__(self, param=None, url='', validate=False, http=None):
|
|
169
|
+
BaseRequest.__init__(self, param, url, validate, http)
|
|
170
|
+
|
|
171
|
+
self.url = rest_endpoint(url)
|
|
172
|
+
|
|
173
|
+
def copy(self):
|
|
174
|
+
return self.__class__(param=self.params.copy(), url=self.url)
|
|
175
|
+
|
|
176
|
+
@property
|
|
177
|
+
def query_string(self):
|
|
178
|
+
params = self.params.copy()
|
|
179
|
+
for key, value in self.fixed_params.items():
|
|
180
|
+
params[key] = value
|
|
181
|
+
return params.query_string
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
class ArcGISIdentifyRequest(BaseRequest):
|
|
185
|
+
request_params = ArcGISIdentifyRequestParams
|
|
186
|
+
fixed_params = {'geometryType': 'esriGeometryPoint'}
|
|
187
|
+
def __init__(self, param=None, url='', validate=False, http=None):
|
|
188
|
+
BaseRequest.__init__(self, param, url, validate, http)
|
|
189
|
+
|
|
190
|
+
self.url = rest_identify_endpoint(url)
|
|
191
|
+
|
|
192
|
+
def copy(self):
|
|
193
|
+
return self.__class__(param=self.params.copy(), url=self.url)
|
|
194
|
+
|
|
195
|
+
@property
|
|
196
|
+
def query_string(self):
|
|
197
|
+
params = self.params.copy()
|
|
198
|
+
for key, value in self.fixed_params.items():
|
|
199
|
+
params[key] = value
|
|
200
|
+
return params.query_string
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def create_identify_request(req_data, param):
|
|
205
|
+
req_data = req_data.copy()
|
|
206
|
+
|
|
207
|
+
# Pop the URL off the request data.
|
|
208
|
+
url = req_data['url']
|
|
209
|
+
del req_data['url']
|
|
210
|
+
|
|
211
|
+
return ArcGISIdentifyRequest(url=url, param=req_data)
|
|
212
|
+
|
|
213
|
+
def create_request(req_data, param):
|
|
214
|
+
req_data = req_data.copy()
|
|
215
|
+
|
|
216
|
+
# Pop the URL off the request data.
|
|
217
|
+
url = req_data['url']
|
|
218
|
+
del req_data['url']
|
|
219
|
+
|
|
220
|
+
if 'format' in param:
|
|
221
|
+
req_data['format'] = param['format']
|
|
222
|
+
|
|
223
|
+
if 'transparent' in req_data:
|
|
224
|
+
# Convert boolean to a string.
|
|
225
|
+
req_data['transparent'] = str(req_data['transparent'])
|
|
226
|
+
|
|
227
|
+
return ArcGISRequest(url=url, param=req_data)
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def rest_endpoint(url):
|
|
231
|
+
parts = urlparse.urlsplit(url)
|
|
232
|
+
path = parts.path.rstrip('/').split('/')
|
|
233
|
+
|
|
234
|
+
if path[-1] in ('export', 'exportImage'):
|
|
235
|
+
if path[-2] == 'MapServer':
|
|
236
|
+
path[-1] = 'export'
|
|
237
|
+
elif path[-2] == 'ImageServer':
|
|
238
|
+
path[-1] = 'exportImage'
|
|
239
|
+
elif path[-1] == 'MapServer':
|
|
240
|
+
path.append('export')
|
|
241
|
+
elif path[-1] == 'ImageServer':
|
|
242
|
+
path.append('exportImage')
|
|
243
|
+
|
|
244
|
+
parts = parts[0], parts[1], '/'.join(path), parts[3], parts[4]
|
|
245
|
+
return urlparse.urlunsplit(parts)
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def rest_identify_endpoint(url):
|
|
249
|
+
parts = urlparse.urlsplit(url)
|
|
250
|
+
path = parts.path.rstrip('/').split('/')
|
|
251
|
+
|
|
252
|
+
if path[-1] in ('export', 'exportImage'):
|
|
253
|
+
path[-1] = 'identify'
|
|
254
|
+
elif path[-1] in ('MapServer', 'ImageServer'):
|
|
255
|
+
path.append('identify')
|
|
256
|
+
|
|
257
|
+
parts = parts[0], parts[1], '/'.join(path), parts[3], parts[4]
|
|
258
|
+
return urlparse.urlunsplit(parts)
|
|
259
|
+
|