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();
50 "SFCGAL=\"%s\" CGAL=\"Unknown\" Boost=\"Unknown\"",
66 case SFCGAL_TYPE_POINT:
69 case SFCGAL_TYPE_LINESTRING:
72 case SFCGAL_TYPE_POLYGON:
75 case SFCGAL_TYPE_MULTIPOINT:
78 case SFCGAL_TYPE_MULTILINESTRING:
81 case SFCGAL_TYPE_MULTIPOLYGON:
84 case SFCGAL_TYPE_MULTISOLID:
89 case SFCGAL_TYPE_GEOMETRYCOLLECTION:
93 case SFCGAL_TYPE_CIRCULARSTRING:
96 case SFCGAL_TYPE_COMPOUNDCURVE:
99 case SFCGAL_TYPE_CURVEPOLYGON:
102 case SFCGAL_TYPE_MULTICURVE:
105 case SFCGAL_TYPE_MULTISURFACE:
109 case SFCGAL_TYPE_POLYHEDRALSURFACE:
112 case SFCGAL_TYPE_TRIANGULATEDSURFACE:
115 case SFCGAL_TYPE_TRIANGLE:
119 lwerror(
"SFCGAL_type_to_lwgeom_type: Unknown Type");
139 switch (sfcgal_geometry_type_id(geom))
141 case SFCGAL_TYPE_POINT:
144 point.
x = sfcgal_point_x(geom);
145 point.
y = sfcgal_point_y(geom);
147 if (sfcgal_geometry_is_3d(geom))
148 point.
z = sfcgal_point_z(geom);
156 case SFCGAL_TYPE_LINESTRING:
158 npoints = sfcgal_linestring_num_points(geom);
161 for (i = 0; i < npoints; i++)
163 const sfcgal_geometry_t *pt = sfcgal_linestring_point_n(geom, i);
164 point.
x = sfcgal_point_x(pt);
165 point.
y = sfcgal_point_y(pt);
167 if (sfcgal_geometry_is_3d(geom))
168 point.
z = sfcgal_point_z(pt);
177 case SFCGAL_TYPE_TRIANGLE:
181 for (i = 0; i < 4; i++)
183 const sfcgal_geometry_t *pt = sfcgal_triangle_vertex(geom, (i % 3));
184 point.
x = sfcgal_point_x(pt);
185 point.
y = sfcgal_point_y(pt);
187 if (sfcgal_geometry_is_3d(geom))
188 point.
z = sfcgal_point_z(pt);
199 lwerror(
"ptarray_from_SFCGAL: Unknown Type");
211 static sfcgal_geometry_t *
228 return sfcgal_point_create_from_xyz(point.
x, point.
y, point.
z);
230 return sfcgal_point_create_from_xy(point.
x, point.
y);
236 sfcgal_geometry_t *line = sfcgal_linestring_create();
238 for (i = 0; i < pa->
npoints; i++)
243 sfcgal_linestring_add_point(line,
244 sfcgal_point_create_from_xyz(point.
x, point.
y, point.
z));
248 sfcgal_linestring_add_point(line, sfcgal_point_create_from_xy(point.
x, point.
y));
258 sfcgal_geometry_t *triangle = sfcgal_triangle_create();
262 sfcgal_triangle_set_vertex_from_xyz(triangle, 0, point.
x, point.
y, point.
z);
264 sfcgal_triangle_set_vertex_from_xy(triangle, 0, point.
x, point.
y);
268 sfcgal_triangle_set_vertex_from_xyz(triangle, 1, point.
x, point.
y, point.
z);
270 sfcgal_triangle_set_vertex_from_xy(triangle, 1, point.
x, point.
y);
274 sfcgal_triangle_set_vertex_from_xyz(triangle, 2, point.
x, point.
y, point.
z);
276 sfcgal_triangle_set_vertex_from_xy(triangle, 2, point.
x, point.
y);
284 lwerror(
"ptarray_from_SFCGAL: Unknown Type");
297 uint32_t ngeoms, nshells, nsolids;
303 want3d = force3D || sfcgal_geometry_is_3d(geom);
305 switch (sfcgal_geometry_type_id(geom))
307 case SFCGAL_TYPE_POINT:
309 if (sfcgal_geometry_is_empty(geom))
316 case SFCGAL_TYPE_LINESTRING:
318 if (sfcgal_geometry_is_empty(geom))
325 case SFCGAL_TYPE_TRIANGLE:
327 if (sfcgal_geometry_is_empty(geom))
334 case SFCGAL_TYPE_POLYGON:
336 if (sfcgal_geometry_is_empty(geom))
339 uint32_t nrings = sfcgal_polygon_num_interior_rings(geom) + 1;
343 for (i = 1; i < nrings; i++)
349 case SFCGAL_TYPE_MULTIPOINT:
350 case SFCGAL_TYPE_MULTILINESTRING:
351 case SFCGAL_TYPE_MULTIPOLYGON:
352 case SFCGAL_TYPE_MULTISOLID:
353 case SFCGAL_TYPE_GEOMETRYCOLLECTION:
355 ngeoms = sfcgal_geometry_collection_num_geometries(geom);
361 for (i = 0; i < ngeoms; i++)
363 const sfcgal_geometry_t *g = sfcgal_geometry_collection_geometry_n(geom, i);
374 if (ngeoms == nsolids)
378 "SFCGAL2LWGEOM: SOLID in heterogeneous collection will be treated as a POLYHEDRALSURFACETYPE");
384 case SFCGAL_TYPE_CIRCULARSTRING:
385 case SFCGAL_TYPE_COMPOUNDCURVE:
386 case SFCGAL_TYPE_CURVEPOLYGON:
387 case SFCGAL_TYPE_MULTICURVE:
388 case SFCGAL_TYPE_MULTISURFACE:
389 case SFCGAL_TYPE_CURVE:
390 case SFCGAL_TYPE_SURFACE:
395 case SFCGAL_TYPE_POLYHEDRALSURFACE:
397 ngeoms = sfcgal_polyhedral_surface_num_polygons(geom);
403 for (i = 0; i < ngeoms; i++)
405 const sfcgal_geometry_t *g = sfcgal_polyhedral_surface_polygon_n(geom, i);
413 case SFCGAL_TYPE_SOLID:
415 nshells = sfcgal_solid_num_shells(geom);
417 for (ngeoms = 0, i = 0; i < nshells; i++)
418 ngeoms += sfcgal_polyhedral_surface_num_polygons(sfcgal_solid_shell_n(geom, i));
424 for (i = 0, k = 0; i < nshells; i++)
426 const sfcgal_geometry_t *shell = sfcgal_solid_shell_n(geom, i);
427 ngeoms = sfcgal_polyhedral_surface_num_polygons(shell);
429 for (j = 0; j < ngeoms; j++)
431 const sfcgal_geometry_t *g = sfcgal_polyhedral_surface_polygon_n(shell, j);
443 case SFCGAL_TYPE_TRIANGULATEDSURFACE:
445 ngeoms = sfcgal_triangulated_surface_num_triangles(geom);
450 for (i = 0; i < ngeoms; i++)
452 const sfcgal_geometry_t *g = sfcgal_triangulated_surface_triangle_n(geom, i);
460 lwerror(
"SFCGAL2LWGEOM: Unknown Type");
469 sfcgal_geometry_t *ret_geom = NULL;
479 return sfcgal_point_create();
489 return sfcgal_linestring_create();
499 return sfcgal_triangle_create();
507 uint32_t nrings = poly->
nrings - 1;
510 return sfcgal_polygon_create();
513 ret_geom = sfcgal_polygon_create_from_exterior_ring(exterior_ring);
515 for (i = 0; i < nrings; i++)
518 sfcgal_polygon_add_interior_ring(ret_geom, ring);
530 ret_geom = sfcgal_multi_point_create();
532 ret_geom = sfcgal_multi_linestring_create();
534 ret_geom = sfcgal_multi_polygon_create();
536 ret_geom = sfcgal_geometry_collection_create();
539 for (i = 0; i < lwc->
ngeoms; i++)
542 sfcgal_geometry_collection_add_geometry(ret_geom, g);
552 ret_geom = sfcgal_polyhedral_surface_create();
554 for (i = 0; i < lwp->
ngeoms; i++)
557 sfcgal_polyhedral_surface_add_polygon(ret_geom, g);
563 return sfcgal_solid_create_from_exterior_shell(ret_geom);
573 ret_geom = sfcgal_triangulated_surface_create();
575 for (i = 0; i < lwp->
ngeoms; i++)
578 sfcgal_triangulated_surface_add_triangle(ret_geom, g);
598 sfcgal_geometry_t *converted;
606 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)