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

◆ LWGEOM2SFCGAL()

sfcgal_geometry_t * LWGEOM2SFCGAL ( const LWGEOM geom)

Definition at line 486 of file lwgeom_sfcgal.c.

487{
488 uint32_t i;
489 sfcgal_geometry_t *ret_geom = NULL;
490
491 assert(geom);
492
493 switch (geom->type)
494 {
495 case POINTTYPE: {
496 const LWPOINT *lwp = (const LWPOINT *)geom;
497 if (lwgeom_is_empty(geom))
498 return sfcgal_point_create();
499
500 return ptarray_to_SFCGAL(lwp->point, POINTTYPE);
501 }
502 break;
503
504 case LINETYPE: {
505 const LWLINE *line = (const LWLINE *)geom;
506 if (lwgeom_is_empty(geom))
507 return sfcgal_linestring_create();
508
509 return ptarray_to_SFCGAL(line->points, LINETYPE);
510 }
511 break;
512
513 case TRIANGLETYPE: {
514 const LWTRIANGLE *triangle = (const LWTRIANGLE *)geom;
515 if (lwgeom_is_empty(geom))
516 return sfcgal_triangle_create();
517 return ptarray_to_SFCGAL(triangle->points, TRIANGLETYPE);
518 }
519 break;
520
521 case POLYGONTYPE: {
522 const LWPOLY *poly = (const LWPOLY *)geom;
523 uint32_t nrings = poly->nrings - 1;
524
525 if (lwgeom_is_empty(geom))
526 return sfcgal_polygon_create();
527
528 sfcgal_geometry_t *exterior_ring = ptarray_to_SFCGAL(poly->rings[0], LINETYPE);
529 ret_geom = sfcgal_polygon_create_from_exterior_ring(exterior_ring);
530
531 for (i = 0; i < nrings; i++)
532 {
533 sfcgal_geometry_t *ring = ptarray_to_SFCGAL(poly->rings[i + 1], LINETYPE);
534 sfcgal_polygon_add_interior_ring(ret_geom, ring);
535 }
536 return ret_geom;
537 }
538 break;
539
540 case MULTIPOINTTYPE:
541 case MULTILINETYPE:
542 case MULTIPOLYGONTYPE:
543 case COLLECTIONTYPE: {
544 if (geom->type == MULTIPOINTTYPE)
545 ret_geom = sfcgal_multi_point_create();
546 else if (geom->type == MULTILINETYPE)
547 ret_geom = sfcgal_multi_linestring_create();
548 else if (geom->type == MULTIPOLYGONTYPE)
549 ret_geom = sfcgal_multi_polygon_create();
550 else
551 ret_geom = sfcgal_geometry_collection_create();
552
553 const LWCOLLECTION *lwc = (const LWCOLLECTION *)geom;
554 for (i = 0; i < lwc->ngeoms; i++)
555 {
556 sfcgal_geometry_t *g = LWGEOM2SFCGAL(lwc->geoms[i]);
557 sfcgal_geometry_collection_add_geometry(ret_geom, g);
558 }
559
560 return ret_geom;
561 }
562 break;
563
565 const LWPSURFACE *lwp = (const LWPSURFACE *)geom;
566 ret_geom = sfcgal_polyhedral_surface_create();
567
568 for (i = 0; i < lwp->ngeoms; i++)
569 {
570 sfcgal_geometry_t *g = LWGEOM2SFCGAL((const LWGEOM *)lwp->geoms[i]);
571 sfcgal_polyhedral_surface_add_polygon(ret_geom, g);
572 }
573 /* We treat polyhedral surface as the only exterior shell,
574 since we can't distinguish exterior from interior shells ... */
575 if (FLAGS_GET_SOLID(lwp->flags))
576 {
577 return sfcgal_solid_create_from_exterior_shell(ret_geom);
578 }
579
580 return ret_geom;
581 }
582 break;
583
584 case TINTYPE: {
585 const LWTIN *lwp = (const LWTIN *)geom;
586 ret_geom = sfcgal_triangulated_surface_create();
587
588 for (i = 0; i < lwp->ngeoms; i++)
589 {
590 sfcgal_geometry_t *g = LWGEOM2SFCGAL((const LWGEOM *)lwp->geoms[i]);
591 sfcgal_triangulated_surface_add_triangle(ret_geom, g);
592 }
593
594 return ret_geom;
595 }
596 break;
597
598 default:
599 lwerror("LWGEOM2SFCGAL: Unsupported geometry type %s !", lwtype_name(geom->type));
600 return NULL;
601 }
602}
const char * lwtype_name(uint8_t type)
Return the type name string associated with a type number (e.g.
Definition lwutil.c:216
#define COLLECTIONTYPE
Definition liblwgeom.h:108
#define MULTILINETYPE
Definition liblwgeom.h:106
#define LINETYPE
Definition liblwgeom.h:103
#define MULTIPOINTTYPE
Definition liblwgeom.h:105
#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 FLAGS_GET_SOLID(flags)
Definition liblwgeom.h:170
#define TRIANGLETYPE
Definition liblwgeom.h:115
void void lwerror(const char *fmt,...) __attribute__((format(printf
Write a notice out to the error handler.
sfcgal_geometry_t * LWGEOM2SFCGAL(const LWGEOM *geom)
static sfcgal_geometry_t * ptarray_to_SFCGAL(const POINTARRAY *pa, int type)
Convert a PostGIS pointarray to SFCGAL structure.
static int lwgeom_is_empty(const LWGEOM *geom)
Return true or false depending on whether a geometry is an "empty" geometry (no vertices members)
Definition lwinline.h:199
uint32_t ngeoms
Definition liblwgeom.h:580
LWGEOM ** geoms
Definition liblwgeom.h:575
uint8_t type
Definition liblwgeom.h:462
POINTARRAY * points
Definition liblwgeom.h:483
POINTARRAY * point
Definition liblwgeom.h:471
POINTARRAY ** rings
Definition liblwgeom.h:519
uint32_t nrings
Definition liblwgeom.h:524
lwflags_t flags
Definition liblwgeom.h:647
LWPOLY ** geoms
Definition liblwgeom.h:645
uint32_t ngeoms
Definition liblwgeom.h:650
uint32_t ngeoms
Definition liblwgeom.h:664
LWTRIANGLE ** geoms
Definition liblwgeom.h:659
POINTARRAY * points
Definition liblwgeom.h:495

References COLLECTIONTYPE, LWPSURFACE::flags, FLAGS_GET_SOLID, LWCOLLECTION::geoms, LWPSURFACE::geoms, LWTIN::geoms, LINETYPE, lwerror(), LWGEOM2SFCGAL(), lwgeom_is_empty(), lwtype_name(), MULTILINETYPE, MULTIPOINTTYPE, MULTIPOLYGONTYPE, LWCOLLECTION::ngeoms, LWPSURFACE::ngeoms, LWTIN::ngeoms, LWPOLY::nrings, LWPOINT::point, LWLINE::points, LWTRIANGLE::points, POINTTYPE, POLYGONTYPE, POLYHEDRALSURFACETYPE, ptarray_to_SFCGAL(), LWPOLY::rings, TINTYPE, TRIANGLETYPE, and LWGEOM::type.

Referenced by LWGEOM2SFCGAL(), and lwgeom_sfcgal_noop().

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