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

◆ LWGEOM2SFCGAL()

sfcgal_geometry_t * LWGEOM2SFCGAL ( const LWGEOM geom)

Definition at line 449 of file liblwgeom/lwgeom_sfcgal.c.

450{
451 uint32_t i;
452 sfcgal_geometry_t *ret_geom = NULL;
453
454 assert(geom);
455
456 switch (geom->type)
457 {
458 case POINTTYPE:
459 {
460 const LWPOINT *lwp = (const LWPOINT *)geom;
461 if (lwgeom_is_empty(geom))
462 return sfcgal_point_create();
463
464 return ptarray_to_SFCGAL(lwp->point, POINTTYPE);
465 }
466 break;
467
468 case LINETYPE:
469 {
470 const LWLINE *line = (const LWLINE *)geom;
471 if (lwgeom_is_empty(geom))
472 return sfcgal_linestring_create();
473
474 return ptarray_to_SFCGAL(line->points, LINETYPE);
475 }
476 break;
477
478 case TRIANGLETYPE:
479 {
480 const LWTRIANGLE *triangle = (const LWTRIANGLE *)geom;
481 if (lwgeom_is_empty(geom))
482 return sfcgal_triangle_create();
483 return ptarray_to_SFCGAL(triangle->points, TRIANGLETYPE);
484 }
485 break;
486
487 case POLYGONTYPE:
488 {
489 const LWPOLY *poly = (const LWPOLY *)geom;
490 uint32_t nrings = poly->nrings - 1;
491
492 if (lwgeom_is_empty(geom))
493 return sfcgal_polygon_create();
494
495 sfcgal_geometry_t *exterior_ring = ptarray_to_SFCGAL(poly->rings[0], LINETYPE);
496 ret_geom = sfcgal_polygon_create_from_exterior_ring(exterior_ring);
497
498 for (i = 0; i < nrings; i++)
499 {
500 sfcgal_geometry_t *ring = ptarray_to_SFCGAL(poly->rings[i + 1], LINETYPE);
501 sfcgal_polygon_add_interior_ring(ret_geom, ring);
502 }
503 return ret_geom;
504 }
505 break;
506
507 case MULTIPOINTTYPE:
508 case MULTILINETYPE:
509 case MULTIPOLYGONTYPE:
510 case COLLECTIONTYPE:
511 {
512 if (geom->type == MULTIPOINTTYPE)
513 ret_geom = sfcgal_multi_point_create();
514 else if (geom->type == MULTILINETYPE)
515 ret_geom = sfcgal_multi_linestring_create();
516 else if (geom->type == MULTIPOLYGONTYPE)
517 ret_geom = sfcgal_multi_polygon_create();
518 else
519 ret_geom = sfcgal_geometry_collection_create();
520
521 const LWCOLLECTION *lwc = (const LWCOLLECTION *)geom;
522 for (i = 0; i < lwc->ngeoms; i++)
523 {
524 sfcgal_geometry_t *g = LWGEOM2SFCGAL(lwc->geoms[i]);
525 sfcgal_geometry_collection_add_geometry(ret_geom, g);
526 }
527
528 return ret_geom;
529 }
530 break;
531
533 {
534 const LWPSURFACE *lwp = (const LWPSURFACE *)geom;
535 ret_geom = sfcgal_polyhedral_surface_create();
536
537 for (i = 0; i < lwp->ngeoms; i++)
538 {
539 sfcgal_geometry_t *g = LWGEOM2SFCGAL((const LWGEOM *)lwp->geoms[i]);
540 sfcgal_polyhedral_surface_add_polygon(ret_geom, g);
541 }
542 /* We treat polyhedral surface as the only exterior shell,
543 since we can't distinguish exterior from interior shells ... */
544 if (FLAGS_GET_SOLID(lwp->flags))
545 {
546 return sfcgal_solid_create_from_exterior_shell(ret_geom);
547 }
548
549 return ret_geom;
550 }
551 break;
552
553 case TINTYPE:
554 {
555 const LWTIN *lwp = (const LWTIN *)geom;
556 ret_geom = sfcgal_triangulated_surface_create();
557
558 for (i = 0; i < lwp->ngeoms; i++)
559 {
560 sfcgal_geometry_t *g = LWGEOM2SFCGAL((const LWGEOM *)lwp->geoms[i]);
561 sfcgal_triangulated_surface_add_triangle(ret_geom, g);
562 }
563
564 return ret_geom;
565 }
566 break;
567
568 default:
569 lwerror("LWGEOM2SFCGAL: Unknown geometry type !");
570 return NULL;
571 }
572}
sfcgal_geometry_t * LWGEOM2SFCGAL(const LWGEOM *geom)
static sfcgal_geometry_t * ptarray_to_SFCGAL(const POINTARRAY *pa, int type)
#define COLLECTIONTYPE
Definition liblwgeom.h:122
#define MULTILINETYPE
Definition liblwgeom.h:120
#define LINETYPE
Definition liblwgeom.h:117
#define MULTIPOINTTYPE
Definition liblwgeom.h:119
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
Definition liblwgeom.h:116
#define TINTYPE
Definition liblwgeom.h:130
#define MULTIPOLYGONTYPE
Definition liblwgeom.h:121
#define POLYGONTYPE
Definition liblwgeom.h:118
#define POLYHEDRALSURFACETYPE
Definition liblwgeom.h:128
#define FLAGS_GET_SOLID(flags)
Definition liblwgeom.h:184
#define TRIANGLETYPE
Definition liblwgeom.h:129
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition lwutil.c:190
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:193
uint32_t ngeoms
Definition liblwgeom.h:566
LWGEOM ** geoms
Definition liblwgeom.h:561
uint8_t type
Definition liblwgeom.h:448
POINTARRAY * points
Definition liblwgeom.h:469
POINTARRAY * point
Definition liblwgeom.h:457
POINTARRAY ** rings
Definition liblwgeom.h:505
uint32_t nrings
Definition liblwgeom.h:510
lwflags_t flags
Definition liblwgeom.h:633
LWPOLY ** geoms
Definition liblwgeom.h:631
uint32_t ngeoms
Definition liblwgeom.h:636
uint32_t ngeoms
Definition liblwgeom.h:650
LWTRIANGLE ** geoms
Definition liblwgeom.h:645
POINTARRAY * points
Definition liblwgeom.h:481

References COLLECTIONTYPE, LWPSURFACE::flags, FLAGS_GET_SOLID, LWCOLLECTION::geoms, LWPSURFACE::geoms, LWTIN::geoms, LINETYPE, lwerror(), LWGEOM2SFCGAL(), lwgeom_is_empty(), 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(), lwgeom_sfcgal_noop(), POSTGIS2SFCGALGeometry(), and POSTGIS2SFCGALPreparedGeometry().

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