OpenCPN Partial API docs
Loading...
Searching...
No Matches
s57featuredefns.cpp
Go to the documentation of this file.
1/*****************************************************************************
2 * Copyright (c) 1999, 2001, 2003 Frank Warmerdam warmerdam@pobox.com
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20 * DEALINGS IN THE SOFTWARE.
21 *****************************************************************************/
22
29#include "s57.h"
30#include "gdal/ogr_api.h"
31#include "gdal/cpl_conv.h"
32#include "gdal/cpl_string.h"
33
34/************************************************************************/
35/* S57GenerateGeomFeatureDefn() */
36/************************************************************************/
37
38OGRFeatureDefn *S57GenerateGeomFeatureDefn(OGRwkbGeometryType eGType,
39 int nOptionFlags)
40
41{
42 OGRFeatureDefn *poFDefn = NULL;
43
44 if (eGType == wkbPoint) {
45 poFDefn = new OGRFeatureDefn("Point");
46 poFDefn->SetGeomType(eGType);
47 } else if (eGType == wkbLineString) {
48 poFDefn = new OGRFeatureDefn("Line");
49 poFDefn->SetGeomType(eGType);
50 } else if (eGType == wkbPolygon) {
51 poFDefn = new OGRFeatureDefn("Area");
52 poFDefn->SetGeomType(eGType);
53 } else if (eGType == wkbNone) {
54 poFDefn = new OGRFeatureDefn("Meta");
55 poFDefn->SetGeomType(eGType);
56 } else if (eGType == wkbUnknown) {
57 poFDefn = new OGRFeatureDefn("Generic");
58 poFDefn->SetGeomType(eGType);
59 } else
60 return NULL;
61
62 S57GenerateStandardAttributes(poFDefn, nOptionFlags);
63
64 return poFDefn;
65}
66
67/************************************************************************/
68/* S57GenerateVectorPrimitiveFeatureDefn() */
69/************************************************************************/
70
71OGRFeatureDefn *S57GenerateVectorPrimitiveFeatureDefn(int nRCNM,
72 int nOptionFlags)
73
74{
75 OGRFeatureDefn *poFDefn = NULL;
76
77 if (nRCNM == RCNM_VI) {
78 poFDefn = new OGRFeatureDefn(OGRN_VI);
79 poFDefn->SetGeomType(wkbPoint);
80 } else if (nRCNM == RCNM_VC) {
81 poFDefn = new OGRFeatureDefn(OGRN_VC);
82 poFDefn->SetGeomType(wkbPoint);
83 } else if (nRCNM == RCNM_VE) {
84 poFDefn = new OGRFeatureDefn(OGRN_VE);
85 poFDefn->SetGeomType(wkbLineString);
86 } else if (nRCNM == RCNM_VF) {
87 poFDefn = new OGRFeatureDefn(OGRN_VF);
88 poFDefn->SetGeomType(wkbPolygon);
89 } else
90 return NULL;
91
92 /* -------------------------------------------------------------------- */
93 /* Core vector primitive attributes */
94 /* -------------------------------------------------------------------- */
95 OGRFieldDefn oField("", OFTInteger);
96
97 oField.Set("RCNM", OFTInteger, 3, 0);
98 poFDefn->AddFieldDefn(&oField);
99
100 oField.Set("RCID", OFTInteger, 8, 0);
101 poFDefn->AddFieldDefn(&oField);
102
103 oField.Set("RVER", OFTInteger, 2, 0);
104 poFDefn->AddFieldDefn(&oField);
105
106 oField.Set("RUIN", OFTInteger, 2, 0);
107 poFDefn->AddFieldDefn(&oField);
108
109 /* -------------------------------------------------------------------- */
110 /* For lines we want to capture the point links for the first */
111 /* and last nodes. */
112 /* -------------------------------------------------------------------- */
113 if (nRCNM == RCNM_VE) {
114 oField.Set("NAME_RCNM_0", OFTInteger, 3, 0);
115 poFDefn->AddFieldDefn(&oField);
116
117 oField.Set("NAME_RCID_0", OFTInteger, 8, 0);
118 poFDefn->AddFieldDefn(&oField);
119
120 oField.Set("ORNT_0", OFTInteger, 3, 0);
121 poFDefn->AddFieldDefn(&oField);
122
123 oField.Set("USAG_0", OFTInteger, 3, 0);
124 poFDefn->AddFieldDefn(&oField);
125
126 oField.Set("TOPI_0", OFTInteger, 1, 0);
127 poFDefn->AddFieldDefn(&oField);
128
129 oField.Set("MASK_0", OFTInteger, 3, 0);
130 poFDefn->AddFieldDefn(&oField);
131
132 oField.Set("NAME_RCNM_1", OFTInteger, 3, 0);
133 poFDefn->AddFieldDefn(&oField);
134
135 oField.Set("NAME_RCID_1", OFTInteger, 8, 0);
136 poFDefn->AddFieldDefn(&oField);
137
138 oField.Set("ORNT_1", OFTInteger, 3, 0);
139 poFDefn->AddFieldDefn(&oField);
140
141 oField.Set("USAG_1", OFTInteger, 3, 0);
142 poFDefn->AddFieldDefn(&oField);
143
144 oField.Set("TOPI_1", OFTInteger, 1, 0);
145 poFDefn->AddFieldDefn(&oField);
146
147 oField.Set("MASK_1", OFTInteger, 3, 0);
148 poFDefn->AddFieldDefn(&oField);
149 }
150
151 return poFDefn;
152}
153
154/************************************************************************/
155/* S57GenerateObjectClassDefn() */
156/************************************************************************/
157
158OGRFeatureDefn *S57GenerateObjectClassDefn(S57ClassRegistrar *poCR, int nOBJL,
159 int nOptionFlags)
160
161{
162 OGRFeatureDefn *poFDefn = NULL;
163 char **papszGeomPrim;
164
165 if (!poCR->SelectClass(nOBJL)) return NULL;
166
167 /* -------------------------------------------------------------------- */
168 /* Create the feature definition based on the object class */
169 /* acronym. */
170 /* -------------------------------------------------------------------- */
171 poFDefn = new OGRFeatureDefn(poCR->GetAcronym());
172
173 /* -------------------------------------------------------------------- */
174 /* Set the nOBJL Class Code as a convenience */
175 /* -------------------------------------------------------------------- */
176 poFDefn->SetOBJL(nOBJL);
177
178 /* -------------------------------------------------------------------- */
179 /* Try and establish the geometry type. If more than one */
180 /* geometry type is allowed we just fall back to wkbUnknown. */
181 /* -------------------------------------------------------------------- */
182 papszGeomPrim = poCR->GetPrimitives();
183 if (CSLCount(papszGeomPrim) == 0) {
184 poFDefn->SetGeomType(wkbNone);
185 } else if (CSLCount(papszGeomPrim) > 1) {
186 // leave as unknown geometry type.
187 } else if (EQUAL(papszGeomPrim[0], "Point")) {
188 if (EQUAL(poCR->GetAcronym(), "SOUNDG")) {
189 if (nOptionFlags & S57M_SPLIT_MULTIPOINT)
190 poFDefn->SetGeomType(wkbPoint25D);
191 else
192 poFDefn->SetGeomType(wkbMultiPoint);
193 } else
194 poFDefn->SetGeomType(wkbPoint);
195 } else if (EQUAL(papszGeomPrim[0], "Area")) {
196 poFDefn->SetGeomType(wkbPolygon);
197 } else if (EQUAL(papszGeomPrim[0], "Line")) {
198 poFDefn->SetGeomType(wkbLineString);
199 }
200
201 /* -------------------------------------------------------------------- */
202 /* Add the standard attributes. */
203 /* -------------------------------------------------------------------- */
204 S57GenerateStandardAttributes(poFDefn, nOptionFlags);
205
206 /* -------------------------------------------------------------------- */
207 /* Add the attributes specific to this object class. */
208 /* -------------------------------------------------------------------- */
209 char **papszAttrList = poCR->GetAttributeList();
210
211 for (int iAttr = 0; papszAttrList != NULL && papszAttrList[iAttr] != NULL;
212 iAttr++) {
213 char *tt = papszAttrList[iAttr];
214 int iAttrIndex = poCR->FindAttrByAcronym(papszAttrList[iAttr]);
215
216 if (iAttrIndex == -1) {
217 CPLDebug("S57", "Can't find attribute %s from class %s:%s.\n",
218 papszAttrList[iAttr], poCR->GetAcronym(),
219 poCR->GetDescription());
220 continue;
221 }
222
223 OGRFieldDefn oField(papszAttrList[iAttr], OFTInteger);
224
225 switch (poCR->GetAttrType(iAttrIndex)) {
226 case SAT_ENUM:
227 case SAT_INT:
228 oField.SetType(OFTInteger);
229 break;
230
231 case SAT_FLOAT:
232 oField.SetType(OFTReal);
233 break;
234
235 case SAT_CODE_STRING:
236 case SAT_FREE_TEXT:
237 oField.SetType(OFTString);
238 break;
239
240 case SAT_LIST:
241 oField.SetType(OFTString);
242 break;
243 }
244
245 poFDefn->AddFieldDefn(&oField);
246 }
247
248 /* -------------------------------------------------------------------- */
249 /* Do we need to add DEPTH attributes to soundings? */
250 /* -------------------------------------------------------------------- */
251 if (EQUAL(poCR->GetAcronym(), "SOUNDG") &&
252 (nOptionFlags & S57M_ADD_SOUNDG_DEPTH)) {
253 OGRFieldDefn oField("DEPTH", OFTReal);
254 poFDefn->AddFieldDefn(&oField);
255 }
256
257 return poFDefn;
258}
259
260/*************************************************************************/
261/* S57GenerateObjectClassDefn() */
262/* Expedited for COVR only */
263/*************************************************************************/
264
265OGRFeatureDefn *S57GenerateObjectClassDefnM_COVR( int nOBJL )
266
267{
268 OGRFeatureDefn *poFDefn = NULL;
269
270 /* -------------------------------------------------------------------- */
271 /* Create the feature definition based on the object class */
272 /* acronym. */
273 /* -------------------------------------------------------------------- */
274 poFDefn = new OGRFeatureDefn("M_COVR");
275
276 poFDefn->SetOBJL(nOBJL);
277 poFDefn->SetGeomType(wkbPolygon);
278
279 /* -------------------------------------------------------------------- */
280 /* Add the CATCOV attribute */
281 /* -------------------------------------------------------------------- */
282 OGRFieldDefn oField("CATCOV", OFTInteger);
283 oField.SetType(OFTInteger);
284 poFDefn->AddFieldDefn(&oField);
285
286 return poFDefn;
287}
288
289/************************************************************************/
290/* S57GenerateStandardAttributes() */
291/* */
292/* Attach standard feature attributes to a feature definition. */
293/************************************************************************/
294
295void S57GenerateStandardAttributes(OGRFeatureDefn *poFDefn, int nOptionFlags)
296
297{
298 OGRFieldDefn oField("", OFTInteger);
299
300 /* -------------------------------------------------------------------- */
301 /* RCID */
302 /* -------------------------------------------------------------------- */
303 oField.Set("RCID", OFTInteger, 10, 0);
304 poFDefn->AddFieldDefn(&oField);
305
306 /* -------------------------------------------------------------------- */
307 /* PRIM */
308 /* -------------------------------------------------------------------- */
309 oField.Set("PRIM", OFTInteger, 3, 0);
310 poFDefn->AddFieldDefn(&oField);
311
312 /* -------------------------------------------------------------------- */
313 /* GRUP */
314 /* -------------------------------------------------------------------- */
315 oField.Set("GRUP", OFTInteger, 3, 0);
316 poFDefn->AddFieldDefn(&oField);
317
318 /* -------------------------------------------------------------------- */
319 /* OBJL */
320 /* -------------------------------------------------------------------- */
321 oField.Set("OBJL", OFTInteger, 5, 0);
322 poFDefn->AddFieldDefn(&oField);
323
324 /* -------------------------------------------------------------------- */
325 /* RVER */
326 /* -------------------------------------------------------------------- */
327 oField.Set("RVER", OFTInteger, 3, 0);
328 poFDefn->AddFieldDefn(&oField);
329
330 /* -------------------------------------------------------------------- */
331 /* AGEN */
332 /* -------------------------------------------------------------------- */
333 oField.Set("AGEN", OFTInteger, 5, 0);
334 poFDefn->AddFieldDefn(&oField);
335
336 /* -------------------------------------------------------------------- */
337 /* FIDN */
338 /* -------------------------------------------------------------------- */
339 oField.Set("FIDN", OFTInteger, 10, 0);
340 poFDefn->AddFieldDefn(&oField);
341
342 /* -------------------------------------------------------------------- */
343 /* FIDS */
344 /* -------------------------------------------------------------------- */
345 oField.Set("FIDS", OFTInteger, 5, 0);
346 poFDefn->AddFieldDefn(&oField);
347
348 /* -------------------------------------------------------------------- */
349 /* LNAM - only generated when LNAM strings are being used. */
350 /* -------------------------------------------------------------------- */
351 if (nOptionFlags & S57M_LNAM_REFS) {
352 oField.Set("LNAM", OFTString, 16, 0);
353 poFDefn->AddFieldDefn(&oField);
354
355 oField.Set("LNAM_REFS", OFTStringList, 16, 0);
356 poFDefn->AddFieldDefn(&oField);
357
358 oField.Set("FFPT_RIND", OFTIntegerList, 1, 0);
359 poFDefn->AddFieldDefn(&oField);
360
361 // We should likely include FFPT_COMT here.
362 }
363
364 /* -------------------------------------------------------------------- */
365 /* Values from FSPT field. */
366 /* -------------------------------------------------------------------- */
367 if (nOptionFlags & S57M_RETURN_LINKAGES) {
368 oField.Set("NAME_RCNM", OFTIntegerList, 3, 0);
369 poFDefn->AddFieldDefn(&oField);
370
371 oField.Set("NAME_RCID", OFTIntegerList, 10, 0);
372 poFDefn->AddFieldDefn(&oField);
373
374 oField.Set("ORNT", OFTIntegerList, 1, 0);
375 poFDefn->AddFieldDefn(&oField);
376
377 oField.Set("USAG", OFTIntegerList, 1, 0);
378 poFDefn->AddFieldDefn(&oField);
379
380 oField.Set("MASK", OFTIntegerList, 3, 0);
381 poFDefn->AddFieldDefn(&oField);
382 }
383}
Declarations for S-57 translator not including the binding onto OGRLayer/DataSource/Driver which are ...