30#include "gdal/ogr_api.h"
31#include "gdal/cpl_conv.h"
32#include "gdal/cpl_string.h"
38OGRFeatureDefn *S57GenerateGeomFeatureDefn(OGRwkbGeometryType eGType,
42 OGRFeatureDefn *poFDefn = NULL;
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);
62 S57GenerateStandardAttributes(poFDefn, nOptionFlags);
71OGRFeatureDefn *S57GenerateVectorPrimitiveFeatureDefn(
int nRCNM,
75 OGRFeatureDefn *poFDefn = NULL;
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);
95 OGRFieldDefn oField(
"", OFTInteger);
97 oField.Set(
"RCNM", OFTInteger, 3, 0);
98 poFDefn->AddFieldDefn(&oField);
100 oField.Set(
"RCID", OFTInteger, 8, 0);
101 poFDefn->AddFieldDefn(&oField);
103 oField.Set(
"RVER", OFTInteger, 2, 0);
104 poFDefn->AddFieldDefn(&oField);
106 oField.Set(
"RUIN", OFTInteger, 2, 0);
107 poFDefn->AddFieldDefn(&oField);
113 if (nRCNM == RCNM_VE) {
114 oField.Set(
"NAME_RCNM_0", OFTInteger, 3, 0);
115 poFDefn->AddFieldDefn(&oField);
117 oField.Set(
"NAME_RCID_0", OFTInteger, 8, 0);
118 poFDefn->AddFieldDefn(&oField);
120 oField.Set(
"ORNT_0", OFTInteger, 3, 0);
121 poFDefn->AddFieldDefn(&oField);
123 oField.Set(
"USAG_0", OFTInteger, 3, 0);
124 poFDefn->AddFieldDefn(&oField);
126 oField.Set(
"TOPI_0", OFTInteger, 1, 0);
127 poFDefn->AddFieldDefn(&oField);
129 oField.Set(
"MASK_0", OFTInteger, 3, 0);
130 poFDefn->AddFieldDefn(&oField);
132 oField.Set(
"NAME_RCNM_1", OFTInteger, 3, 0);
133 poFDefn->AddFieldDefn(&oField);
135 oField.Set(
"NAME_RCID_1", OFTInteger, 8, 0);
136 poFDefn->AddFieldDefn(&oField);
138 oField.Set(
"ORNT_1", OFTInteger, 3, 0);
139 poFDefn->AddFieldDefn(&oField);
141 oField.Set(
"USAG_1", OFTInteger, 3, 0);
142 poFDefn->AddFieldDefn(&oField);
144 oField.Set(
"TOPI_1", OFTInteger, 1, 0);
145 poFDefn->AddFieldDefn(&oField);
147 oField.Set(
"MASK_1", OFTInteger, 3, 0);
148 poFDefn->AddFieldDefn(&oField);
162 OGRFeatureDefn *poFDefn = NULL;
163 char **papszGeomPrim;
165 if (!poCR->SelectClass(nOBJL))
return NULL;
171 poFDefn =
new OGRFeatureDefn(poCR->GetAcronym());
176 poFDefn->SetOBJL(nOBJL);
182 papszGeomPrim = poCR->GetPrimitives();
183 if (CSLCount(papszGeomPrim) == 0) {
184 poFDefn->SetGeomType(wkbNone);
185 }
else if (CSLCount(papszGeomPrim) > 1) {
187 }
else if (EQUAL(papszGeomPrim[0],
"Point")) {
188 if (EQUAL(poCR->GetAcronym(),
"SOUNDG")) {
189 if (nOptionFlags & S57M_SPLIT_MULTIPOINT)
190 poFDefn->SetGeomType(wkbPoint25D);
192 poFDefn->SetGeomType(wkbMultiPoint);
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);
204 S57GenerateStandardAttributes(poFDefn, nOptionFlags);
209 char **papszAttrList = poCR->GetAttributeList();
211 for (
int iAttr = 0; papszAttrList != NULL && papszAttrList[iAttr] != NULL;
213 char *tt = papszAttrList[iAttr];
214 int iAttrIndex = poCR->FindAttrByAcronym(papszAttrList[iAttr]);
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());
223 OGRFieldDefn oField(papszAttrList[iAttr], OFTInteger);
225 switch (poCR->GetAttrType(iAttrIndex)) {
228 oField.SetType(OFTInteger);
232 oField.SetType(OFTReal);
235 case SAT_CODE_STRING:
237 oField.SetType(OFTString);
241 oField.SetType(OFTString);
245 poFDefn->AddFieldDefn(&oField);
251 if (EQUAL(poCR->GetAcronym(),
"SOUNDG") &&
252 (nOptionFlags & S57M_ADD_SOUNDG_DEPTH)) {
253 OGRFieldDefn oField(
"DEPTH", OFTReal);
254 poFDefn->AddFieldDefn(&oField);
265OGRFeatureDefn *S57GenerateObjectClassDefnM_COVR(
int nOBJL )
268 OGRFeatureDefn *poFDefn = NULL;
274 poFDefn =
new OGRFeatureDefn(
"M_COVR");
276 poFDefn->SetOBJL(nOBJL);
277 poFDefn->SetGeomType(wkbPolygon);
282 OGRFieldDefn oField(
"CATCOV", OFTInteger);
283 oField.SetType(OFTInteger);
284 poFDefn->AddFieldDefn(&oField);
295void S57GenerateStandardAttributes(OGRFeatureDefn *poFDefn,
int nOptionFlags)
298 OGRFieldDefn oField(
"", OFTInteger);
303 oField.Set(
"RCID", OFTInteger, 10, 0);
304 poFDefn->AddFieldDefn(&oField);
309 oField.Set(
"PRIM", OFTInteger, 3, 0);
310 poFDefn->AddFieldDefn(&oField);
315 oField.Set(
"GRUP", OFTInteger, 3, 0);
316 poFDefn->AddFieldDefn(&oField);
321 oField.Set(
"OBJL", OFTInteger, 5, 0);
322 poFDefn->AddFieldDefn(&oField);
327 oField.Set(
"RVER", OFTInteger, 3, 0);
328 poFDefn->AddFieldDefn(&oField);
333 oField.Set(
"AGEN", OFTInteger, 5, 0);
334 poFDefn->AddFieldDefn(&oField);
339 oField.Set(
"FIDN", OFTInteger, 10, 0);
340 poFDefn->AddFieldDefn(&oField);
345 oField.Set(
"FIDS", OFTInteger, 5, 0);
346 poFDefn->AddFieldDefn(&oField);
351 if (nOptionFlags & S57M_LNAM_REFS) {
352 oField.Set(
"LNAM", OFTString, 16, 0);
353 poFDefn->AddFieldDefn(&oField);
355 oField.Set(
"LNAM_REFS", OFTStringList, 16, 0);
356 poFDefn->AddFieldDefn(&oField);
358 oField.Set(
"FFPT_RIND", OFTIntegerList, 1, 0);
359 poFDefn->AddFieldDefn(&oField);
367 if (nOptionFlags & S57M_RETURN_LINKAGES) {
368 oField.Set(
"NAME_RCNM", OFTIntegerList, 3, 0);
369 poFDefn->AddFieldDefn(&oField);
371 oField.Set(
"NAME_RCID", OFTIntegerList, 10, 0);
372 poFDefn->AddFieldDefn(&oField);
374 oField.Set(
"ORNT", OFTIntegerList, 1, 0);
375 poFDefn->AddFieldDefn(&oField);
377 oField.Set(
"USAG", OFTIntegerList, 1, 0);
378 poFDefn->AddFieldDefn(&oField);
380 oField.Set(
"MASK", OFTIntegerList, 3, 0);
381 poFDefn->AddFieldDefn(&oField);
Declarations for S-57 translator not including the binding onto OGRLayer/DataSource/Driver which are ...