Line data Source code
1 : // SPDX-License-Identifier: MIT
2 : // Copyright 2024, Even Rouault <even.rouault at spatialys.com>
3 :
4 : #include "ogrvrtgeometrytypes.h"
5 :
6 : /************************************************************************/
7 : /* OGRVRTGetGeometryType() */
8 : /************************************************************************/
9 :
10 : #define STRINGIFY(x) x, #x
11 :
12 : static const struct
13 : {
14 : OGRwkbGeometryType eType;
15 : const char *pszName;
16 : bool bIsoFlags;
17 : } asGeomTypeNames[] = {
18 : {STRINGIFY(wkbUnknown), false},
19 :
20 : {STRINGIFY(wkbPoint), false},
21 : {STRINGIFY(wkbLineString), false},
22 : {STRINGIFY(wkbPolygon), false},
23 : {STRINGIFY(wkbMultiPoint), false},
24 : {STRINGIFY(wkbMultiLineString), false},
25 : {STRINGIFY(wkbMultiPolygon), false},
26 : {STRINGIFY(wkbGeometryCollection), false},
27 :
28 : {STRINGIFY(wkbCircularString), true},
29 : {STRINGIFY(wkbCompoundCurve), true},
30 : {STRINGIFY(wkbCurvePolygon), true},
31 : {STRINGIFY(wkbMultiCurve), true},
32 : {STRINGIFY(wkbMultiSurface), true},
33 : {STRINGIFY(wkbCurve), true},
34 : {STRINGIFY(wkbSurface), true},
35 : {STRINGIFY(wkbPolyhedralSurface), true},
36 : {STRINGIFY(wkbTIN), true},
37 : {STRINGIFY(wkbTriangle), true},
38 :
39 : {STRINGIFY(wkbNone), false},
40 : {STRINGIFY(wkbLinearRing), false},
41 : };
42 :
43 494 : OGRwkbGeometryType OGRVRTGetGeometryType(const char *pszGType, int *pbError)
44 : {
45 494 : if (pbError)
46 494 : *pbError = FALSE;
47 :
48 1633 : for (const auto &entry : asGeomTypeNames)
49 : {
50 1632 : if (EQUALN(pszGType, entry.pszName, strlen(entry.pszName)))
51 : {
52 493 : OGRwkbGeometryType eGeomType = entry.eType;
53 :
54 493 : if (strstr(pszGType, "25D") != nullptr ||
55 460 : strstr(pszGType, "Z") != nullptr)
56 54 : eGeomType = wkbSetZ(eGeomType);
57 493 : if (pszGType[strlen(pszGType) - 1] == 'M' ||
58 465 : pszGType[strlen(pszGType) - 2] == 'M')
59 28 : eGeomType = wkbSetM(eGeomType);
60 493 : return eGeomType;
61 : }
62 : }
63 :
64 1 : if (pbError)
65 1 : *pbError = TRUE;
66 1 : return wkbUnknown;
67 : }
68 :
69 : /************************************************************************/
70 : /* OGRVRTGetSerializedGeometryType() */
71 : /************************************************************************/
72 :
73 54 : std::string OGRVRTGetSerializedGeometryType(OGRwkbGeometryType eGeomType)
74 : {
75 294 : for (const auto &entry : asGeomTypeNames)
76 : {
77 294 : if (entry.eType == wkbFlatten(eGeomType))
78 : {
79 108 : std::string osRet(entry.pszName);
80 54 : if (entry.bIsoFlags || OGR_GT_HasM(eGeomType))
81 : {
82 0 : if (OGR_GT_HasZ(eGeomType))
83 : {
84 0 : osRet += "Z";
85 : }
86 0 : if (OGR_GT_HasM(eGeomType))
87 : {
88 0 : osRet += "M";
89 : }
90 : }
91 54 : else if (OGR_GT_HasZ(eGeomType))
92 : {
93 21 : osRet += "25D";
94 : }
95 54 : return osRet;
96 : }
97 : }
98 0 : return std::string();
99 : }
|