/src/gdal/frmts/wmts/wmtsdrivercore.cpp
Line | Count | Source |
1 | | /****************************************************************************** |
2 | | * |
3 | | * Project: GDAL WMTS driver |
4 | | * Purpose: Implement GDAL WMTS support |
5 | | * Author: Even Rouault, <even dot rouault at spatialys dot com> |
6 | | * Funded by Land Information New Zealand (LINZ) |
7 | | * |
8 | | ********************************************************************** |
9 | | * Copyright (c) 2015, Even Rouault <even dot rouault at spatialys dot com> |
10 | | * |
11 | | * SPDX-License-Identifier: MIT |
12 | | ****************************************************************************/ |
13 | | |
14 | | #include "wmtsdrivercore.h" |
15 | | #include "gdal_frmts.h" |
16 | | #include "gdalplugindriverproxy.h" |
17 | | |
18 | | /************************************************************************/ |
19 | | /* WMTSDriverIdentify() */ |
20 | | /************************************************************************/ |
21 | | |
22 | | int WMTSDriverIdentify(GDALOpenInfo *poOpenInfo) |
23 | | |
24 | 533k | { |
25 | 533k | if (STARTS_WITH_CI(poOpenInfo->pszFilename, "WMTS:")) |
26 | 26 | return TRUE; |
27 | | |
28 | 533k | if (STARTS_WITH_CI(poOpenInfo->pszFilename, "<GDAL_WMTS")) |
29 | 8 | return TRUE; |
30 | | |
31 | 533k | const bool bIsSingleDriver = poOpenInfo->IsSingleAllowedDriver("WMTS"); |
32 | 533k | if (bIsSingleDriver && (STARTS_WITH(poOpenInfo->pszFilename, "http://") || |
33 | 0 | STARTS_WITH(poOpenInfo->pszFilename, "https://"))) |
34 | 0 | { |
35 | 0 | return true; |
36 | 0 | } |
37 | | |
38 | 533k | if (poOpenInfo->nHeaderBytes == 0) |
39 | 459k | return FALSE; |
40 | | |
41 | 74.0k | const char *pszHeader = |
42 | 74.0k | reinterpret_cast<const char *>(poOpenInfo->pabyHeader); |
43 | 74.0k | if (strstr(pszHeader, "<GDAL_WMTS") || |
44 | 71.1k | ((strstr(pszHeader, "<Capabilities") || |
45 | 70.6k | strstr(pszHeader, "<wmts:Capabilities")) && |
46 | 578 | strstr(pszHeader, "http://www.opengis.net/wmts/1.0"))) |
47 | 3.02k | { |
48 | 3.02k | return TRUE; |
49 | 3.02k | } |
50 | | |
51 | 70.9k | if (bIsSingleDriver) |
52 | 0 | { |
53 | 0 | while (*pszHeader != 0 && |
54 | 0 | std::isspace(static_cast<unsigned char>(*pszHeader))) |
55 | 0 | ++pszHeader; |
56 | 0 | return *pszHeader == '<'; |
57 | 0 | } |
58 | | |
59 | 70.9k | return FALSE; |
60 | 70.9k | } |
61 | | |
62 | | /************************************************************************/ |
63 | | /* WMTSDriverSetCommonMetadata() */ |
64 | | /************************************************************************/ |
65 | | |
66 | | void WMTSDriverSetCommonMetadata(GDALDriver *poDriver) |
67 | 22 | { |
68 | 22 | poDriver->SetDescription(DRIVER_NAME); |
69 | 22 | poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES"); |
70 | 22 | poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "OGC Web Map Tile Service"); |
71 | 22 | poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/raster/wmts.html"); |
72 | | |
73 | 22 | poDriver->SetMetadataItem(GDAL_DMD_CONNECTION_PREFIX, "WMTS:"); |
74 | | |
75 | 22 | poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); |
76 | | |
77 | 22 | poDriver->SetMetadataItem( |
78 | 22 | GDAL_DMD_OPENOPTIONLIST, |
79 | 22 | "<OpenOptionList>" |
80 | 22 | " <Option name='URL' type='string' description='URL that points to " |
81 | 22 | "GetCapabilities response' required='YES'/>" |
82 | 22 | " <Option name='LAYER' type='string' description='Layer identifier'/>" |
83 | 22 | " <Option name='TILEMATRIXSET' alias='TMS' type='string' " |
84 | 22 | "description='Tile matrix set identifier'/>" |
85 | 22 | " <Option name='TILEMATRIX' type='string' description='Tile matrix " |
86 | 22 | "identifier of maximum zoom level. Exclusive with ZOOM_LEVEL.'/>" |
87 | 22 | " <Option name='ZOOM_LEVEL' alias='ZOOMLEVEL' type='int' " |
88 | 22 | "description='Maximum zoom level. Exclusive with TILEMATRIX.'/>" |
89 | 22 | " <Option name='STYLE' type='string' description='Style identifier'/>" |
90 | 22 | " <Option name='EXTENDBEYONDDATELINE' type='boolean' " |
91 | 22 | "description='Whether to enable extend-beyond-dateline behaviour' " |
92 | 22 | "default='NO'/>" |
93 | 22 | " <Option name='EXTENT_METHOD' type='string-select' description='How " |
94 | 22 | "the raster extent is computed' default='AUTO'>" |
95 | 22 | " <Value>AUTO</Value>" |
96 | 22 | " <Value>LAYER_BBOX</Value>" |
97 | 22 | " <Value>TILE_MATRIX_SET</Value>" |
98 | 22 | " <Value>MOST_PRECISE_TILE_MATRIX</Value>" |
99 | 22 | " </Option>" |
100 | 22 | " <Option name='CLIP_EXTENT_WITH_MOST_PRECISE_TILE_MATRIX' " |
101 | 22 | "type='boolean' description='Whether to use the implied bounds of the " |
102 | 22 | "most precise tile matrix to clip the layer extent (defaults to NO if " |
103 | 22 | "layer bounding box is used, YES otherwise)'/>" |
104 | 22 | " <Option name='CLIP_EXTENT_WITH_MOST_PRECISE_TILE_MATRIX_LIMITS' " |
105 | 22 | "type='boolean' description='Whether to use the implied bounds of the " |
106 | 22 | "most precise tile matrix limits to clip the layer extent (defaults to " |
107 | 22 | "NO if layer bounding box is used, YES otherwise)'/>" |
108 | 22 | "</OpenOptionList>"); |
109 | | |
110 | 22 | poDriver->pfnIdentify = WMTSDriverIdentify; |
111 | 22 | poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES"); |
112 | 22 | poDriver->SetMetadataItem(GDAL_DCAP_CREATECOPY, "YES"); |
113 | 22 | } |
114 | | |
115 | | /************************************************************************/ |
116 | | /* DeclareDeferredWMTSPlugin() */ |
117 | | /************************************************************************/ |
118 | | |
119 | | #ifdef PLUGIN_FILENAME |
120 | | void DeclareDeferredWMTSPlugin() |
121 | | { |
122 | | if (GDALGetDriverByName(DRIVER_NAME) != nullptr) |
123 | | { |
124 | | return; |
125 | | } |
126 | | auto poDriver = new GDALPluginDriverProxy(PLUGIN_FILENAME); |
127 | | #ifdef PLUGIN_INSTALLATION_MESSAGE |
128 | | poDriver->SetMetadataItem(GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE, |
129 | | PLUGIN_INSTALLATION_MESSAGE); |
130 | | #endif |
131 | | WMTSDriverSetCommonMetadata(poDriver); |
132 | | GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver); |
133 | | } |
134 | | #endif |