PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ lwtype_from_wkb_state()

static void lwtype_from_wkb_state ( wkb_parse_state s,
uint32_t  wkb_type 
)
static

Take in an unknown kind of wkb type number and ensure it comes out as an extended WKB type number (with Z/M/SRID flags masked onto the high bits).

Definition at line 145 of file lwin_wkb.c.

146{
147 uint32_t wkb_simple_type;
148
149 LWDEBUG(4, "Entered function");
150
151 s->has_z = LW_FALSE;
152 s->has_m = LW_FALSE;
153 s->has_srid = LW_FALSE;
154
155 /* If any of the higher bits are set, this is probably an extended type. */
156 if( wkb_type & 0xF0000000 )
157 {
158 if( wkb_type & WKBZOFFSET ) s->has_z = LW_TRUE;
159 if( wkb_type & WKBMOFFSET ) s->has_m = LW_TRUE;
160 if( wkb_type & WKBSRIDFLAG ) s->has_srid = LW_TRUE;
161 LWDEBUGF(4, "Extended type: has_z=%d has_m=%d has_srid=%d", s->has_z, s->has_m, s->has_srid);
162 }
163
164 /* Mask off the flags */
165 wkb_type = wkb_type & 0x0FFFFFFF;
166
167 /* Catch strange Oracle WKB type numbers */
168 if ( wkb_type >= 4000 ) {
169 lwerror("Unknown WKB type (%d)!", wkb_type);
170 return;
171 }
172
173 /* Strip out just the type number (1-12) from the ISO number (eg 3001-3012) */
174 wkb_simple_type = wkb_type % 1000;
175
176 /* Extract the Z/M information from ISO style numbers */
177 if( wkb_type >= 3000 && wkb_type < 4000 )
178 {
179 s->has_z = LW_TRUE;
180 s->has_m = LW_TRUE;
181 }
182 else if ( wkb_type >= 2000 && wkb_type < 3000 )
183 {
184 s->has_m = LW_TRUE;
185 }
186 else if ( wkb_type >= 1000 && wkb_type < 2000 )
187 {
188 s->has_z = LW_TRUE;
189 }
190
191 switch (wkb_simple_type)
192 {
193 case WKB_POINT_TYPE:
194 s->lwtype = POINTTYPE;
195 break;
197 s->lwtype = LINETYPE;
198 break;
199 case WKB_POLYGON_TYPE:
200 s->lwtype = POLYGONTYPE;
201 break;
203 s->lwtype = MULTIPOINTTYPE;
204 break;
206 s->lwtype = MULTILINETYPE;
207 break;
209 s->lwtype = MULTIPOLYGONTYPE;
210 break;
212 s->lwtype = COLLECTIONTYPE;
213 break;
215 s->lwtype = CIRCSTRINGTYPE;
216 break;
218 s->lwtype = COMPOUNDTYPE;
219 break;
221 s->lwtype = CURVEPOLYTYPE;
222 break;
224 s->lwtype = MULTICURVETYPE;
225 break;
227 s->lwtype = MULTISURFACETYPE;
228 break;
230 s->lwtype = POLYHEDRALSURFACETYPE;
231 break;
232 case WKB_TIN_TYPE:
233 s->lwtype = TINTYPE;
234 break;
236 s->lwtype = TRIANGLETYPE;
237 break;
238
239 /* PostGIS 1.5 emits 13, 14 for CurvePolygon, MultiCurve */
240 /* These numbers aren't SQL/MM (numbers currently only */
241 /* go up to 12. We can handle the old data here (for now??) */
242 /* converting them into the lwtypes that are intended. */
243 case WKB_CURVE_TYPE:
244 s->lwtype = CURVEPOLYTYPE;
245 break;
246 case WKB_SURFACE_TYPE:
247 s->lwtype = MULTICURVETYPE;
248 break;
249
250 default: /* Error! */
251 lwerror("Unknown WKB type (%d)! Full WKB type number was (%d).", wkb_simple_type, wkb_type);
252 break;
253 }
254
255 LWDEBUGF(4,"Got lwtype %s (%u)", lwtype_name(s->lwtype), s->lwtype);
256
257 return;
258}
char * s
Definition cu_in_wkt.c:23
const char * lwtype_name(uint8_t type)
Return the type name string associated with a type number (e.g.
Definition lwutil.c:216
#define WKBMOFFSET
Definition liblwgeom.h:125
#define LW_FALSE
Definition liblwgeom.h:94
#define COLLECTIONTYPE
Definition liblwgeom.h:108
#define COMPOUNDTYPE
Definition liblwgeom.h:110
#define CURVEPOLYTYPE
Definition liblwgeom.h:111
#define MULTILINETYPE
Definition liblwgeom.h:106
#define MULTISURFACETYPE
Definition liblwgeom.h:113
#define LINETYPE
Definition liblwgeom.h:103
#define MULTIPOINTTYPE
Definition liblwgeom.h:105
#define WKBSRIDFLAG
Definition liblwgeom.h:126
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
Definition liblwgeom.h:102
#define TINTYPE
Definition liblwgeom.h:116
#define MULTIPOLYGONTYPE
Definition liblwgeom.h:107
#define POLYGONTYPE
Definition liblwgeom.h:104
#define POLYHEDRALSURFACETYPE
Definition liblwgeom.h:114
#define CIRCSTRINGTYPE
Definition liblwgeom.h:109
#define MULTICURVETYPE
Definition liblwgeom.h:112
#define TRIANGLETYPE
Definition liblwgeom.h:115
#define LW_TRUE
Return types for functions with status returns.
Definition liblwgeom.h:93
#define WKBZOFFSET
Flags applied in EWKB to indicate Z/M dimensions and presence/absence of SRID and bounding boxes.
Definition liblwgeom.h:124
#define WKB_COMPOUNDCURVE_TYPE
#define WKB_POLYHEDRALSURFACE_TYPE
#define WKB_GEOMETRYCOLLECTION_TYPE
#define WKB_TRIANGLE_TYPE
#define WKB_MULTIPOLYGON_TYPE
#define WKB_CURVE_TYPE
#define WKB_MULTIPOINT_TYPE
#define WKB_MULTISURFACE_TYPE
#define WKB_CURVEPOLYGON_TYPE
#define WKB_POINT_TYPE
Well-Known Binary (WKB) Geometry Types.
#define WKB_MULTICURVE_TYPE
#define WKB_SURFACE_TYPE
#define WKB_MULTILINESTRING_TYPE
#define WKB_LINESTRING_TYPE
#define WKB_CIRCULARSTRING_TYPE
#define WKB_POLYGON_TYPE
#define WKB_TIN_TYPE
#define LWDEBUG(level, msg)
Definition lwgeom_log.h:101
#define LWDEBUGF(level, msg,...)
Definition lwgeom_log.h:106
void void lwerror(const char *fmt,...) __attribute__((format(printf
Write a notice out to the error handler.

References CIRCSTRINGTYPE, COLLECTIONTYPE, COMPOUNDTYPE, CURVEPOLYTYPE, LINETYPE, LW_FALSE, LW_TRUE, LWDEBUG, LWDEBUGF, lwerror(), lwtype_name(), MULTICURVETYPE, MULTILINETYPE, MULTIPOINTTYPE, MULTIPOLYGONTYPE, MULTISURFACETYPE, POINTTYPE, POLYGONTYPE, POLYHEDRALSURFACETYPE, s, TINTYPE, TRIANGLETYPE, WKB_CIRCULARSTRING_TYPE, WKB_COMPOUNDCURVE_TYPE, WKB_CURVE_TYPE, WKB_CURVEPOLYGON_TYPE, WKB_GEOMETRYCOLLECTION_TYPE, WKB_LINESTRING_TYPE, WKB_MULTICURVE_TYPE, WKB_MULTILINESTRING_TYPE, WKB_MULTIPOINT_TYPE, WKB_MULTIPOLYGON_TYPE, WKB_MULTISURFACE_TYPE, WKB_POINT_TYPE, WKB_POLYGON_TYPE, WKB_POLYHEDRALSURFACE_TYPE, WKB_SURFACE_TYPE, WKB_TIN_TYPE, WKB_TRIANGLE_TYPE, WKBMOFFSET, WKBSRIDFLAG, and WKBZOFFSET.

Referenced by lwgeom_from_wkb_state().

Here is the call graph for this function:
Here is the caller graph for this function: