Coverage Report

Created: 2026-03-30 09:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/gdal/ogr/ogrsf_frmts/jsonfg/ogrjsonfgdriver.cpp
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Project:  OpenGIS Simple Features Reference Implementation
4
 * Purpose:  Implementation of OGC Features and Geometries JSON (JSON-FG)
5
 * Author:   Even Rouault <even.rouault at spatialys.com>
6
 *
7
 ******************************************************************************
8
 * Copyright (c) 2023, Even Rouault <even.rouault at spatialys.com>
9
 *
10
 * SPDX-License-Identifier: MIT
11
 ****************************************************************************/
12
13
#include "gdal_priv.h"
14
#include "ogrsf_frmts.h"
15
16
#include "ogr_jsonfg.h"
17
#include "ogrgeojsonutils.h"
18
19
/************************************************************************/
20
/*                      OGRJSONFGDriverIdentify()                       */
21
/************************************************************************/
22
23
static int OGRJSONFGDriverIdentify(GDALOpenInfo *poOpenInfo)
24
83.0k
{
25
83.0k
    GeoJSONSourceType nSrcType = JSONFGDriverGetSourceType(poOpenInfo);
26
83.0k
    if (nSrcType == eGeoJSONSourceUnknown)
27
81.6k
        return FALSE;
28
1.47k
    if (nSrcType == eGeoJSONSourceService)
29
843
    {
30
843
        if (poOpenInfo->IsSingleAllowedDriver("JSONFG"))
31
0
            return TRUE;
32
843
        if (!STARTS_WITH_CI(poOpenInfo->pszFilename, "JSONFG:"))
33
787
        {
34
787
            return -1;
35
787
        }
36
843
    }
37
690
    return TRUE;
38
1.47k
}
39
40
/************************************************************************/
41
/*                                Open()                                */
42
/************************************************************************/
43
44
static GDALDataset *OGRJSONFGDriverOpen(GDALOpenInfo *poOpenInfo)
45
1.47k
{
46
1.47k
    GeoJSONSourceType nSrcType = JSONFGDriverGetSourceType(poOpenInfo);
47
1.47k
    if (nSrcType == eGeoJSONSourceUnknown)
48
0
        return nullptr;
49
1.47k
    auto poDS = std::make_unique<OGRJSONFGDataset>();
50
1.47k
    if (!poDS->Open(poOpenInfo, nSrcType))
51
1.45k
        return nullptr;
52
22
    return poDS.release();
53
1.47k
}
54
55
/************************************************************************/
56
/*                               Create()                               */
57
/************************************************************************/
58
59
static GDALDataset *OGRJSONFGDriverCreate(const char *pszName, int /* nBands */,
60
                                          int /* nXSize */, int /* nYSize */,
61
                                          GDALDataType /* eDT */,
62
                                          CSLConstList papszOptions)
63
0
{
64
0
    auto poDS = std::make_unique<OGRJSONFGDataset>();
65
0
    if (!poDS->Create(pszName, papszOptions))
66
0
    {
67
0
        return nullptr;
68
0
    }
69
0
    return poDS.release();
70
0
}
71
72
/************************************************************************/
73
/*                         RegisterOGRJSONFG()                          */
74
/************************************************************************/
75
76
void RegisterOGRJSONFG()
77
22
{
78
22
    if (GDALGetDriverByName("JSONFG") != nullptr)
79
0
        return;
80
81
22
    GDALDriver *poDriver = new GDALDriver();
82
83
22
    poDriver->SetDescription("JSONFG");
84
22
    poDriver->SetMetadataItem(GDAL_DCAP_VECTOR, "YES");
85
22
    poDriver->SetMetadataItem(GDAL_DCAP_CREATE_LAYER, "YES");
86
22
    poDriver->SetMetadataItem(GDAL_DCAP_CREATE_FIELD, "YES");
87
22
    poDriver->SetMetadataItem(GDAL_DCAP_Z_GEOMETRIES, "YES");
88
22
    poDriver->SetMetadataItem(GDAL_DCAP_MEASURED_GEOMETRIES, "YES");
89
22
    poDriver->SetMetadataItem(GDAL_DCAP_CURVE_GEOMETRIES, "YES");
90
22
    poDriver->SetMetadataItem(GDAL_DMD_LONGNAME,
91
22
                              "OGC Features and Geometries JSON");
92
22
    poDriver->SetMetadataItem(GDAL_DMD_EXTENSIONS, "json");
93
22
    poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/vector/jsonfg.html");
94
95
22
    poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES");
96
97
22
    poDriver->SetMetadataItem(
98
22
        GDAL_DMD_OPENOPTIONLIST,
99
22
        "<OpenOptionList>"
100
22
        "  <Option name='GEOMETRY_ELEMENT' type='string-select' "
101
22
        "description='Which JSON element to use to create geometry from'>"
102
22
        "    <Value>AUTO</Value>"
103
22
        "    <Value>PLACE</Value>"
104
22
        "    <Value>GEOMETRY</Value>"
105
22
        "  </Option>"
106
22
        "</OpenOptionList>");
107
108
22
    poDriver->SetMetadataItem(
109
22
        GDAL_DMD_CREATIONOPTIONLIST,
110
22
        "<CreationOptionList>"
111
22
        "  <Option name='SINGLE_LAYER' type='boolean' description='whether "
112
22
        "only one layer will be written' default='NO'/>"
113
22
        "</CreationOptionList>");
114
115
22
    poDriver->SetMetadataItem(
116
22
        GDAL_DS_LAYER_CREATIONOPTIONLIST,
117
22
        "<LayerCreationOptionList>"
118
22
        "  <Option name='COORDINATE_PRECISION_GEOMETRY' type='int' "
119
22
        "description='Number of decimal for coordinates in the geometry "
120
22
        "element'/>"
121
22
        "  <Option name='COORDINATE_PRECISION_PLACE' type='int' "
122
22
        "description='Number of decimal for coordinates in the place element'/>"
123
22
        "  <Option name='WRITE_GEOMETRY' type='boolean' "
124
22
        "description='Can be set to NO to avoid writing the geometry element "
125
22
        "when place is written' default='YES'/>"
126
22
        "  <Option name='SIGNIFICANT_FIGURES' type='int' description='Number "
127
22
        "of significant figures for floating-point values' default='17'/>"
128
22
        "  <Option name='ID_FIELD' type='string' description='Name of the "
129
22
        "source field that must be used as the id member of Feature features'/>"
130
22
        "  <Option name='ID_TYPE' type='string-select' description='Type of "
131
22
        "the id member of Feature features'>"
132
22
        "    <Value>AUTO</Value>"
133
22
        "    <Value>String</Value>"
134
22
        "    <Value>Integer</Value>"
135
22
        "  </Option>"
136
22
        "  <Option name='ID_GENERATE' type='boolean' "
137
22
        "description='Auto-generate feature ids' default='NO'/>"
138
22
        "  <Option name='MEASURE_UNIT' type='string' "
139
22
        "description='Unit of measures (M) values'/>"
140
22
        "  <Option name='MEASURE_DESCRIPTION' type='string' "
141
22
        "description='Description of measures (M) values'/>"
142
22
        "</LayerCreationOptionList>");
143
144
22
    poDriver->SetMetadataItem(
145
22
        GDAL_DMD_CREATIONFIELDDATATYPES,
146
22
        "Integer Integer64 Real String IntegerList "
147
22
        "Integer64List RealList StringList Date DateTime");
148
22
    poDriver->SetMetadataItem(GDAL_DMD_CREATIONFIELDDATASUBTYPES, "Boolean");
149
22
    poDriver->SetMetadataItem(GDAL_DMD_SUPPORTED_SQL_DIALECTS, "OGRSQL SQLITE");
150
22
    poDriver->SetMetadataItem(GDAL_DCAP_FLUSHCACHE_CONSISTENT_STATE, "YES");
151
22
    poDriver->SetMetadataItem(GDAL_DCAP_HONOR_GEOM_COORDINATE_PRECISION, "YES");
152
153
22
    poDriver->pfnOpen = OGRJSONFGDriverOpen;
154
22
    poDriver->pfnIdentify = OGRJSONFGDriverIdentify;
155
22
    poDriver->pfnCreate = OGRJSONFGDriverCreate;
156
157
22
    GetGDALDriverManager()->RegisterDriver(poDriver);
158
22
}