167{
168 int type = GEOSGeomTypeId(geom);
169 int SRID = GEOSGetSRID(geom);
170
171
173
174 if (want3d && !GEOSHasZ(geom))
175 {
176 LWDEBUG(3,
"Geometry has no Z, won't provide one");
177 want3d = 0;
178 }
179
180 switch (type)
181 {
182 const GEOSCoordSequence* cs;
184 const GEOSGeometry* g;
186 uint32_t i, ngeoms;
187
188 case GEOS_POINT:
189 LWDEBUG(4,
"lwgeom_from_geometry: it's a Point");
190 cs = GEOSGeom_getCoordSeq(geom);
194
195 case GEOS_LINESTRING:
196 case GEOS_LINEARRING:
197 LWDEBUG(4,
"lwgeom_from_geometry: it's a LineString or LinearRing");
199
200 cs = GEOSGeom_getCoordSeq(geom);
203
204 case GEOS_POLYGON:
205 LWDEBUG(4,
"lwgeom_from_geometry: it's a Polygon");
207 ngeoms = GEOSGetNumInteriorRings(geom);
209 g = GEOSGetExteriorRing(geom);
210 cs = GEOSGeom_getCoordSeq(g);
212 for (i = 0; i < ngeoms; i++)
213 {
214 g = GEOSGetInteriorRingN(geom, i);
215 cs = GEOSGeom_getCoordSeq(g);
217 }
219
220 case GEOS_MULTIPOINT:
221 case GEOS_MULTILINESTRING:
222 case GEOS_MULTIPOLYGON:
223 case GEOS_GEOMETRYCOLLECTION:
224 LWDEBUG(4,
"lwgeom_from_geometry: it's a Collection or Multi");
225
226 ngeoms = GEOSGetNumGeometries(geom);
227 geoms = NULL;
228 if (ngeoms)
229 {
231 for (i = 0; i < ngeoms; i++)
232 {
233 g = GEOSGetGeometryN(geom, i);
235 }
236 }
238
239 default:
240 lwerror(
"GEOS2LWGEOM: unknown geometry type: %d", type);
241 return NULL;
242 }
243}
POINTARRAY * ptarray_from_GEOSCoordSeq(const GEOSCoordSequence *cs, uint8_t want3d)
LWGEOM * GEOS2LWGEOM(const GEOSGeometry *geom, uint8_t want3d)
LWCOLLECTION * lwcollection_construct(uint8_t type, int32_t srid, GBOX *bbox, uint32_t ngeoms, LWGEOM **geoms)
LWPOINT * lwpoint_construct(int32_t srid, GBOX *bbox, POINTARRAY *point)
void * lwalloc(size_t size)
LWLINE * lwline_construct(int32_t srid, GBOX *bbox, POINTARRAY *points)
LWPOINT * lwpoint_construct_empty(int32_t srid, char hasz, char hasm)
LWPOLY * lwpoly_construct(int32_t srid, GBOX *bbox, uint32_t nrings, POINTARRAY **points)
LWPOLY * lwpoly_construct_empty(int32_t srid, char hasz, char hasm)
#define SRID_UNKNOWN
Unknown SRID value.
LWLINE * lwline_construct_empty(int32_t srid, char hasz, char hasm)
#define LWDEBUG(level, msg)
void lwerror(const char *fmt,...)
Write a notice out to the error handler.