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.
Files changed (459) hide show
  1. MapProxy-2.1.0.dist-info/AUTHORS.txt +33 -0
  2. MapProxy-2.1.0.dist-info/COPYING.txt +60 -0
  3. MapProxy-2.1.0.dist-info/LICENSE.txt +202 -0
  4. MapProxy-2.1.0.dist-info/METADATA +165 -0
  5. MapProxy-2.1.0.dist-info/RECORD +459 -0
  6. MapProxy-2.1.0.dist-info/WHEEL +5 -0
  7. MapProxy-2.1.0.dist-info/entry_points.txt +4 -0
  8. MapProxy-2.1.0.dist-info/top_level.txt +1 -0
  9. mapproxy/__init__.py +0 -0
  10. mapproxy/cache/__init__.py +36 -0
  11. mapproxy/cache/azureblob.py +145 -0
  12. mapproxy/cache/base.py +120 -0
  13. mapproxy/cache/compact.py +665 -0
  14. mapproxy/cache/couchdb.py +301 -0
  15. mapproxy/cache/dummy.py +36 -0
  16. mapproxy/cache/file.py +200 -0
  17. mapproxy/cache/geopackage.py +647 -0
  18. mapproxy/cache/legend.py +87 -0
  19. mapproxy/cache/mbtiles.py +411 -0
  20. mapproxy/cache/meta.py +80 -0
  21. mapproxy/cache/path.py +261 -0
  22. mapproxy/cache/redis.py +152 -0
  23. mapproxy/cache/renderd.py +100 -0
  24. mapproxy/cache/riak.py +206 -0
  25. mapproxy/cache/s3.py +209 -0
  26. mapproxy/cache/tile.py +736 -0
  27. mapproxy/client/__init__.py +0 -0
  28. mapproxy/client/arcgis.py +82 -0
  29. mapproxy/client/cgi.py +141 -0
  30. mapproxy/client/http.py +295 -0
  31. mapproxy/client/log.py +33 -0
  32. mapproxy/client/tile.py +158 -0
  33. mapproxy/client/wms.py +255 -0
  34. mapproxy/compat/__init__.py +0 -0
  35. mapproxy/compat/image.py +86 -0
  36. mapproxy/config/__init__.py +22 -0
  37. mapproxy/config/config-schema.json +813 -0
  38. mapproxy/config/config.py +213 -0
  39. mapproxy/config/coverage.py +108 -0
  40. mapproxy/config/defaults.py +102 -0
  41. mapproxy/config/loader.py +2399 -0
  42. mapproxy/config/spec.py +657 -0
  43. mapproxy/config/validator.py +242 -0
  44. mapproxy/config_template/__init__.py +0 -0
  45. mapproxy/config_template/base_config/config.wsgi +10 -0
  46. mapproxy/config_template/base_config/full_example.yaml +598 -0
  47. mapproxy/config_template/base_config/full_seed_example.yaml +79 -0
  48. mapproxy/config_template/base_config/log.ini +35 -0
  49. mapproxy/config_template/base_config/mapproxy.yaml +60 -0
  50. mapproxy/config_template/base_config/seed.yaml +27 -0
  51. mapproxy/exception.py +149 -0
  52. mapproxy/featureinfo.py +251 -0
  53. mapproxy/grid.py +1199 -0
  54. mapproxy/image/__init__.py +549 -0
  55. mapproxy/image/fonts/DejaVuSans.ttf +0 -0
  56. mapproxy/image/fonts/DejaVuSansMono.ttf +0 -0
  57. mapproxy/image/fonts/LICENSE +99 -0
  58. mapproxy/image/fonts/__init__.py +0 -0
  59. mapproxy/image/mask.py +79 -0
  60. mapproxy/image/merge.py +323 -0
  61. mapproxy/image/message.py +357 -0
  62. mapproxy/image/opts.py +185 -0
  63. mapproxy/image/tile.py +171 -0
  64. mapproxy/image/transform.py +350 -0
  65. mapproxy/layer.py +489 -0
  66. mapproxy/multiapp.py +230 -0
  67. mapproxy/proj.py +309 -0
  68. mapproxy/request/__init__.py +18 -0
  69. mapproxy/request/arcgis.py +268 -0
  70. mapproxy/request/base.py +466 -0
  71. mapproxy/request/tile.py +131 -0
  72. mapproxy/request/wms/__init__.py +829 -0
  73. mapproxy/request/wms/exception.py +107 -0
  74. mapproxy/request/wmts.py +442 -0
  75. mapproxy/response.py +237 -0
  76. mapproxy/script/__init__.py +0 -0
  77. mapproxy/script/conf/__init__.py +0 -0
  78. mapproxy/script/conf/app.py +222 -0
  79. mapproxy/script/conf/caches.py +44 -0
  80. mapproxy/script/conf/geopackage.py +136 -0
  81. mapproxy/script/conf/layers.py +54 -0
  82. mapproxy/script/conf/seeds.py +36 -0
  83. mapproxy/script/conf/sources.py +88 -0
  84. mapproxy/script/conf/utils.py +148 -0
  85. mapproxy/script/defrag.py +187 -0
  86. mapproxy/script/export.py +337 -0
  87. mapproxy/script/grids.py +198 -0
  88. mapproxy/script/scales.py +134 -0
  89. mapproxy/script/util.py +410 -0
  90. mapproxy/script/wms_capabilities.py +160 -0
  91. mapproxy/seed/__init__.py +0 -0
  92. mapproxy/seed/cachelock.py +127 -0
  93. mapproxy/seed/cleanup.py +191 -0
  94. mapproxy/seed/config.py +481 -0
  95. mapproxy/seed/script.py +391 -0
  96. mapproxy/seed/seeder.py +551 -0
  97. mapproxy/seed/spec.py +66 -0
  98. mapproxy/seed/util.py +266 -0
  99. mapproxy/service/__init__.py +14 -0
  100. mapproxy/service/base.py +45 -0
  101. mapproxy/service/demo.py +364 -0
  102. mapproxy/service/kml.py +333 -0
  103. mapproxy/service/ows.py +39 -0
  104. mapproxy/service/template_helper.py +55 -0
  105. mapproxy/service/templates/demo/capabilities_demo.html +18 -0
  106. mapproxy/service/templates/demo/demo.html +181 -0
  107. mapproxy/service/templates/demo/openlayers-demo.cfg +16 -0
  108. mapproxy/service/templates/demo/static/img/blank.gif +0 -0
  109. mapproxy/service/templates/demo/static/img/east-mini.png +0 -0
  110. mapproxy/service/templates/demo/static/img/north-mini.png +0 -0
  111. mapproxy/service/templates/demo/static/img/south-mini.png +0 -0
  112. mapproxy/service/templates/demo/static/img/west-mini.png +0 -0
  113. mapproxy/service/templates/demo/static/img/zoom-minus-mini.png +0 -0
  114. mapproxy/service/templates/demo/static/img/zoom-plus-mini.png +0 -0
  115. mapproxy/service/templates/demo/static/img/zoom-world-mini.png +0 -0
  116. mapproxy/service/templates/demo/static/logo.png +0 -0
  117. mapproxy/service/templates/demo/static/ol.css +345 -0
  118. mapproxy/service/templates/demo/static/ol.js +4 -0
  119. mapproxy/service/templates/demo/static/proj4.min.js +1 -0
  120. mapproxy/service/templates/demo/static/proj4defs.js +1 -0
  121. mapproxy/service/templates/demo/static/site.css +137 -0
  122. mapproxy/service/templates/demo/static/theme/default/framedCloud.css +0 -0
  123. mapproxy/service/templates/demo/static/theme/default/google.css +17 -0
  124. mapproxy/service/templates/demo/static/theme/default/ie6-style.css +10 -0
  125. mapproxy/service/templates/demo/static/theme/default/style.css +482 -0
  126. mapproxy/service/templates/demo/static.html +34 -0
  127. mapproxy/service/templates/demo/tms_demo.html +117 -0
  128. mapproxy/service/templates/demo/wms_demo.html +144 -0
  129. mapproxy/service/templates/demo/wmts_demo.html +118 -0
  130. mapproxy/service/templates/tms_capabilities.xml +13 -0
  131. mapproxy/service/templates/tms_exception.xml +4 -0
  132. mapproxy/service/templates/tms_root_resource.xml +7 -0
  133. mapproxy/service/templates/tms_tilemap_capabilities.xml +14 -0
  134. mapproxy/service/templates/wms100capabilities.xml +112 -0
  135. mapproxy/service/templates/wms100exception.xml +4 -0
  136. mapproxy/service/templates/wms110capabilities.xml +152 -0
  137. mapproxy/service/templates/wms110exception.xml +5 -0
  138. mapproxy/service/templates/wms111capabilities.xml +183 -0
  139. mapproxy/service/templates/wms111exception.xml +5 -0
  140. mapproxy/service/templates/wms130capabilities.xml +326 -0
  141. mapproxy/service/templates/wms130exception.xml +8 -0
  142. mapproxy/service/templates/wmts100capabilities.xml +155 -0
  143. mapproxy/service/templates/wmts100exception.xml +9 -0
  144. mapproxy/service/tile.py +540 -0
  145. mapproxy/service/wms.py +868 -0
  146. mapproxy/service/wmts.py +387 -0
  147. mapproxy/source/__init__.py +83 -0
  148. mapproxy/source/arcgis.py +39 -0
  149. mapproxy/source/error.py +40 -0
  150. mapproxy/source/mapnik.py +262 -0
  151. mapproxy/source/tile.py +97 -0
  152. mapproxy/source/wms.py +273 -0
  153. mapproxy/srs.py +734 -0
  154. mapproxy/template.py +54 -0
  155. mapproxy/test/__init__.py +0 -0
  156. mapproxy/test/conftest.py +8 -0
  157. mapproxy/test/helper.py +255 -0
  158. mapproxy/test/http.py +511 -0
  159. mapproxy/test/image.py +219 -0
  160. mapproxy/test/mocker.py +2291 -0
  161. mapproxy/test/schemas/inspire/common/1.0/common.xsd +1461 -0
  162. mapproxy/test/schemas/inspire/common/1.0/enums/enum_bul.xsd +108 -0
  163. mapproxy/test/schemas/inspire/common/1.0/enums/enum_cze.xsd +108 -0
  164. mapproxy/test/schemas/inspire/common/1.0/enums/enum_dan.xsd +108 -0
  165. mapproxy/test/schemas/inspire/common/1.0/enums/enum_dut.xsd +108 -0
  166. mapproxy/test/schemas/inspire/common/1.0/enums/enum_eng.xsd +155 -0
  167. mapproxy/test/schemas/inspire/common/1.0/enums/enum_est.xsd +108 -0
  168. mapproxy/test/schemas/inspire/common/1.0/enums/enum_fin.xsd +108 -0
  169. mapproxy/test/schemas/inspire/common/1.0/enums/enum_fre.xsd +108 -0
  170. mapproxy/test/schemas/inspire/common/1.0/enums/enum_ger.xsd +108 -0
  171. mapproxy/test/schemas/inspire/common/1.0/enums/enum_gle.xsd +109 -0
  172. mapproxy/test/schemas/inspire/common/1.0/enums/enum_gre.xsd +108 -0
  173. mapproxy/test/schemas/inspire/common/1.0/enums/enum_hun.xsd +108 -0
  174. mapproxy/test/schemas/inspire/common/1.0/enums/enum_ita.xsd +108 -0
  175. mapproxy/test/schemas/inspire/common/1.0/enums/enum_lav.xsd +108 -0
  176. mapproxy/test/schemas/inspire/common/1.0/enums/enum_lit.xsd +108 -0
  177. mapproxy/test/schemas/inspire/common/1.0/enums/enum_mlt.xsd +108 -0
  178. mapproxy/test/schemas/inspire/common/1.0/enums/enum_pol.xsd +108 -0
  179. mapproxy/test/schemas/inspire/common/1.0/enums/enum_por.xsd +108 -0
  180. mapproxy/test/schemas/inspire/common/1.0/enums/enum_rum.xsd +108 -0
  181. mapproxy/test/schemas/inspire/common/1.0/enums/enum_slo.xsd +108 -0
  182. mapproxy/test/schemas/inspire/common/1.0/enums/enum_slv.xsd +108 -0
  183. mapproxy/test/schemas/inspire/common/1.0/enums/enum_spa.xsd +108 -0
  184. mapproxy/test/schemas/inspire/common/1.0/enums/enum_swe.xsd +108 -0
  185. mapproxy/test/schemas/inspire/common/1.0/network.xsd +521 -0
  186. mapproxy/test/schemas/inspire/inspire_vs/1.0/inspire_vs.xsd +19 -0
  187. mapproxy/test/schemas/kml/2.2.0/ReadMe.txt +14 -0
  188. mapproxy/test/schemas/kml/2.2.0/atom-author-link.xsd +66 -0
  189. mapproxy/test/schemas/kml/2.2.0/ogckml22.xsd +1646 -0
  190. mapproxy/test/schemas/kml/2.2.0/xAL.xsd +1680 -0
  191. mapproxy/test/schemas/ows/1.1.0/ReadMe.txt +87 -0
  192. mapproxy/test/schemas/ows/1.1.0/ows19115subset.xsd +235 -0
  193. mapproxy/test/schemas/ows/1.1.0/owsAll.xsd +23 -0
  194. mapproxy/test/schemas/ows/1.1.0/owsCommon.xsd +157 -0
  195. mapproxy/test/schemas/ows/1.1.0/owsContents.xsd +86 -0
  196. mapproxy/test/schemas/ows/1.1.0/owsDataIdentification.xsd +127 -0
  197. mapproxy/test/schemas/ows/1.1.0/owsDomainType.xsd +279 -0
  198. mapproxy/test/schemas/ows/1.1.0/owsExceptionReport.xsd +76 -0
  199. mapproxy/test/schemas/ows/1.1.0/owsGetCapabilities.xsd +112 -0
  200. mapproxy/test/schemas/ows/1.1.0/owsGetResourceByID.xsd +51 -0
  201. mapproxy/test/schemas/ows/1.1.0/owsInputOutputData.xsd +59 -0
  202. mapproxy/test/schemas/ows/1.1.0/owsManifest.xsd +125 -0
  203. mapproxy/test/schemas/ows/1.1.0/owsOperationsMetadata.xsd +140 -0
  204. mapproxy/test/schemas/ows/1.1.0/owsServiceIdentification.xsd +60 -0
  205. mapproxy/test/schemas/ows/1.1.0/owsServiceProvider.xsd +47 -0
  206. mapproxy/test/schemas/sld/1.1.0/sld_capabilities.xsd +27 -0
  207. mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.dtd +353 -0
  208. mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.xml +188 -0
  209. mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.dtd +524 -0
  210. mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.xml +260 -0
  211. mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.dtd +273 -0
  212. mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.xml +303 -0
  213. mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.dtd +6 -0
  214. mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.xml +33 -0
  215. mapproxy/test/schemas/wms/1.1.1/OGC-exception.xsd +68 -0
  216. mapproxy/test/schemas/wms/1.1.1/WMS_DescribeLayerResponse.dtd +22 -0
  217. mapproxy/test/schemas/wms/1.1.1/WMS_MS_Capabilities.dtd +274 -0
  218. mapproxy/test/schemas/wms/1.1.1/WMS_exception_1_1_1.dtd +5 -0
  219. mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.dtd +276 -0
  220. mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.xml +303 -0
  221. mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.dtd +6 -0
  222. mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.xml +33 -0
  223. mapproxy/test/schemas/wms/1.3.0/ReadMe.txt +8 -0
  224. mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xml +277 -0
  225. mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xsd +611 -0
  226. mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xml +34 -0
  227. mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xsd +28 -0
  228. mapproxy/test/schemas/wmsc/1.1.1/OGC-exception.xsd +68 -0
  229. mapproxy/test/schemas/wmsc/1.1.1/WMS_DescribeLayerResponse.dtd +22 -0
  230. mapproxy/test/schemas/wmsc/1.1.1/WMS_MS_Capabilities.dtd +283 -0
  231. mapproxy/test/schemas/wmsc/1.1.1/WMS_exception_1_1_1.dtd +5 -0
  232. mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.dtd +276 -0
  233. mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.xml +303 -0
  234. mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.dtd +6 -0
  235. mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.xml +33 -0
  236. mapproxy/test/schemas/wmts/1.0/ReadMe.txt +32 -0
  237. mapproxy/test/schemas/wmts/1.0/wmts.xsd +28 -0
  238. mapproxy/test/schemas/wmts/1.0/wmtsAbstract.wsdl +151 -0
  239. mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_request.xsd +38 -0
  240. mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_response.xsd +564 -0
  241. mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_request.xsd +57 -0
  242. mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_response.xsd +72 -0
  243. mapproxy/test/schemas/wmts/1.0/wmtsGetTile_request.xsd +91 -0
  244. mapproxy/test/schemas/wmts/1.0/wmtsKVP.xsd +76 -0
  245. mapproxy/test/schemas/wmts/1.0/wmtsPayload_response.xsd +70 -0
  246. mapproxy/test/schemas/xlink/1.0.0/ReadMe.txt +6 -0
  247. mapproxy/test/schemas/xlink/1.0.0/xlinks.xsd +122 -0
  248. mapproxy/test/schemas/xml.xsd +287 -0
  249. mapproxy/test/system/__init__.py +98 -0
  250. mapproxy/test/system/fixture/arcgis.yaml +57 -0
  251. mapproxy/test/system/fixture/auth.yaml +70 -0
  252. mapproxy/test/system/fixture/cache.mbtiles +0 -0
  253. mapproxy/test/system/fixture/cache_azureblob.yaml +59 -0
  254. mapproxy/test/system/fixture/cache_band_merge.yaml +73 -0
  255. mapproxy/test/system/fixture/cache_bulk_meta_tiles.yaml +24 -0
  256. mapproxy/test/system/fixture/cache_coverage.yaml +84 -0
  257. mapproxy/test/system/fixture/cache_data/dop_cache_EPSG3857/00/000/000/000/000/000/000.png +0 -0
  258. mapproxy/test/system/fixture/cache_data/wms_cache_EPSG900913/01/000/000/000/000/000/001.jpeg +0 -0
  259. mapproxy/test/system/fixture/cache_data/wms_cache_transparent_EPSG900913/01/000/000/000/000/000/001.png +0 -0
  260. mapproxy/test/system/fixture/cache_geopackage.yaml +56 -0
  261. mapproxy/test/system/fixture/cache_grid_names.yaml +50 -0
  262. mapproxy/test/system/fixture/cache_mbtiles.yaml +28 -0
  263. mapproxy/test/system/fixture/cache_s3.yaml +58 -0
  264. mapproxy/test/system/fixture/cache_source.yaml +81 -0
  265. mapproxy/test/system/fixture/combined_sources.yaml +130 -0
  266. mapproxy/test/system/fixture/coverage.yaml +77 -0
  267. mapproxy/test/system/fixture/demo.yaml +135 -0
  268. mapproxy/test/system/fixture/dimension.yaml +59 -0
  269. mapproxy/test/system/fixture/disable_storage.yaml +25 -0
  270. mapproxy/test/system/fixture/empty_ogrdata.geojson +1 -0
  271. mapproxy/test/system/fixture/formats.yaml +72 -0
  272. mapproxy/test/system/fixture/inspire.yaml +101 -0
  273. mapproxy/test/system/fixture/inspire_full.yaml +124 -0
  274. mapproxy/test/system/fixture/kml_layer.yaml +66 -0
  275. mapproxy/test/system/fixture/layer.yaml +260 -0
  276. mapproxy/test/system/fixture/layergroups.yaml +57 -0
  277. mapproxy/test/system/fixture/layergroups_root.yaml +106 -0
  278. mapproxy/test/system/fixture/legendgraphic.yaml +93 -0
  279. mapproxy/test/system/fixture/mapnik_source.yaml +66 -0
  280. mapproxy/test/system/fixture/mapproxy_export.yaml +12 -0
  281. mapproxy/test/system/fixture/mapserver.yaml +23 -0
  282. mapproxy/test/system/fixture/minimal_cgi.py +16 -0
  283. mapproxy/test/system/fixture/mixed_mode.yaml +49 -0
  284. mapproxy/test/system/fixture/multi_cache_layers.yaml +111 -0
  285. mapproxy/test/system/fixture/multiapp1.yaml +20 -0
  286. mapproxy/test/system/fixture/multiapp2.yaml +19 -0
  287. mapproxy/test/system/fixture/renderd_client.yaml +55 -0
  288. mapproxy/test/system/fixture/scalehints.yaml +70 -0
  289. mapproxy/test/system/fixture/seed.yaml +94 -0
  290. mapproxy/test/system/fixture/seed_mapproxy.yaml +39 -0
  291. mapproxy/test/system/fixture/seed_old.yaml +12 -0
  292. mapproxy/test/system/fixture/seed_timeouts.yaml +12 -0
  293. mapproxy/test/system/fixture/seed_timeouts_mapproxy.yaml +27 -0
  294. mapproxy/test/system/fixture/seedonly.yaml +51 -0
  295. mapproxy/test/system/fixture/sld.yaml +35 -0
  296. mapproxy/test/system/fixture/source_errors.yaml +84 -0
  297. mapproxy/test/system/fixture/source_errors_raise.yaml +82 -0
  298. mapproxy/test/system/fixture/tileservice_origin.yaml +26 -0
  299. mapproxy/test/system/fixture/tileservice_refresh.yaml +59 -0
  300. mapproxy/test/system/fixture/tilesource_minmax_res.yaml +22 -0
  301. mapproxy/test/system/fixture/util-conf-base-grids.yaml +5 -0
  302. mapproxy/test/system/fixture/util-conf-overwrite.yaml +13 -0
  303. mapproxy/test/system/fixture/util-conf-wms-111-cap.xml +90 -0
  304. mapproxy/test/system/fixture/util_grids.yaml +29 -0
  305. mapproxy/test/system/fixture/util_wms_capabilities111.xml +130 -0
  306. mapproxy/test/system/fixture/util_wms_capabilities130.xml +100 -0
  307. mapproxy/test/system/fixture/util_wms_capabilities_service_exception.xml +5 -0
  308. mapproxy/test/system/fixture/watermark.yaml +50 -0
  309. mapproxy/test/system/fixture/wms_srs_extent.yaml +39 -0
  310. mapproxy/test/system/fixture/wms_versions.yaml +38 -0
  311. mapproxy/test/system/fixture/wmts.yaml +134 -0
  312. mapproxy/test/system/fixture/wmts_dimensions.yaml +57 -0
  313. mapproxy/test/system/fixture/xslt_featureinfo.yaml +54 -0
  314. mapproxy/test/system/fixture/xslt_featureinfo_input.yaml +51 -0
  315. mapproxy/test/system/test_arcgis.py +156 -0
  316. mapproxy/test/system/test_auth.py +1133 -0
  317. mapproxy/test/system/test_behind_proxy.py +75 -0
  318. mapproxy/test/system/test_bulk_meta_tiles.py +106 -0
  319. mapproxy/test/system/test_cache_azureblob.py +127 -0
  320. mapproxy/test/system/test_cache_band_merge.py +103 -0
  321. mapproxy/test/system/test_cache_coverage.py +168 -0
  322. mapproxy/test/system/test_cache_geopackage.py +144 -0
  323. mapproxy/test/system/test_cache_grid_names.py +89 -0
  324. mapproxy/test/system/test_cache_mbtiles.py +85 -0
  325. mapproxy/test/system/test_cache_s3.py +115 -0
  326. mapproxy/test/system/test_cache_source.py +146 -0
  327. mapproxy/test/system/test_combined_sources.py +335 -0
  328. mapproxy/test/system/test_coverage.py +140 -0
  329. mapproxy/test/system/test_decorate_img.py +214 -0
  330. mapproxy/test/system/test_demo.py +56 -0
  331. mapproxy/test/system/test_demo_with_extra_service.py +57 -0
  332. mapproxy/test/system/test_dimensions.py +279 -0
  333. mapproxy/test/system/test_disable_storage.py +42 -0
  334. mapproxy/test/system/test_formats.py +219 -0
  335. mapproxy/test/system/test_inspire_vs.py +173 -0
  336. mapproxy/test/system/test_kml.py +264 -0
  337. mapproxy/test/system/test_layergroups.py +160 -0
  338. mapproxy/test/system/test_legendgraphic.py +308 -0
  339. mapproxy/test/system/test_mapnik.py +162 -0
  340. mapproxy/test/system/test_mapserver.py +83 -0
  341. mapproxy/test/system/test_mixed_mode_format.py +201 -0
  342. mapproxy/test/system/test_multi_cache_layers.py +169 -0
  343. mapproxy/test/system/test_multiapp.py +92 -0
  344. mapproxy/test/system/test_refresh.py +206 -0
  345. mapproxy/test/system/test_renderd_client.py +304 -0
  346. mapproxy/test/system/test_response_headers.py +54 -0
  347. mapproxy/test/system/test_scalehints.py +140 -0
  348. mapproxy/test/system/test_seed.py +425 -0
  349. mapproxy/test/system/test_seed_only.py +93 -0
  350. mapproxy/test/system/test_sld.py +120 -0
  351. mapproxy/test/system/test_source_errors.py +377 -0
  352. mapproxy/test/system/test_tilesource_minmax_res.py +54 -0
  353. mapproxy/test/system/test_tms.py +277 -0
  354. mapproxy/test/system/test_tms_origin.py +46 -0
  355. mapproxy/test/system/test_util_conf.py +434 -0
  356. mapproxy/test/system/test_util_export.py +210 -0
  357. mapproxy/test/system/test_util_grids.py +88 -0
  358. mapproxy/test/system/test_util_wms_capabilities.py +182 -0
  359. mapproxy/test/system/test_watermark.py +91 -0
  360. mapproxy/test/system/test_wms.py +1616 -0
  361. mapproxy/test/system/test_wms_srs_extent.py +165 -0
  362. mapproxy/test/system/test_wms_version.py +85 -0
  363. mapproxy/test/system/test_wmsc.py +116 -0
  364. mapproxy/test/system/test_wmts.py +334 -0
  365. mapproxy/test/system/test_wmts_dimensions.py +206 -0
  366. mapproxy/test/system/test_wmts_restful.py +198 -0
  367. mapproxy/test/system/test_xslt_featureinfo.py +423 -0
  368. mapproxy/test/test_http_helper.py +217 -0
  369. mapproxy/test/unit/__init__.py +0 -0
  370. mapproxy/test/unit/epsg +2 -0
  371. mapproxy/test/unit/polygons/polygons.dbf +0 -0
  372. mapproxy/test/unit/polygons/polygons.shp +0 -0
  373. mapproxy/test/unit/polygons/polygons.shx +0 -0
  374. mapproxy/test/unit/test_async.py +242 -0
  375. mapproxy/test/unit/test_auth.py +430 -0
  376. mapproxy/test/unit/test_cache.py +1356 -0
  377. mapproxy/test/unit/test_cache_azureblob.py +97 -0
  378. mapproxy/test/unit/test_cache_compact.py +324 -0
  379. mapproxy/test/unit/test_cache_couchdb.py +118 -0
  380. mapproxy/test/unit/test_cache_geopackage.py +256 -0
  381. mapproxy/test/unit/test_cache_redis.py +123 -0
  382. mapproxy/test/unit/test_cache_riak.py +80 -0
  383. mapproxy/test/unit/test_cache_s3.py +93 -0
  384. mapproxy/test/unit/test_cache_tile.py +477 -0
  385. mapproxy/test/unit/test_client.py +488 -0
  386. mapproxy/test/unit/test_client_arcgis.py +74 -0
  387. mapproxy/test/unit/test_client_cgi.py +140 -0
  388. mapproxy/test/unit/test_collections.py +116 -0
  389. mapproxy/test/unit/test_concat_legends.py +37 -0
  390. mapproxy/test/unit/test_conf_loader.py +1267 -0
  391. mapproxy/test/unit/test_conf_validator.py +427 -0
  392. mapproxy/test/unit/test_config.py +118 -0
  393. mapproxy/test/unit/test_decorate_img.py +185 -0
  394. mapproxy/test/unit/test_exceptions.py +270 -0
  395. mapproxy/test/unit/test_featureinfo.py +313 -0
  396. mapproxy/test/unit/test_file_lock_load.py +49 -0
  397. mapproxy/test/unit/test_geom.py +512 -0
  398. mapproxy/test/unit/test_grid.py +1279 -0
  399. mapproxy/test/unit/test_image.py +1051 -0
  400. mapproxy/test/unit/test_image_mask.py +181 -0
  401. mapproxy/test/unit/test_image_messages.py +209 -0
  402. mapproxy/test/unit/test_image_options.py +160 -0
  403. mapproxy/test/unit/test_isodate.py +118 -0
  404. mapproxy/test/unit/test_multiapp.py +163 -0
  405. mapproxy/test/unit/test_ogr_reader.py +51 -0
  406. mapproxy/test/unit/test_request.py +745 -0
  407. mapproxy/test/unit/test_request_wmts.py +178 -0
  408. mapproxy/test/unit/test_response.py +78 -0
  409. mapproxy/test/unit/test_seed.py +365 -0
  410. mapproxy/test/unit/test_seed_cachelock.py +91 -0
  411. mapproxy/test/unit/test_srs.py +215 -0
  412. mapproxy/test/unit/test_tiled_source.py +122 -0
  413. mapproxy/test/unit/test_tilefilter.py +31 -0
  414. mapproxy/test/unit/test_times.py +25 -0
  415. mapproxy/test/unit/test_timeutils.py +50 -0
  416. mapproxy/test/unit/test_util_conf_utils.py +75 -0
  417. mapproxy/test/unit/test_utils.py +476 -0
  418. mapproxy/test/unit/test_wms_capabilities.py +44 -0
  419. mapproxy/test/unit/test_wms_layer.py +113 -0
  420. mapproxy/test/unit/test_yaml.py +68 -0
  421. mapproxy/tilefilter.py +61 -0
  422. mapproxy/util/__init__.py +0 -0
  423. mapproxy/util/async_.py +229 -0
  424. mapproxy/util/collections.py +134 -0
  425. mapproxy/util/coverage.py +337 -0
  426. mapproxy/util/ext/__init__.py +14 -0
  427. mapproxy/util/ext/dictspec/__init__.py +1 -0
  428. mapproxy/util/ext/dictspec/spec.py +131 -0
  429. mapproxy/util/ext/dictspec/test/__init__.py +0 -0
  430. mapproxy/util/ext/dictspec/test/test_validator.py +278 -0
  431. mapproxy/util/ext/dictspec/validator.py +194 -0
  432. mapproxy/util/ext/local.py +198 -0
  433. mapproxy/util/ext/lockfile.py +140 -0
  434. mapproxy/util/ext/odict.py +321 -0
  435. mapproxy/util/ext/serving.py +491 -0
  436. mapproxy/util/ext/tempita/__init__.py +1093 -0
  437. mapproxy/util/ext/tempita/_looper.py +163 -0
  438. mapproxy/util/ext/tempita/string_utils.py +24 -0
  439. mapproxy/util/ext/wmsparse/__init__.py +3 -0
  440. mapproxy/util/ext/wmsparse/duration.py +600 -0
  441. mapproxy/util/ext/wmsparse/parse.py +307 -0
  442. mapproxy/util/ext/wmsparse/test/__init__.py +0 -0
  443. mapproxy/util/ext/wmsparse/test/test_parse.py +111 -0
  444. mapproxy/util/ext/wmsparse/test/test_util.py +23 -0
  445. mapproxy/util/ext/wmsparse/test/wms-example-111.xml +90 -0
  446. mapproxy/util/ext/wmsparse/test/wms-example-130.xml +120 -0
  447. mapproxy/util/ext/wmsparse/test/wms-large-111.xml +2114 -0
  448. mapproxy/util/ext/wmsparse/test/wms_nasa_cap.xml +386 -0
  449. mapproxy/util/ext/wmsparse/util.py +189 -0
  450. mapproxy/util/fs.py +164 -0
  451. mapproxy/util/geom.py +307 -0
  452. mapproxy/util/lib.py +117 -0
  453. mapproxy/util/lock.py +171 -0
  454. mapproxy/util/ogr.py +247 -0
  455. mapproxy/util/py.py +75 -0
  456. mapproxy/util/times.py +78 -0
  457. mapproxy/util/yaml.py +58 -0
  458. mapproxy/version.py +33 -0
  459. mapproxy/wsgiapp.py +167 -0
