Coverage Report

Created: 2025-12-31 08:30

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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