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.
Files changed (458) hide show
  1. mapproxy/__init__.py +0 -0
  2. mapproxy/cache/__init__.py +36 -0
  3. mapproxy/cache/azureblob.py +145 -0
  4. mapproxy/cache/base.py +111 -0
  5. mapproxy/cache/compact.py +664 -0
  6. mapproxy/cache/couchdb.py +295 -0
  7. mapproxy/cache/dummy.py +34 -0
  8. mapproxy/cache/file.py +185 -0
  9. mapproxy/cache/geopackage.py +609 -0
  10. mapproxy/cache/legend.py +83 -0
  11. mapproxy/cache/mbtiles.py +392 -0
  12. mapproxy/cache/meta.py +78 -0
  13. mapproxy/cache/path.py +250 -0
  14. mapproxy/cache/redis.py +88 -0
  15. mapproxy/cache/renderd.py +95 -0
  16. mapproxy/cache/riak.py +202 -0
  17. mapproxy/cache/s3.py +177 -0
  18. mapproxy/cache/tile.py +699 -0
  19. mapproxy/client/__init__.py +0 -0
  20. mapproxy/client/arcgis.py +79 -0
  21. mapproxy/client/cgi.py +139 -0
  22. mapproxy/client/http.py +315 -0
  23. mapproxy/client/log.py +33 -0
  24. mapproxy/client/tile.py +150 -0
  25. mapproxy/client/wms.py +254 -0
  26. mapproxy/compat/__init__.py +46 -0
  27. mapproxy/compat/image.py +79 -0
  28. mapproxy/compat/itertools.py +29 -0
  29. mapproxy/compat/modules.py +13 -0
  30. mapproxy/config/__init__.py +22 -0
  31. mapproxy/config/config.py +201 -0
  32. mapproxy/config/coverage.py +107 -0
  33. mapproxy/config/defaults.py +98 -0
  34. mapproxy/config/loader.py +2286 -0
  35. mapproxy/config/spec.py +644 -0
  36. mapproxy/config/validator.py +239 -0
  37. mapproxy/config_template/__init__.py +0 -0
  38. mapproxy/config_template/base_config/config.wsgi +10 -0
  39. mapproxy/config_template/base_config/full_example.yaml +593 -0
  40. mapproxy/config_template/base_config/full_seed_example.yaml +79 -0
  41. mapproxy/config_template/base_config/log.ini +35 -0
  42. mapproxy/config_template/base_config/mapproxy.yaml +60 -0
  43. mapproxy/config_template/base_config/seed.yaml +27 -0
  44. mapproxy/exception.py +142 -0
  45. mapproxy/featureinfo.py +252 -0
  46. mapproxy/grid.py +1170 -0
  47. mapproxy/image/__init__.py +536 -0
  48. mapproxy/image/fonts/DejaVuSans.ttf +0 -0
  49. mapproxy/image/fonts/DejaVuSansMono.ttf +0 -0
  50. mapproxy/image/fonts/LICENSE +99 -0
  51. mapproxy/image/fonts/__init__.py +0 -0
  52. mapproxy/image/mask.py +75 -0
  53. mapproxy/image/merge.py +316 -0
  54. mapproxy/image/message.py +347 -0
  55. mapproxy/image/opts.py +182 -0
  56. mapproxy/image/tile.py +167 -0
  57. mapproxy/image/transform.py +350 -0
  58. mapproxy/layer.py +470 -0
  59. mapproxy/multiapp.py +231 -0
  60. mapproxy/proj.py +302 -0
  61. mapproxy/request/__init__.py +18 -0
  62. mapproxy/request/arcgis.py +259 -0
  63. mapproxy/request/base.py +476 -0
  64. mapproxy/request/tile.py +128 -0
  65. mapproxy/request/wms/__init__.py +793 -0
  66. mapproxy/request/wms/exception.py +99 -0
  67. mapproxy/request/wmts.py +436 -0
  68. mapproxy/response.py +237 -0
  69. mapproxy/script/__init__.py +0 -0
  70. mapproxy/script/conf/__init__.py +0 -0
  71. mapproxy/script/conf/app.py +195 -0
  72. mapproxy/script/conf/caches.py +45 -0
  73. mapproxy/script/conf/layers.py +54 -0
  74. mapproxy/script/conf/seeds.py +37 -0
  75. mapproxy/script/conf/sources.py +86 -0
  76. mapproxy/script/conf/utils.py +143 -0
  77. mapproxy/script/defrag.py +184 -0
  78. mapproxy/script/export.py +333 -0
  79. mapproxy/script/grids.py +188 -0
  80. mapproxy/script/scales.py +126 -0
  81. mapproxy/script/util.py +406 -0
  82. mapproxy/script/wms_capabilities.py +152 -0
  83. mapproxy/seed/__init__.py +0 -0
  84. mapproxy/seed/cachelock.py +121 -0
  85. mapproxy/seed/cleanup.py +187 -0
  86. mapproxy/seed/config.py +469 -0
  87. mapproxy/seed/script.py +388 -0
  88. mapproxy/seed/seeder.py +538 -0
  89. mapproxy/seed/spec.py +64 -0
  90. mapproxy/seed/util.py +254 -0
  91. mapproxy/service/__init__.py +14 -0
  92. mapproxy/service/base.py +46 -0
  93. mapproxy/service/demo.py +356 -0
  94. mapproxy/service/kml.py +331 -0
  95. mapproxy/service/ows.py +38 -0
  96. mapproxy/service/template_helper.py +53 -0
  97. mapproxy/service/templates/demo/capabilities_demo.html +16 -0
  98. mapproxy/service/templates/demo/demo.html +181 -0
  99. mapproxy/service/templates/demo/openlayers-demo.cfg +16 -0
  100. mapproxy/service/templates/demo/static/img/blank.gif +0 -0
  101. mapproxy/service/templates/demo/static/img/east-mini.png +0 -0
  102. mapproxy/service/templates/demo/static/img/north-mini.png +0 -0
  103. mapproxy/service/templates/demo/static/img/south-mini.png +0 -0
  104. mapproxy/service/templates/demo/static/img/west-mini.png +0 -0
  105. mapproxy/service/templates/demo/static/img/zoom-minus-mini.png +0 -0
  106. mapproxy/service/templates/demo/static/img/zoom-plus-mini.png +0 -0
  107. mapproxy/service/templates/demo/static/img/zoom-world-mini.png +0 -0
  108. mapproxy/service/templates/demo/static/logo.png +0 -0
  109. mapproxy/service/templates/demo/static/ol.css +345 -0
  110. mapproxy/service/templates/demo/static/ol.js +4 -0
  111. mapproxy/service/templates/demo/static/proj4.min.js +1 -0
  112. mapproxy/service/templates/demo/static/proj4defs.js +1 -0
  113. mapproxy/service/templates/demo/static/site.css +137 -0
  114. mapproxy/service/templates/demo/static/theme/default/framedCloud.css +0 -0
  115. mapproxy/service/templates/demo/static/theme/default/google.css +17 -0
  116. mapproxy/service/templates/demo/static/theme/default/ie6-style.css +10 -0
  117. mapproxy/service/templates/demo/static/theme/default/style.css +482 -0
  118. mapproxy/service/templates/demo/static.html +34 -0
  119. mapproxy/service/templates/demo/tms_demo.html +103 -0
  120. mapproxy/service/templates/demo/wms_demo.html +140 -0
  121. mapproxy/service/templates/demo/wmts_demo.html +110 -0
  122. mapproxy/service/templates/tms_capabilities.xml +13 -0
  123. mapproxy/service/templates/tms_exception.xml +4 -0
  124. mapproxy/service/templates/tms_root_resource.xml +7 -0
  125. mapproxy/service/templates/tms_tilemap_capabilities.xml +14 -0
  126. mapproxy/service/templates/wms100capabilities.xml +112 -0
  127. mapproxy/service/templates/wms100exception.xml +4 -0
  128. mapproxy/service/templates/wms110capabilities.xml +152 -0
  129. mapproxy/service/templates/wms110exception.xml +5 -0
  130. mapproxy/service/templates/wms111capabilities.xml +183 -0
  131. mapproxy/service/templates/wms111exception.xml +5 -0
  132. mapproxy/service/templates/wms130capabilities.xml +326 -0
  133. mapproxy/service/templates/wms130exception.xml +8 -0
  134. mapproxy/service/templates/wmts100capabilities.xml +155 -0
  135. mapproxy/service/templates/wmts100exception.xml +9 -0
  136. mapproxy/service/tile.py +536 -0
  137. mapproxy/service/wms.py +851 -0
  138. mapproxy/service/wmts.py +381 -0
  139. mapproxy/source/__init__.py +75 -0
  140. mapproxy/source/arcgis.py +39 -0
  141. mapproxy/source/error.py +39 -0
  142. mapproxy/source/mapnik.py +259 -0
  143. mapproxy/source/tile.py +96 -0
  144. mapproxy/source/wms.py +270 -0
  145. mapproxy/srs.py +726 -0
  146. mapproxy/template.py +54 -0
  147. mapproxy/test/__init__.py +0 -0
  148. mapproxy/test/conftest.py +7 -0
  149. mapproxy/test/helper.py +247 -0
  150. mapproxy/test/http.py +494 -0
  151. mapproxy/test/image.py +210 -0
  152. mapproxy/test/mocker.py +2268 -0
  153. mapproxy/test/schemas/inspire/common/1.0/common.xsd +1461 -0
  154. mapproxy/test/schemas/inspire/common/1.0/enums/enum_bul.xsd +108 -0
  155. mapproxy/test/schemas/inspire/common/1.0/enums/enum_cze.xsd +108 -0
  156. mapproxy/test/schemas/inspire/common/1.0/enums/enum_dan.xsd +108 -0
  157. mapproxy/test/schemas/inspire/common/1.0/enums/enum_dut.xsd +108 -0
  158. mapproxy/test/schemas/inspire/common/1.0/enums/enum_eng.xsd +155 -0
  159. mapproxy/test/schemas/inspire/common/1.0/enums/enum_est.xsd +108 -0
  160. mapproxy/test/schemas/inspire/common/1.0/enums/enum_fin.xsd +108 -0
  161. mapproxy/test/schemas/inspire/common/1.0/enums/enum_fre.xsd +108 -0
  162. mapproxy/test/schemas/inspire/common/1.0/enums/enum_ger.xsd +108 -0
  163. mapproxy/test/schemas/inspire/common/1.0/enums/enum_gle.xsd +109 -0
  164. mapproxy/test/schemas/inspire/common/1.0/enums/enum_gre.xsd +108 -0
  165. mapproxy/test/schemas/inspire/common/1.0/enums/enum_hun.xsd +108 -0
  166. mapproxy/test/schemas/inspire/common/1.0/enums/enum_ita.xsd +108 -0
  167. mapproxy/test/schemas/inspire/common/1.0/enums/enum_lav.xsd +108 -0
  168. mapproxy/test/schemas/inspire/common/1.0/enums/enum_lit.xsd +108 -0
  169. mapproxy/test/schemas/inspire/common/1.0/enums/enum_mlt.xsd +108 -0
  170. mapproxy/test/schemas/inspire/common/1.0/enums/enum_pol.xsd +108 -0
  171. mapproxy/test/schemas/inspire/common/1.0/enums/enum_por.xsd +108 -0
  172. mapproxy/test/schemas/inspire/common/1.0/enums/enum_rum.xsd +108 -0
  173. mapproxy/test/schemas/inspire/common/1.0/enums/enum_slo.xsd +108 -0
  174. mapproxy/test/schemas/inspire/common/1.0/enums/enum_slv.xsd +108 -0
  175. mapproxy/test/schemas/inspire/common/1.0/enums/enum_spa.xsd +108 -0
  176. mapproxy/test/schemas/inspire/common/1.0/enums/enum_swe.xsd +108 -0
  177. mapproxy/test/schemas/inspire/common/1.0/network.xsd +521 -0
  178. mapproxy/test/schemas/inspire/inspire_vs/1.0/inspire_vs.xsd +19 -0
  179. mapproxy/test/schemas/kml/2.2.0/ReadMe.txt +14 -0
  180. mapproxy/test/schemas/kml/2.2.0/atom-author-link.xsd +66 -0
  181. mapproxy/test/schemas/kml/2.2.0/ogckml22.xsd +1646 -0
  182. mapproxy/test/schemas/kml/2.2.0/xAL.xsd +1680 -0
  183. mapproxy/test/schemas/ows/1.1.0/ReadMe.txt +87 -0
  184. mapproxy/test/schemas/ows/1.1.0/ows19115subset.xsd +235 -0
  185. mapproxy/test/schemas/ows/1.1.0/owsAll.xsd +23 -0
  186. mapproxy/test/schemas/ows/1.1.0/owsCommon.xsd +157 -0
  187. mapproxy/test/schemas/ows/1.1.0/owsContents.xsd +86 -0
  188. mapproxy/test/schemas/ows/1.1.0/owsDataIdentification.xsd +127 -0
  189. mapproxy/test/schemas/ows/1.1.0/owsDomainType.xsd +279 -0
  190. mapproxy/test/schemas/ows/1.1.0/owsExceptionReport.xsd +76 -0
  191. mapproxy/test/schemas/ows/1.1.0/owsGetCapabilities.xsd +112 -0
  192. mapproxy/test/schemas/ows/1.1.0/owsGetResourceByID.xsd +51 -0
  193. mapproxy/test/schemas/ows/1.1.0/owsInputOutputData.xsd +59 -0
  194. mapproxy/test/schemas/ows/1.1.0/owsManifest.xsd +125 -0
  195. mapproxy/test/schemas/ows/1.1.0/owsOperationsMetadata.xsd +140 -0
  196. mapproxy/test/schemas/ows/1.1.0/owsServiceIdentification.xsd +60 -0
  197. mapproxy/test/schemas/ows/1.1.0/owsServiceProvider.xsd +47 -0
  198. mapproxy/test/schemas/sld/1.1.0/sld_capabilities.xsd +27 -0
  199. mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.dtd +353 -0
  200. mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.xml +188 -0
  201. mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.dtd +524 -0
  202. mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.xml +260 -0
  203. mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.dtd +273 -0
  204. mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.xml +303 -0
  205. mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.dtd +6 -0
  206. mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.xml +33 -0
  207. mapproxy/test/schemas/wms/1.1.1/OGC-exception.xsd +68 -0
  208. mapproxy/test/schemas/wms/1.1.1/WMS_DescribeLayerResponse.dtd +22 -0
  209. mapproxy/test/schemas/wms/1.1.1/WMS_MS_Capabilities.dtd +274 -0
  210. mapproxy/test/schemas/wms/1.1.1/WMS_exception_1_1_1.dtd +5 -0
  211. mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.dtd +276 -0
  212. mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.xml +303 -0
  213. mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.dtd +6 -0
  214. mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.xml +33 -0
  215. mapproxy/test/schemas/wms/1.3.0/ReadMe.txt +8 -0
  216. mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xml +277 -0
  217. mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xsd +611 -0
  218. mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xml +34 -0
  219. mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xsd +28 -0
  220. mapproxy/test/schemas/wmsc/1.1.1/OGC-exception.xsd +68 -0
  221. mapproxy/test/schemas/wmsc/1.1.1/WMS_DescribeLayerResponse.dtd +22 -0
  222. mapproxy/test/schemas/wmsc/1.1.1/WMS_MS_Capabilities.dtd +283 -0
  223. mapproxy/test/schemas/wmsc/1.1.1/WMS_exception_1_1_1.dtd +5 -0
  224. mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.dtd +276 -0
  225. mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.xml +303 -0
  226. mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.dtd +6 -0
  227. mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.xml +33 -0
  228. mapproxy/test/schemas/wmts/1.0/ReadMe.txt +32 -0
  229. mapproxy/test/schemas/wmts/1.0/wmts.xsd +28 -0
  230. mapproxy/test/schemas/wmts/1.0/wmtsAbstract.wsdl +151 -0
  231. mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_request.xsd +38 -0
  232. mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_response.xsd +564 -0
  233. mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_request.xsd +57 -0
  234. mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_response.xsd +72 -0
  235. mapproxy/test/schemas/wmts/1.0/wmtsGetTile_request.xsd +91 -0
  236. mapproxy/test/schemas/wmts/1.0/wmtsKVP.xsd +76 -0
  237. mapproxy/test/schemas/wmts/1.0/wmtsPayload_response.xsd +70 -0
  238. mapproxy/test/schemas/xlink/1.0.0/ReadMe.txt +6 -0
  239. mapproxy/test/schemas/xlink/1.0.0/xlinks.xsd +122 -0
  240. mapproxy/test/schemas/xml.xsd +287 -0
  241. mapproxy/test/system/__init__.py +98 -0
  242. mapproxy/test/system/fixture/arcgis.yaml +57 -0
  243. mapproxy/test/system/fixture/auth.yaml +70 -0
  244. mapproxy/test/system/fixture/cache.mbtiles +0 -0
  245. mapproxy/test/system/fixture/cache_azureblob.yaml +59 -0
  246. mapproxy/test/system/fixture/cache_band_merge.yaml +73 -0
  247. mapproxy/test/system/fixture/cache_bulk_meta_tiles.yaml +24 -0
  248. mapproxy/test/system/fixture/cache_data/dop_cache_EPSG3857/00/000/000/000/000/000/000.png +0 -0
  249. mapproxy/test/system/fixture/cache_data/wms_cache_EPSG900913/01/000/000/000/000/000/001.jpeg +0 -0
  250. mapproxy/test/system/fixture/cache_data/wms_cache_transparent_EPSG900913/01/000/000/000/000/000/001.png +0 -0
  251. mapproxy/test/system/fixture/cache_geopackage.yaml +56 -0
  252. mapproxy/test/system/fixture/cache_grid_names.yaml +50 -0
  253. mapproxy/test/system/fixture/cache_mbtiles.yaml +28 -0
  254. mapproxy/test/system/fixture/cache_s3.yaml +58 -0
  255. mapproxy/test/system/fixture/cache_source.yaml +81 -0
  256. mapproxy/test/system/fixture/combined_sources.yaml +130 -0
  257. mapproxy/test/system/fixture/coverage.yaml +77 -0
  258. mapproxy/test/system/fixture/demo.yaml +135 -0
  259. mapproxy/test/system/fixture/dimension.yaml +59 -0
  260. mapproxy/test/system/fixture/disable_storage.yaml +25 -0
  261. mapproxy/test/system/fixture/empty_ogrdata.geojson +1 -0
  262. mapproxy/test/system/fixture/formats.yaml +72 -0
  263. mapproxy/test/system/fixture/inspire.yaml +101 -0
  264. mapproxy/test/system/fixture/inspire_full.yaml +124 -0
  265. mapproxy/test/system/fixture/kml_layer.yaml +66 -0
  266. mapproxy/test/system/fixture/layer.yaml +260 -0
  267. mapproxy/test/system/fixture/layergroups.yaml +57 -0
  268. mapproxy/test/system/fixture/layergroups_root.yaml +106 -0
  269. mapproxy/test/system/fixture/legendgraphic.yaml +93 -0
  270. mapproxy/test/system/fixture/mapnik_source.yaml +66 -0
  271. mapproxy/test/system/fixture/mapproxy_export.yaml +12 -0
  272. mapproxy/test/system/fixture/mapserver.yaml +23 -0
  273. mapproxy/test/system/fixture/minimal_cgi.py +16 -0
  274. mapproxy/test/system/fixture/mixed_mode.yaml +49 -0
  275. mapproxy/test/system/fixture/multi_cache_layers.yaml +100 -0
  276. mapproxy/test/system/fixture/multiapp1.yaml +20 -0
  277. mapproxy/test/system/fixture/multiapp2.yaml +19 -0
  278. mapproxy/test/system/fixture/renderd_client.yaml +55 -0
  279. mapproxy/test/system/fixture/scalehints.yaml +70 -0
  280. mapproxy/test/system/fixture/seed.yaml +94 -0
  281. mapproxy/test/system/fixture/seed_mapproxy.yaml +39 -0
  282. mapproxy/test/system/fixture/seed_old.yaml +12 -0
  283. mapproxy/test/system/fixture/seed_timeouts.yaml +12 -0
  284. mapproxy/test/system/fixture/seed_timeouts_mapproxy.yaml +27 -0
  285. mapproxy/test/system/fixture/seedonly.yaml +51 -0
  286. mapproxy/test/system/fixture/sld.yaml +35 -0
  287. mapproxy/test/system/fixture/source_errors.yaml +84 -0
  288. mapproxy/test/system/fixture/source_errors_raise.yaml +82 -0
  289. mapproxy/test/system/fixture/tileservice_origin.yaml +26 -0
  290. mapproxy/test/system/fixture/tileservice_refresh.yaml +59 -0
  291. mapproxy/test/system/fixture/tilesource_minmax_res.yaml +22 -0
  292. mapproxy/test/system/fixture/util-conf-base-grids.yaml +5 -0
  293. mapproxy/test/system/fixture/util-conf-overwrite.yaml +13 -0
  294. mapproxy/test/system/fixture/util-conf-wms-111-cap.xml +90 -0
  295. mapproxy/test/system/fixture/util_grids.yaml +30 -0
  296. mapproxy/test/system/fixture/util_wms_capabilities111.xml +130 -0
  297. mapproxy/test/system/fixture/util_wms_capabilities130.xml +100 -0
  298. mapproxy/test/system/fixture/util_wms_capabilities_service_exception.xml +5 -0
  299. mapproxy/test/system/fixture/watermark.yaml +50 -0
  300. mapproxy/test/system/fixture/wms_srs_extent.yaml +39 -0
  301. mapproxy/test/system/fixture/wms_versions.yaml +38 -0
  302. mapproxy/test/system/fixture/wmts.yaml +134 -0
  303. mapproxy/test/system/fixture/wmts_dimensions.yaml +57 -0
  304. mapproxy/test/system/fixture/xslt_featureinfo.yaml +54 -0
  305. mapproxy/test/system/fixture/xslt_featureinfo_input.yaml +51 -0
  306. mapproxy/test/system/test_arcgis.py +156 -0
  307. mapproxy/test/system/test_auth.py +1134 -0
  308. mapproxy/test/system/test_behind_proxy.py +75 -0
  309. mapproxy/test/system/test_bulk_meta_tiles.py +106 -0
  310. mapproxy/test/system/test_cache_azureblob.py +127 -0
  311. mapproxy/test/system/test_cache_band_merge.py +103 -0
  312. mapproxy/test/system/test_cache_geopackage.py +144 -0
  313. mapproxy/test/system/test_cache_grid_names.py +89 -0
  314. mapproxy/test/system/test_cache_mbtiles.py +85 -0
  315. mapproxy/test/system/test_cache_s3.py +115 -0
  316. mapproxy/test/system/test_cache_source.py +146 -0
  317. mapproxy/test/system/test_combined_sources.py +335 -0
  318. mapproxy/test/system/test_coverage.py +140 -0
  319. mapproxy/test/system/test_decorate_img.py +214 -0
  320. mapproxy/test/system/test_demo.py +106 -0
  321. mapproxy/test/system/test_demo_with_extra_service.py +53 -0
  322. mapproxy/test/system/test_dimensions.py +278 -0
  323. mapproxy/test/system/test_disable_storage.py +42 -0
  324. mapproxy/test/system/test_formats.py +219 -0
  325. mapproxy/test/system/test_inspire_vs.py +173 -0
  326. mapproxy/test/system/test_kml.py +262 -0
  327. mapproxy/test/system/test_layergroups.py +160 -0
  328. mapproxy/test/system/test_legendgraphic.py +308 -0
  329. mapproxy/test/system/test_mapnik.py +161 -0
  330. mapproxy/test/system/test_mapserver.py +81 -0
  331. mapproxy/test/system/test_mixed_mode_format.py +195 -0
  332. mapproxy/test/system/test_multi_cache_layers.py +167 -0
  333. mapproxy/test/system/test_multiapp.py +92 -0
  334. mapproxy/test/system/test_refresh.py +207 -0
  335. mapproxy/test/system/test_renderd_client.py +304 -0
  336. mapproxy/test/system/test_response_headers.py +54 -0
  337. mapproxy/test/system/test_scalehints.py +140 -0
  338. mapproxy/test/system/test_seed.py +422 -0
  339. mapproxy/test/system/test_seed_only.py +93 -0
  340. mapproxy/test/system/test_sld.py +120 -0
  341. mapproxy/test/system/test_source_errors.py +377 -0
  342. mapproxy/test/system/test_tilesource_minmax_res.py +54 -0
  343. mapproxy/test/system/test_tms.py +276 -0
  344. mapproxy/test/system/test_tms_origin.py +46 -0
  345. mapproxy/test/system/test_util_conf.py +304 -0
  346. mapproxy/test/system/test_util_export.py +210 -0
  347. mapproxy/test/system/test_util_grids.py +88 -0
  348. mapproxy/test/system/test_util_wms_capabilities.py +182 -0
  349. mapproxy/test/system/test_watermark.py +91 -0
  350. mapproxy/test/system/test_wms.py +1611 -0
  351. mapproxy/test/system/test_wms_srs_extent.py +165 -0
  352. mapproxy/test/system/test_wms_version.py +85 -0
  353. mapproxy/test/system/test_wmsc.py +116 -0
  354. mapproxy/test/system/test_wmts.py +334 -0
  355. mapproxy/test/system/test_wmts_dimensions.py +206 -0
  356. mapproxy/test/system/test_wmts_restful.py +198 -0
  357. mapproxy/test/system/test_xslt_featureinfo.py +425 -0
  358. mapproxy/test/test_http_helper.py +219 -0
  359. mapproxy/test/unit/__init__.py +0 -0
  360. mapproxy/test/unit/epsg +2 -0
  361. mapproxy/test/unit/polygons/polygons.dbf +0 -0
  362. mapproxy/test/unit/polygons/polygons.shp +0 -0
  363. mapproxy/test/unit/polygons/polygons.shx +0 -0
  364. mapproxy/test/unit/test_async.py +245 -0
  365. mapproxy/test/unit/test_auth.py +419 -0
  366. mapproxy/test/unit/test_cache.py +1193 -0
  367. mapproxy/test/unit/test_cache_azureblob.py +94 -0
  368. mapproxy/test/unit/test_cache_compact.py +319 -0
  369. mapproxy/test/unit/test_cache_couchdb.py +114 -0
  370. mapproxy/test/unit/test_cache_geopackage.py +221 -0
  371. mapproxy/test/unit/test_cache_redis.py +67 -0
  372. mapproxy/test/unit/test_cache_riak.py +76 -0
  373. mapproxy/test/unit/test_cache_s3.py +84 -0
  374. mapproxy/test/unit/test_cache_tile.py +427 -0
  375. mapproxy/test/unit/test_client.py +479 -0
  376. mapproxy/test/unit/test_client_arcgis.py +73 -0
  377. mapproxy/test/unit/test_client_cgi.py +136 -0
  378. mapproxy/test/unit/test_collections.py +116 -0
  379. mapproxy/test/unit/test_concat_legends.py +37 -0
  380. mapproxy/test/unit/test_conf_loader.py +1061 -0
  381. mapproxy/test/unit/test_conf_validator.py +416 -0
  382. mapproxy/test/unit/test_config.py +117 -0
  383. mapproxy/test/unit/test_decorate_img.py +185 -0
  384. mapproxy/test/unit/test_exceptions.py +258 -0
  385. mapproxy/test/unit/test_featureinfo.py +291 -0
  386. mapproxy/test/unit/test_file_lock_load.py +49 -0
  387. mapproxy/test/unit/test_geom.py +503 -0
  388. mapproxy/test/unit/test_grid.py +1258 -0
  389. mapproxy/test/unit/test_image.py +1053 -0
  390. mapproxy/test/unit/test_image_mask.py +181 -0
  391. mapproxy/test/unit/test_image_messages.py +197 -0
  392. mapproxy/test/unit/test_image_options.py +160 -0
  393. mapproxy/test/unit/test_isodate.py +122 -0
  394. mapproxy/test/unit/test_multiapp.py +163 -0
  395. mapproxy/test/unit/test_ogr_reader.py +50 -0
  396. mapproxy/test/unit/test_request.py +745 -0
  397. mapproxy/test/unit/test_request_wmts.py +178 -0
  398. mapproxy/test/unit/test_response.py +79 -0
  399. mapproxy/test/unit/test_seed.py +365 -0
  400. mapproxy/test/unit/test_seed_cachelock.py +90 -0
  401. mapproxy/test/unit/test_srs.py +215 -0
  402. mapproxy/test/unit/test_tiled_source.py +122 -0
  403. mapproxy/test/unit/test_tilefilter.py +31 -0
  404. mapproxy/test/unit/test_times.py +25 -0
  405. mapproxy/test/unit/test_timeutils.py +50 -0
  406. mapproxy/test/unit/test_util_conf_utils.py +75 -0
  407. mapproxy/test/unit/test_utils.py +476 -0
  408. mapproxy/test/unit/test_wms_capabilities.py +44 -0
  409. mapproxy/test/unit/test_wms_layer.py +113 -0
  410. mapproxy/test/unit/test_yaml.py +69 -0
  411. mapproxy/tilefilter.py +59 -0
  412. mapproxy/util/__init__.py +0 -0
  413. mapproxy/util/async_.py +227 -0
  414. mapproxy/util/collections.py +132 -0
  415. mapproxy/util/coverage.py +329 -0
  416. mapproxy/util/escape.py +10 -0
  417. mapproxy/util/ext/__init__.py +14 -0
  418. mapproxy/util/ext/dictspec/__init__.py +1 -0
  419. mapproxy/util/ext/dictspec/spec.py +124 -0
  420. mapproxy/util/ext/dictspec/test/__init__.py +0 -0
  421. mapproxy/util/ext/dictspec/test/test_validator.py +274 -0
  422. mapproxy/util/ext/dictspec/validator.py +189 -0
  423. mapproxy/util/ext/local.py +196 -0
  424. mapproxy/util/ext/lockfile.py +138 -0
  425. mapproxy/util/ext/odict.py +330 -0
  426. mapproxy/util/ext/serving.py +508 -0
  427. mapproxy/util/ext/tempita/__init__.py +1174 -0
  428. mapproxy/util/ext/tempita/_looper.py +163 -0
  429. mapproxy/util/ext/tempita/compat3.py +46 -0
  430. mapproxy/util/ext/wmsparse/__init__.py +3 -0
  431. mapproxy/util/ext/wmsparse/duration.py +597 -0
  432. mapproxy/util/ext/wmsparse/parse.py +305 -0
  433. mapproxy/util/ext/wmsparse/test/__init__.py +0 -0
  434. mapproxy/util/ext/wmsparse/test/test_parse.py +162 -0
  435. mapproxy/util/ext/wmsparse/test/test_util.py +23 -0
  436. mapproxy/util/ext/wmsparse/test/wms-large-111.xml +2114 -0
  437. mapproxy/util/ext/wmsparse/test/wms-omniscale-111.xml +90 -0
  438. mapproxy/util/ext/wmsparse/test/wms-omniscale-130.xml +120 -0
  439. mapproxy/util/ext/wmsparse/test/wms_nasa_cap.xml +386 -0
  440. mapproxy/util/ext/wmsparse/util.py +187 -0
  441. mapproxy/util/fs.py +156 -0
  442. mapproxy/util/geom.py +295 -0
  443. mapproxy/util/lib.py +115 -0
  444. mapproxy/util/lock.py +163 -0
  445. mapproxy/util/ogr.py +231 -0
  446. mapproxy/util/py.py +81 -0
  447. mapproxy/util/times.py +75 -0
  448. mapproxy/util/yaml.py +56 -0
  449. mapproxy/version.py +31 -0
  450. mapproxy/wsgiapp.py +164 -0
  451. mapproxy-1.16.1.dist-info/METADATA +151 -0
  452. mapproxy-1.16.1.dist-info/RECORD +458 -0
  453. mapproxy-1.16.1.dist-info/WHEEL +5 -0
  454. mapproxy-1.16.1.dist-info/entry_points.txt +3 -0
  455. mapproxy-1.16.1.dist-info/licenses/AUTHORS.txt +33 -0
  456. mapproxy-1.16.1.dist-info/licenses/COPYING.txt +60 -0
  457. mapproxy-1.16.1.dist-info/licenses/LICENSE.txt +202 -0
  458. 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
+