/src/gdal/frmts/wms/minidriver_tms.cpp
Line | Count | Source |
1 | | /****************************************************************************** |
2 | | * |
3 | | * Project: WMS Client Driver |
4 | | * Purpose: Implementation of Dataset and RasterBand classes for WMS |
5 | | * and other similar services. |
6 | | * Author: Chris Schmidt |
7 | | * |
8 | | ****************************************************************************** |
9 | | * Copyright (c) 2007, Chris Schmidt |
10 | | * |
11 | | * SPDX-License-Identifier: MIT |
12 | | ****************************************************************************/ |
13 | | |
14 | | #include "wmsdriver.h" |
15 | | #include "minidriver_tms.h" |
16 | | |
17 | | WMSMiniDriver_TMS::WMSMiniDriver_TMS() |
18 | 269 | { |
19 | 269 | } |
20 | | |
21 | | WMSMiniDriver_TMS::~WMSMiniDriver_TMS() |
22 | 269 | { |
23 | 269 | } |
24 | | |
25 | | CPLErr WMSMiniDriver_TMS::Initialize(CPLXMLNode *config, |
26 | | CPL_UNUSED char **papszOpenOptions) |
27 | 269 | { |
28 | 269 | CPLErr ret = CE_None; |
29 | | |
30 | 269 | { |
31 | 269 | const char *base_url = CPLGetXMLValue(config, "ServerURL", ""); |
32 | 269 | if (base_url[0] != '\0') |
33 | 269 | { |
34 | 269 | m_base_url = base_url; |
35 | 269 | if (m_base_url.find("${") == std::string::npos) |
36 | 3 | { |
37 | 3 | if (m_base_url.back() != '/') |
38 | 3 | { |
39 | 3 | m_base_url += "/"; |
40 | 3 | } |
41 | 3 | m_base_url += "${version}/${layer}/${z}/${x}/${y}.${format}"; |
42 | 3 | } |
43 | 269 | } |
44 | 0 | else |
45 | 0 | { |
46 | 0 | CPLError(CE_Failure, CPLE_AppDefined, |
47 | 0 | "GDALWMS, TMS mini-driver: ServerURL missing."); |
48 | 0 | ret = CE_Failure; |
49 | 0 | } |
50 | 269 | } |
51 | | |
52 | | // These never change |
53 | 269 | const char *dataset = CPLGetXMLValue(config, "Layer", ""); |
54 | 269 | URLSearchAndReplace(&m_base_url, "${layer}", "%s", dataset); |
55 | 269 | const char *version = CPLGetXMLValue(config, "Version", "1.0.0"); |
56 | 269 | URLSearchAndReplace(&m_base_url, "${version}", "%s", version); |
57 | 269 | const char *format = CPLGetXMLValue(config, "Format", "jpg"); |
58 | 269 | URLSearchAndReplace(&m_base_url, "${format}", "%s", format); |
59 | | |
60 | 269 | m_nTileXMultiplier = atoi(CPLGetXMLValue(config, "TileXMultiplier", "1")); |
61 | | |
62 | 269 | return ret; |
63 | 269 | } |
64 | | |
65 | | CPLErr |
66 | | WMSMiniDriver_TMS::TiledImageRequest(WMSHTTPRequest &request, |
67 | | const GDALWMSImageRequestInfo &iri, |
68 | | const GDALWMSTiledImageRequestInfo &tiri) |
69 | 564 | { |
70 | 564 | CPLString &url = request.URL; |
71 | 564 | const GDALWMSDataWindow *data_window = m_parent_dataset->WMSGetDataWindow(); |
72 | 564 | int tms_y; |
73 | | |
74 | 564 | if (data_window->m_y_origin != GDALWMSDataWindow::TOP) |
75 | 0 | { |
76 | 0 | if (iri.m_y0 == iri.m_y1) |
77 | 0 | return CE_Failure; |
78 | 0 | const double dfTmp = floor( |
79 | 0 | ((data_window->m_y1 - data_window->m_y0) / (iri.m_y1 - iri.m_y0)) + |
80 | 0 | 0.5); |
81 | 0 | if (!(dfTmp >= 0 && dfTmp < INT_MAX)) |
82 | 0 | return CE_Failure; |
83 | 0 | tms_y = static_cast<int>(dfTmp) - tiri.m_y - 1; |
84 | 0 | } |
85 | 564 | else |
86 | 564 | { |
87 | 564 | tms_y = tiri.m_y; |
88 | 564 | } |
89 | | // http://tms25.arc.nasa.gov/tile/tile.aspx?T=geocover2000&L=0&X=86&Y=39 |
90 | 564 | url = m_base_url; |
91 | | |
92 | 564 | URLSearchAndReplace(&url, "${x}", "%d", tiri.m_x * m_nTileXMultiplier); |
93 | 564 | URLSearchAndReplace(&url, "${y}", "%d", tms_y); |
94 | 564 | URLSearchAndReplace(&url, "${z}", "%d", tiri.m_level); |
95 | | |
96 | | /* Hack for some TMS like servers that require tile numbers split into 3 |
97 | | * groups of */ |
98 | | /* 3 digits, like |
99 | | * http://tile8.geo.admin.ch/geoadmin/ch.swisstopo.pixelkarte-farbe */ |
100 | 564 | URLSearchAndReplace(&url, "${xxx}", "%03d/%03d/%03d", tiri.m_x / 1000000, |
101 | 564 | (tiri.m_x / 1000) % 1000, tiri.m_x % 1000); |
102 | 564 | URLSearchAndReplace(&url, "${yyy}", "%03d/%03d/%03d", tms_y / 1000000, |
103 | 564 | (tms_y / 1000) % 1000, tms_y % 1000); |
104 | | |
105 | 564 | return CE_None; |
106 | 564 | } |