/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 | } |