@@ -0,0 +1,333 @@
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
+ import re
17
+
18
+ from mapproxy.response import Response
19
+ from mapproxy.exception import RequestError, PlainExceptionHandler
20
+ from mapproxy.service.base import Server
21
+ from mapproxy.request.tile import TileRequest
22
+ from mapproxy.srs import SRS
23
+ from mapproxy.util.coverage import load_limited_to
24
+
25
+
26
+ class KMLRequest(TileRequest):
27
+ """
28
+ Class for TMS-like KML requests.
29
+ """
30
+ request_handler_name = 'map'
31
+ req_prefix = '/kml'
32
+ tile_req_re = re.compile(r'''^(?P<begin>/kml)/
33
+ (?P<layer>[^/]+)/
34
+ ((?P<layer_spec>[^/]+)/)?
35
+ (?P<z>-?\d+)/
36
+ (?P<x>-?\d+)/
37
+ (?P<y>-?\d+)\.(?P<format>\w+)''', re.VERBOSE)
38
+
39
+ def __init__(self, request):
40
+ TileRequest.__init__(self, request)
41
+ if self.format == 'kml':
42
+ self.request_handler_name = 'kml'
43
+
44
+ @property
45
+ def exception_handler(self):
46
+ return PlainExceptionHandler()
47
+
48
+
49
+ class KMLInitRequest(TileRequest):
50
+ """
51
+ Class for TMS-like KML requests.
52
+ """
53
+ request_handler_name = 'map'
54
+ req_prefix = '/kml'
55
+ tile_req_re = re.compile(r'''^(?P<begin>/kml)/
56
+ (?P<layer>[^/]+)
57
+ (/(?P<layer_spec>[^/]+))?
58
+ /?$
59
+ ''', re.VERBOSE)
60
+
61
+ def __init__(self, request):
62
+ self.http = request
63
+ self.tile = (0, 0, 0)
64
+ self.format = 'kml'
65
+ self.request_handler_name = 'kml'
66
+ self._init_request()
67
+
68
+ @property
69
+ def exception_handler(self):
70
+ return PlainExceptionHandler()
71
+
72
+
73
+ def kml_request(req):
74
+ if KMLInitRequest.tile_req_re.match(req.path):
75
+ return KMLInitRequest(req)
76
+ else:
77
+ return KMLRequest(req)
78
+
79
+
80
+ class KMLServer(Server):
81
+ """
82
+ OGC KML 2.2 Server
83
+ """
84
+ names = ('kml',)
85
+ request_parser = staticmethod(kml_request)
86
+ request_methods = ('map', 'kml')
87
+
88
+ def __init__(self, layers, md, max_tile_age=None, use_dimension_layers=False):
89
+ Server.__init__(self)
90
+ self.layers = layers
91
+ self.md = md
92
+ self.max_tile_age = max_tile_age
93
+ self.use_dimension_layers = use_dimension_layers
94
+
95
+ def map(self, map_request):
96
+ """
97
+ :return: the requested tile
98
+ """
99
+ # force 'sw' origin for kml
100
+ map_request.origin = 'sw'
101
+ layer = self.layer(map_request)
102
+ limit_to = self.authorize_tile_layer(layer, map_request)
103
+ tile = layer.render(map_request, coverage=limit_to)
104
+ tile_format = getattr(tile, 'format', map_request.format)
105
+ resp = Response(tile.as_buffer(),
106
+ content_type='image/' + tile_format)
107
+ resp.cache_headers(tile.timestamp, etag_data=(tile.timestamp, tile.size),
108
+ max_age=self.max_tile_age)
109
+ resp.make_conditional(map_request.http)
110
+ return resp
111
+
112
+ def authorize_tile_layer(self, tile_layer, request):
113
+ if 'mapproxy.authorize' in request.http.environ:
114
+ if request.tile:
115
+ query_extent = (tile_layer.grid.srs.srs_code,
116
+ tile_layer.tile_bbox(request, use_profiles=request.use_profiles))
117
+ else:
118
+ query_extent = None # for layer capabilities
119
+ result = request.http.environ['mapproxy.authorize']('kml', [tile_layer.name],
120
+ query_extent=query_extent, environ=request.http.environ)
121
+ if result['authorized'] == 'unauthenticated':
122
+ raise RequestError('unauthorized', status=401)
123
+ if result['authorized'] == 'full':
124
+ return
125
+ if result['authorized'] == 'partial':
126
+ if result['layers'].get(tile_layer.name, {}).get('tile', False) is True:
127
+ limited_to = result['layers'][tile_layer.name].get('limited_to')
128
+ if not limited_to:
129
+ limited_to = result.get('limited_to')
130
+ if limited_to:
131
+ return load_limited_to(limited_to)
132
+ else:
133
+ return None
134
+ raise RequestError('forbidden', status=403)
135
+
136
+ def _internal_layer(self, tile_request):
137
+ if '_layer_spec' in tile_request.dimensions:
138
+ name = tile_request.layer + '_' + tile_request.dimensions['_layer_spec']
139
+ else:
140
+ name = tile_request.layer
141
+ if name in self.layers:
142
+ return self.layers[name]
143
+ if name + '_EPSG4326' in self.layers:
144
+ return self.layers[name + '_EPSG4326']
145
+ if name + '_EPSG900913' in self.layers:
146
+ return self.layers[name + '_EPSG900913']
147
+ return None
148
+
149
+ def _internal_dimension_layer(self, tile_request):
150
+ key = (tile_request.layer, tile_request.dimensions.get('_layer_spec'))
151
+ return self.layers.get(key)
152
+
153
+ def layer(self, tile_request):
154
+ if self.use_dimension_layers:
155
+ internal_layer = self._internal_dimension_layer(tile_request)
156
+ else:
157
+ internal_layer = self._internal_layer(tile_request)
158
+ if internal_layer is None:
159
+ raise RequestError('unknown layer: ' + tile_request.layer, request=tile_request)
160
+ return internal_layer
161
+
162
+ def kml(self, map_request):
163
+ """
164
+ :return: the rendered KML response
165
+ """
166
+ # force 'sw' origin for kml
167
+ map_request.origin = 'sw'
168
+ layer = self.layer(map_request)
169
+ self.authorize_tile_layer(layer, map_request)
170
+
171
+ tile_coord = map_request.tile
172
+
173
+ initial_level = False
174
+ if tile_coord[2] == 0:
175
+ initial_level = True
176
+
177
+ bbox = self._tile_wgs_bbox(map_request, layer, limit=True)
178
+ if bbox is None:
179
+ raise RequestError('The requested tile is outside the bounding box '
180
+ 'of the tile map.', request=map_request)
181
+ tile = SubTile(tile_coord, bbox)
182
+
183
+ subtiles = self._get_subtiles(map_request, layer)
184
+ tile_size = layer.grid.tile_size[0]
185
+ url = map_request.http.script_url.rstrip('/')
186
+ result = KMLRenderer().render(
187
+ tile=tile, subtiles=subtiles, layer=layer, url=url, name=map_request.layer, format=layer.format,
188
+ name_path=layer.md['name_path'], initial_level=initial_level, tile_size=tile_size)
189
+ resp = Response(result, content_type='application/vnd.google-earth.kml+xml')
190
+ resp.cache_headers(etag_data=(result,), max_age=self.max_tile_age)
191
+ resp.make_conditional(map_request.http)
192
+ return resp
193
+
194
+ def _get_subtiles(self, tile_request, layer):
195
+ """
196
+ Create four `SubTile` for the next level of `tile`.
197
+ """
198
+ tile = tile_request.tile
199
+ bbox = layer.tile_bbox(tile_request, use_profiles=tile_request.use_profiles, limit=True)
200
+
201
+ level = layer.grid.internal_tile_coord((tile[0], tile[1], tile[2]+1), use_profiles=False)[2]
202
+ bbox_, tile_grid_, tiles = layer.grid.get_affected_level_tiles(bbox, level)
203
+ subtiles = []
204
+ for coord in tiles:
205
+ if coord is None:
206
+ continue
207
+ sub_bbox = layer.grid.tile_bbox(coord)
208
+ if sub_bbox is not None:
209
+ # only add subtiles where the lower left corner is in the bbox
210
+ # to prevent subtiles to appear in multiple KML docs
211
+ DELTA = -1.0/10e6
212
+ if (sub_bbox[0] - bbox[0]) > DELTA and (sub_bbox[1] - bbox[1]) > DELTA:
213
+ sub_bbox_wgs = self._tile_bbox_to_wgs(sub_bbox, layer.grid)
214
+ coord = layer.grid.external_tile_coord(coord, use_profiles=False)
215
+ if layer.grid.origin not in ('ll', 'sw', None):
216
+ coord = layer.grid.flip_tile_coord(coord)
217
+ subtiles.append(SubTile(coord, sub_bbox_wgs))
218
+
219
+ return subtiles
220
+
221
+ def _tile_wgs_bbox(self, tile_request, layer, limit=False):
222
+ bbox = layer.tile_bbox(tile_request, use_profiles=tile_request.use_profiles,
223
+ limit=limit)
224
+ if bbox is None:
225
+ return None
226
+ return self._tile_bbox_to_wgs(bbox, layer.grid)
227
+
228
+ def _tile_bbox_to_wgs(self, src_bbox, grid):
229
+ bbox = grid.srs.transform_bbox_to(SRS(4326), src_bbox, with_points=4)
230
+ if grid.srs == SRS(900913):
231
+ bbox = list(bbox)
232
+ if abs(src_bbox[1] - -20037508.342789244) < 0.1:
233
+ bbox[1] = -90.0
234
+ if abs(src_bbox[3] - 20037508.342789244) < 0.1:
235
+ bbox[3] = 90.0
236
+ return bbox
237
+
238
+ def check_map_request(self, map_request):
239
+ if map_request.layer not in self.layers:
240
+ raise RequestError('unknown layer: ' + map_request.layer, request=map_request)
241
+
242
+
243
+ class SubTile(object):
244
+ """
245
+ Contains the ``bbox`` and ``coord`` of a sub tile.
246
+ """
247
+
248
+ def __init__(self, coord, bbox):
249
+ self.coord = coord
250
+ self.bbox = bbox
251
+
252
+
253
+ class KMLRenderer(object):
254
+ header = """<?xml version="1.0"?>
255
+ <kml xmlns="http://www.opengis.net/kml/2.2">
256
+ <Document>
257
+ <name>%(layer_name)s</name>
258
+ <Region>
259
+ <LatLonAltBox>
260
+ <north>%(north)f</north><south>%(south)f</south>
261
+ <east>%(east)f</east><west>%(west)f</west>
262
+ </LatLonAltBox>
263
+ </Region>
264
+ """
265
+
266
+ network_link = """<NetworkLink>
267
+ <name>%(layer_name)s - %(coord)s</name>
268
+ <Region>
269
+ <LatLonAltBox>
270
+ <north>%(north)f</north><south>%(south)f</south>
271
+ <east>%(east)f</east><west>%(west)f</west>
272
+ </LatLonAltBox>
273
+ <Lod>
274
+ <minLodPixels>%(min_lod)d</minLodPixels>
275
+ <maxLodPixels>-1</maxLodPixels>
276
+ </Lod>
277
+ </Region>
278
+ <Link>
279
+ <href>%(href)s</href>
280
+ <viewRefreshMode>onRegion</viewRefreshMode>
281
+ <viewFormat/>
282
+ </Link>
283
+ </NetworkLink>
284
+ """
285
+ ground_overlay = """<GroundOverlay>
286
+ <name>%(coord)s</name>
287
+ <Region>
288
+ <LatLonAltBox>
289
+ <north>%(north)f</north><south>%(south)f</south>
290
+ <east>%(east)f</east><west>%(west)f</west>
291
+ </LatLonAltBox>
292
+ <Lod>
293
+ <minLodPixels>%(min_lod)d</minLodPixels>
294
+ <maxLodPixels>%(max_lod)d</maxLodPixels>
295
+ <minFadeExtent>8</minFadeExtent>
296
+ <maxFadeExtent>8</maxFadeExtent>
297
+ </Lod>
298
+ </Region>
299
+ <drawOrder>%(level)d</drawOrder>
300
+ <Icon>
301
+ <href>%(href)s</href>
302
+ </Icon>
303
+ <LatLonBox>
304
+ <north>%(north)f</north><south>%(south)f</south>
305
+ <east>%(east)f</east><west>%(west)f</west>
306
+ </LatLonBox>
307
+ </GroundOverlay>
308
+ """
309
+ footer = """</Document>
310
+ </kml>
311
+ """
312
+
313
+ def render(self, tile, subtiles, layer, url, name, name_path, format, initial_level, tile_size):
314
+ response = []
315
+ response.append(self.header % dict(east=tile.bbox[2], south=tile.bbox[1],
316
+ west=tile.bbox[0], north=tile.bbox[3], layer_name=name))
317
+
318
+ name_path = '/'.join(name_path)
319
+ for subtile in subtiles:
320
+ kml_href = '%s/kml/%s/%d/%d/%d.kml' % (url, name_path,
321
+ subtile.coord[2], subtile.coord[0], subtile.coord[1])
322
+ response.append(self.network_link % dict(
323
+ east=subtile.bbox[2], south=subtile.bbox[1], west=subtile.bbox[0], north=subtile.bbox[3],
324
+ min_lod=tile_size/2, href=kml_href, layer_name=name, coord=subtile.coord))
325
+
326
+ for subtile in subtiles:
327
+ tile_href = '%s/kml/%s/%d/%d/%d.%s' % (url, name_path,
328
+ subtile.coord[2], subtile.coord[0], subtile.coord[1], layer.format)
329
+ response.append(self.ground_overlay % dict(
330
+ east=subtile.bbox[2], south=subtile.bbox[1], west=subtile.bbox[0], north=subtile.bbox[3],
331
+ coord=subtile.coord, min_lod=tile_size/2, max_lod=tile_size*3, href=tile_href, level=subtile.coord[2]))
332
+ response.append(self.footer)
333
+ return ''.join(response)
@@ -0,0 +1,39 @@
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
+ """
17
+ Wrapper service handler for all OWS services (/service?).
18
+ """
19
+
20
+
21
+ class OWSServer(object):
22
+ """
23
+ Wraps all OWS services (/service?, /ows?, /wms?, /wmts?) and dispatches requests
24
+ based on the ``services`` query argument.
25
+ """
26
+
27
+ def __init__(self, services):
28
+ self.names = ['service', 'ows']
29
+ self.services = {}
30
+ for service in services:
31
+ if service.service == 'wms' and 'wms' not in self.names:
32
+ self.names.append('wms')
33
+ self.services[service.service] = service
34
+
35
+ def handle(self, req):
36
+ service = req.args.get('service', 'wms').lower()
37
+ assert service in self.services
38
+
39
+ return self.services[service].handle(req)
@@ -0,0 +1,55 @@
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.template import bunch
17
+
18
+ __all__ = ['indent', 'bunch', 'wms100format', 'wms100info_format', 'wms111metadatatype']
19
+
20
+
21
+ def indent(text, n=2):
22
+ return '\n'.join(' '*n + line for line in text.split('\n'))
23
+
24
+
25
+ def wms100format(format):
26
+ """
27
+ >>> wms100format('image/png')
28
+ 'PNG'
29
+ >>> wms100format('image/GeoTIFF')
30
+ """
31
+ _mime_class, sub_type = format.split('/')
32
+ sub_type = sub_type.upper()
33
+ if sub_type in ['PNG', 'TIFF', 'GIF', 'JPEG']:
34
+ return sub_type
35
+ else:
36
+ return None
37
+
38
+
39
+ def wms100info_format(format):
40
+ """
41
+ >>> wms100info_format('text/html')
42
+ 'MIME'
43
+ >>> wms100info_format('application/vnd.ogc.gml')
44
+ 'GML.1'
45
+ """
46
+ if format in ('application/vnd.ogc.gml', 'text/xml'):
47
+ return 'GML.1'
48
+ return 'MIME'
49
+
50
+
51
+ def wms111metadatatype(type):
52
+ if type == 'ISO19115:2003':
53
+ return 'TC211'
54
+ if type == 'FGDC:1998':
55
+ return 'FGDC'
@@ -0,0 +1,18 @@
1
+ {{py:
2
+ from html import escape
3
+ import textwrap
4
+
5
+ wrapper = textwrap.TextWrapper(replace_whitespace=False, width=90,
6
+ break_long_words=False)
7
+ menu_title = "Capabilities"
8
+ jscript_openlayers = None
9
+ jscript_functions = None
10
+ }}
11
+ <h2>{{service}} GetCapabilities</h2>
12
+ <a href="{{url}}">{{url}}</a>
13
+ <pre>
14
+ {{for line in capabilities}}
15
+ {{escape(wrapper.fill(line.decode('utf8')))}}
16
+ {{endfor}}
17
+ </pre>
18
+
@@ -0,0 +1,181 @@
1
+ {{py:
2
+
3
+ from urllib.parse import quote, quote_plus
4
+ from mapproxy.version import version
5
+
6
+ def strip(s):
7
+ return s.split('/')[1]
8
+
9
+ def replace(s):
10
+ return s.replace(':','')
11
+
12
+ menu_title=None
13
+ jscript_openlayers=None
14
+ }}
15
+ {{def jscript_functions}}
16
+ <script type="text/javascript">
17
+ /**
18
+ * Getting the closest parent with the given tag name.
19
+ */
20
+ function NeighborFormSubmit(obj)
21
+ {
22
+ var obj_parent = obj.parentNode;
23
+ if (!obj_parent) return false;
24
+ if (obj_parent.tagName.toLowerCase() != 'tr') return NeighborFormSubmit(obj_parent);
25
+ var forms = obj_parent.getElementsByTagName('form');
26
+ if (!forms) return false;
27
+ forms[0].submit()
28
+ }
29
+ </script>
30
+ {{enddef}}
31
+ <h2>About</h2>
32
+ <p>MapProxy Version {{version}}</p>
33
+ {{ extra_services_html_beginning }}
34
+ <h2>WMS</h2>
35
+ {{if 'wms' in services}}
36
+ <div class="capabilities">
37
+ <span>Capabilities document</span>
38
+ <span><a href="../service?REQUEST=GetCapabilities">(download as xml)</a></span>
39
+ <span><a href="../demo/?wms_capabilities">(view as html, internal)</a></span>
40
+ <span><a href="../demo/?wms_capabilities&type=external">(view as html, external)</a></span>
41
+ </div>
42
+ {{if 'wms_111' in services }}
43
+ <table class="code">
44
+ <tr>
45
+ <th>Layer</th>
46
+ <th>Coordinate-System</th>
47
+ <th>Image-Format</th>
48
+ </tr>
49
+ {{for layer in layers.values()}}
50
+ <tr>
51
+ <td rowspan="{{len(formats)}}">{{layer.name}}</td>
52
+ {{for loop, format in looper(formats)}}
53
+ <td class="value epsg-codes">
54
+ <form action="" method="GET">
55
+ <select name="srs" onchange="this.form.submit()">
56
+ {{for srs_name, srs_code in layer_srs(layer)}}
57
+ <option value="{{srs_code}}">{{srs_name}}</option>
58
+ {{endfor}}
59
+ </select>
60
+ <input type="hidden" name="format" value="{{format}}">
61
+ <input type="hidden" name="wms_layer" value="{{layer.name}}">
62
+ </form>
63
+ </td>
64
+ <td class="value">
65
+ <a href="#" onclick="NeighborFormSubmit(this)">{{format | strip}}</a>
66
+ </td>
67
+ </tr>
68
+ {{endfor}}
69
+ {{endfor}}
70
+ </table>
71
+ <p>Coordinate systems marked with * are supported without reprojection.</p>
72
+ {{else}}
73
+ <div class="capabilities">
74
+ <span>The demo service only supports WMS 1.1.1. Enable 1.1.1 to see a list of your configured layers.</span>
75
+ </div>
76
+ {{endif}}
77
+ {{else}}
78
+ <div class="capabilities">
79
+ <span>This service is not available with the current configuration.</span>
80
+ </div>
81
+ {{endif}}
82
+ <h2>WMS-C</h2>
83
+ {{if 'wms' in services}}
84
+ <div class="capabilities">
85
+ <span>Capabilities document</span>
86
+ <span><a href="../service?REQUEST=GetCapabilities&tiled=true">(download as xml)</a></span>
87
+ <span><a href="../demo/?wmsc_capabilities">(view as html, internal)</a></span>
88
+ <span><a href="../demo/?wmsc_capabilities&type=external">(view as html, external)</a></span>
89
+ </div>
90
+ {{else}}
91
+ <div class="capabilities">
92
+ <span>This service is not available with the current configuration.</span>
93
+ </div>
94
+ {{endif}}
95
+ <h2>WMTS</h2>
96
+ {{if 'wmts' in services}}
97
+ {{if 'wmts_kvp' in services}}
98
+ <div class="capabilities">
99
+ <span>KVP capabilities document</span>
100
+ <span><a href="../service?REQUEST=GetCapabilities&SERVICE=WMTS">(download as xml)</a></span>
101
+ <span><a href="../demo/?wmts_capabilities_kvp">(view as html, internal)</a></span>
102
+ <span><a href="../demo/?wmts_capabilities_kvp&type=external">(view as html, external)</a></span>
103
+ </div>
104
+ {{endif}}
105
+ {{if 'wmts_restful' in services}}
106
+ <div class="capabilities">
107
+ <span>RESTFul capabilities document</span>
108
+ <span><a href="../wmts/1.0.0/WMTSCapabilities.xml">(download as xml)</a></span>
109
+ <span><a href="../demo/?wmts_capabilities">(view as html, internal)</a></span>
110
+ <span><a href="../demo/?wmts_capabilities&type=external">(view as html, external)</a></span>
111
+ </div>
112
+ {{endif}}
113
+ <table class="code">
114
+ <tr>
115
+ <th>Layer</th>
116
+ <th>Coordinate-System</th>
117
+ <th>Image-Format</th>
118
+ </tr>
119
+ {{for wmts_layer_name, wmts_layers in wmts_layers.items()}}
120
+ <tr><td rowspan="{{len(wmts_layers)}}">{{wmts_layer_name}}</td>
121
+ {{for loop, layer in looper(wmts_layers)}}
122
+ {{if not loop.first}}
123
+ <tr>
124
+ {{endif}}
125
+ {{if layer.grid.supports_access_with_origin('nw')}}
126
+ <td class="value"><a href="../demo/?wmts_layer={{layer.name}}&format={{layer.format}}&srs={{layer.grid.srs.srs_code | quote}}">{{layer.grid.srs.srs_code}}</a></td>
127
+ <td class="value"><a href="../demo/?wmts_layer={{layer.name}}&format={{layer.format}}&srs={{layer.grid.srs.srs_code | quote}}">{{layer.format}}</a>
128
+ {{else}}
129
+ <td class="value" colspan="2">
130
+ {{layer.grid.name}} not compatible with WMTS
131
+ </td>
132
+ {{endif}}
133
+ </tr>
134
+ {{endfor}}
135
+ {{endfor}}
136
+ </table>
137
+ {{else}}
138
+ <div class="capabilities">
139
+ <span>This service is not available with the current configuration.</span>
140
+ </div>
141
+ {{endif}}
142
+ <h2>TMS</h2>
143
+ {{if 'tms' in services}}
144
+ <div class="capabilities">
145
+ <span>Capabilities document</span>
146
+ <span><a href="../tms/1.0.0/">(download as xml)</a></span>
147
+ <span><a href="../demo/?tms_capabilities">(view as html, internal)</a></span>
148
+ <span><a href="../demo/?tms_capabilities&type=external">(view as html, external)</a></span>
149
+ </div>
150
+ <table class="code">
151
+ <tr>
152
+ <th>Layer</th>
153
+ <th>Coordinate-System</th>
154
+ <th>Image-Format</th>
155
+ <th>Layer Capabilities</th>
156
+ </tr>
157
+ {{for tms_layer_name, tms_layers in tms_layers.items()}}
158
+ <tr><td rowspan="{{len(tms_layers)}}">{{tms_layer_name}}</td>
159
+ {{for loop, layer in looper(tms_layers)}}
160
+ {{if not loop.first}}
161
+ <tr>
162
+ {{endif}}
163
+ {{if layer.grid.supports_access_with_origin('sw')}}
164
+ <td class="value"><a href="../demo/?tms_layer={{layer.name}}&format={{layer.format}}&srs={{layer.grid.srs.srs_code | quote}}">{{layer.grid.srs.srs_code}}</a></td>
165
+ <td class="value"><a href="../demo/?tms_layer={{layer.name}}&format={{layer.format}}&srs={{layer.grid.srs.srs_code | quote}}">{{layer.format}}</a></td>
166
+ <td class="value"><a href="../demo/?tms_capabilities&layer={{layer.name}}&srs={{layer.md['name_path'][1]}}">click here</a></td>
167
+ {{else}}
168
+ <td class="value" colspan="3">
169
+ {{layer.grid.name}} not compatible with TMS
170
+ </td>
171
+ {{endif}}
172
+ </tr>
173
+ {{endfor}}
174
+ {{endfor}}
175
+ </table>
176
+ {{else}}
177
+ <div class="capabilities">
178
+ <span>This service is not available with the current configuration.</span>
179
+ </div>
180
+ {{endif}}
181
+ {{ extra_services_html_end }}
@@ -0,0 +1,16 @@
1
+ [first]
2
+
3
+ [last]
4
+
5
+ [include]
6
+ OpenLayers/Control.js
7
+ OpenLayers/Map.js
8
+ OpenLayers/Control/Attribution.js
9
+ OpenLayers/Control/Navigation.js
10
+ OpenLayers/Control/PanZoom.js
11
+ OpenLayers/Projection.js
12
+ OpenLayers/Layer/WMS.js
13
+ OpenLayers/Layer/TMS.js
14
+ OpenLayers/Layer/WMTS.js
15
+
16
+ [exclude]