36 const char *version = sfcgal_version();
40 #define MAX_LENGTH_SFCGAL_FULL_VERSION 50
45 #if POSTGIS_SFCGAL_VERSION >= 10400
46 const char *version = sfcgal_full_version();
64 case SFCGAL_TYPE_POINT:
67 case SFCGAL_TYPE_LINESTRING:
70 case SFCGAL_TYPE_POLYGON:
73 case SFCGAL_TYPE_MULTIPOINT:
76 case SFCGAL_TYPE_MULTILINESTRING:
79 case SFCGAL_TYPE_MULTIPOLYGON:
82 case SFCGAL_TYPE_MULTISOLID:
87 case SFCGAL_TYPE_GEOMETRYCOLLECTION:
91 case SFCGAL_TYPE_CIRCULARSTRING:
94 case SFCGAL_TYPE_COMPOUNDCURVE:
97 case SFCGAL_TYPE_CURVEPOLYGON:
100 case SFCGAL_TYPE_MULTICURVE:
103 case SFCGAL_TYPE_MULTISURFACE:
107 case SFCGAL_TYPE_POLYHEDRALSURFACE:
110 case SFCGAL_TYPE_TRIANGULATEDSURFACE:
113 case SFCGAL_TYPE_TRIANGLE:
117 lwerror(
"SFCGAL_type_to_lwgeom_type: Unknown Type");
137 switch (sfcgal_geometry_type_id(geom))
139 case SFCGAL_TYPE_POINT:
142 point.
x = sfcgal_point_x(geom);
143 point.
y = sfcgal_point_y(geom);
145 if (sfcgal_geometry_is_3d(geom))
146 point.
z = sfcgal_point_z(geom);
154 case SFCGAL_TYPE_LINESTRING:
156 npoints = sfcgal_linestring_num_points(geom);
159 for (i = 0; i < npoints; i++)
161 const sfcgal_geometry_t *pt = sfcgal_linestring_point_n(geom, i);
162 point.
x = sfcgal_point_x(pt);
163 point.
y = sfcgal_point_y(pt);
165 if (sfcgal_geometry_is_3d(geom))
166 point.
z = sfcgal_point_z(pt);
175 case SFCGAL_TYPE_TRIANGLE:
179 for (i = 0; i < 4; i++)
181 const sfcgal_geometry_t *pt = sfcgal_triangle_vertex(geom, (i % 3));
182 point.
x = sfcgal_point_x(pt);
183 point.
y = sfcgal_point_y(pt);
185 if (sfcgal_geometry_is_3d(geom))
186 point.
z = sfcgal_point_z(pt);
197 lwerror(
"ptarray_from_SFCGAL: Unknown Type");
209 static sfcgal_geometry_t *
226 return sfcgal_point_create_from_xyz(point.
x, point.
y, point.
z);
228 return sfcgal_point_create_from_xy(point.
x, point.
y);
234 sfcgal_geometry_t *line = sfcgal_linestring_create();
236 for (i = 0; i < pa->
npoints; i++)
241 sfcgal_linestring_add_point(line,
242 sfcgal_point_create_from_xyz(point.
x, point.
y, point.
z));
246 sfcgal_linestring_add_point(line, sfcgal_point_create_from_xy(point.
x, point.
y));
256 sfcgal_geometry_t *triangle = sfcgal_triangle_create();
260 sfcgal_triangle_set_vertex_from_xyz(triangle, 0, point.
x, point.
y, point.
z);
262 sfcgal_triangle_set_vertex_from_xy(triangle, 0, point.
x, point.
y);
266 sfcgal_triangle_set_vertex_from_xyz(triangle, 1, point.
x, point.
y, point.
z);
268 sfcgal_triangle_set_vertex_from_xy(triangle, 1, point.
x, point.
y);
272 sfcgal_triangle_set_vertex_from_xyz(triangle, 2, point.
x, point.
y, point.
z);
274 sfcgal_triangle_set_vertex_from_xy(triangle, 2, point.
x, point.
y);
282 lwerror(
"ptarray_from_SFCGAL: Unknown Type");
295 uint32_t ngeoms, nshells, nsolids;
301 want3d = force3D || sfcgal_geometry_is_3d(geom);
303 switch (sfcgal_geometry_type_id(geom))
305 case SFCGAL_TYPE_POINT:
307 if (sfcgal_geometry_is_empty(geom))
314 case SFCGAL_TYPE_LINESTRING:
316 if (sfcgal_geometry_is_empty(geom))
323 case SFCGAL_TYPE_TRIANGLE:
325 if (sfcgal_geometry_is_empty(geom))
332 case SFCGAL_TYPE_POLYGON:
334 if (sfcgal_geometry_is_empty(geom))
337 uint32_t nrings = sfcgal_polygon_num_interior_rings(geom) + 1;
341 for (i = 1; i < nrings; i++)
347 case SFCGAL_TYPE_MULTIPOINT:
348 case SFCGAL_TYPE_MULTILINESTRING:
349 case SFCGAL_TYPE_MULTIPOLYGON:
350 case SFCGAL_TYPE_MULTISOLID:
351 case SFCGAL_TYPE_GEOMETRYCOLLECTION:
353 ngeoms = sfcgal_geometry_collection_num_geometries(geom);
359 for (i = 0; i < ngeoms; i++)
361 const sfcgal_geometry_t *g = sfcgal_geometry_collection_geometry_n(geom, i);
372 if (ngeoms == nsolids)
376 "SFCGAL2LWGEOM: SOLID in heterogeneous collection will be treated as a POLYHEDRALSURFACETYPE");
382 case SFCGAL_TYPE_CIRCULARSTRING:
383 case SFCGAL_TYPE_COMPOUNDCURVE:
384 case SFCGAL_TYPE_CURVEPOLYGON:
385 case SFCGAL_TYPE_MULTICURVE:
386 case SFCGAL_TYPE_MULTISURFACE:
387 case SFCGAL_TYPE_CURVE:
388 case SFCGAL_TYPE_SURFACE:
393 case SFCGAL_TYPE_POLYHEDRALSURFACE:
395 ngeoms = sfcgal_polyhedral_surface_num_polygons(geom);
401 for (i = 0; i < ngeoms; i++)
403 const sfcgal_geometry_t *g = sfcgal_polyhedral_surface_polygon_n(geom, i);
411 case SFCGAL_TYPE_SOLID:
413 nshells = sfcgal_solid_num_shells(geom);
415 for (ngeoms = 0, i = 0; i < nshells; i++)
416 ngeoms += sfcgal_polyhedral_surface_num_polygons(sfcgal_solid_shell_n(geom, i));
422 for (i = 0, k = 0; i < nshells; i++)
424 const sfcgal_geometry_t *shell = sfcgal_solid_shell_n(geom, i);
425 ngeoms = sfcgal_polyhedral_surface_num_polygons(shell);
427 for (j = 0; j < ngeoms; j++)
429 const sfcgal_geometry_t *g = sfcgal_polyhedral_surface_polygon_n(shell, j);
441 case SFCGAL_TYPE_TRIANGULATEDSURFACE:
443 ngeoms = sfcgal_triangulated_surface_num_triangles(geom);
448 for (i = 0; i < ngeoms; i++)
450 const sfcgal_geometry_t *g = sfcgal_triangulated_surface_triangle_n(geom, i);
458 lwerror(
"SFCGAL2LWGEOM: Unknown Type");
467 sfcgal_geometry_t *ret_geom = NULL;
477 return sfcgal_point_create();
487 return sfcgal_linestring_create();
497 return sfcgal_triangle_create();
505 uint32_t nrings = poly->
nrings - 1;
508 return sfcgal_polygon_create();
511 ret_geom = sfcgal_polygon_create_from_exterior_ring(exterior_ring);
513 for (i = 0; i < nrings; i++)
516 sfcgal_polygon_add_interior_ring(ret_geom, ring);
528 ret_geom = sfcgal_multi_point_create();
530 ret_geom = sfcgal_multi_linestring_create();
532 ret_geom = sfcgal_multi_polygon_create();
534 ret_geom = sfcgal_geometry_collection_create();
537 for (i = 0; i < lwc->
ngeoms; i++)
540 sfcgal_geometry_collection_add_geometry(ret_geom, g);
550 ret_geom = sfcgal_polyhedral_surface_create();
552 for (i = 0; i < lwp->
ngeoms; i++)
555 sfcgal_polyhedral_surface_add_polygon(ret_geom, g);
561 return sfcgal_solid_create_from_exterior_shell(ret_geom);
571 ret_geom = sfcgal_triangulated_surface_create();
573 for (i = 0; i < lwp->
ngeoms; i++)
576 sfcgal_triangulated_surface_add_triangle(ret_geom, g);
596 sfcgal_geometry_t *converted;
604 sfcgal_geometry_delete(converted);
LWPOINT * lwpoint_construct_empty(int32_t srid, char hasz, char hasm)
POINTARRAY * ptarray_construct(char hasz, char hasm, uint32_t npoints)
Construct an empty pointarray, allocating storage and setting the npoints, but not filling in any inf...
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
#define FLAGS_GET_Z(flags)
LWLINE * lwline_construct(int32_t srid, GBOX *bbox, POINTARRAY *points)
LWTRIANGLE * lwtriangle_construct_empty(int32_t srid, char hasz, char hasm)
int getPoint3dz_p(const POINTARRAY *pa, uint32_t n, POINT3DZ *point)
void * lwrealloc(void *mem, size_t size)
LWPOINT * lwpoint_construct(int32_t srid, GBOX *bbox, POINTARRAY *point)
#define POLYHEDRALSURFACETYPE
const char * lwtype_name(uint8_t type)
Return the type name string associated with a type number (e.g.
#define FLAGS_GET_SOLID(flags)
void * lwalloc(size_t size)
LWCOLLECTION * lwcollection_construct(uint8_t type, int32_t srid, GBOX *bbox, uint32_t ngeoms, LWGEOM **geoms)
#define SRID_UNKNOWN
Unknown SRID value.
LWPOLY * lwpoly_construct_empty(int32_t srid, char hasz, char hasm)
LWPOLY * lwpoly_construct(int32_t srid, GBOX *bbox, uint32_t nrings, POINTARRAY **points)
#define FLAGS_SET_SOLID(flags, value)
void ptarray_set_point4d(POINTARRAY *pa, uint32_t n, const POINT4D *p4d)
LWLINE * lwline_construct_empty(int32_t srid, char hasz, char hasm)
LWTRIANGLE * lwtriangle_construct(int32_t srid, GBOX *bbox, POINTARRAY *points)
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
void lwnotice(const char *fmt,...)
Write a notice out to the notice handler.
sfcgal_geometry_t * LWGEOM2SFCGAL(const LWGEOM *geom)
static POINTARRAY * ptarray_from_SFCGAL(const sfcgal_geometry_t *geom, int force3D)
static int SFCGAL_type_to_lwgeom_type(sfcgal_geometry_type_t type)
LWGEOM * lwgeom_sfcgal_noop(const LWGEOM *geom_in)
LWGEOM * SFCGAL2LWGEOM(const sfcgal_geometry_t *geom, int force3D, int32_t srid)
const char * lwgeom_sfcgal_version()
#define MAX_LENGTH_SFCGAL_FULL_VERSION
const char * lwgeom_sfcgal_full_version()
static sfcgal_geometry_t * ptarray_to_SFCGAL(const POINTARRAY *pa, int type)
static int lwgeom_is_empty(const LWGEOM *geom)
Return true or false depending on whether a geometry is an "empty" geometry (no vertices members)