PostGIS  3.3.9dev-r@@SVN_REVISION@@

◆ LWGEOM2SFCGAL()

sfcgal_geometry_t* LWGEOM2SFCGAL ( const LWGEOM geom)

Definition at line 464 of file lwgeom_sfcgal.c.

465 {
466  uint32_t i;
467  sfcgal_geometry_t *ret_geom = NULL;
468 
469  assert(geom);
470 
471  switch (geom->type)
472  {
473  case POINTTYPE:
474  {
475  const LWPOINT *lwp = (const LWPOINT *)geom;
476  if (lwgeom_is_empty(geom))
477  return sfcgal_point_create();
478 
479  return ptarray_to_SFCGAL(lwp->point, POINTTYPE);
480  }
481  break;
482 
483  case LINETYPE:
484  {
485  const LWLINE *line = (const LWLINE *)geom;
486  if (lwgeom_is_empty(geom))
487  return sfcgal_linestring_create();
488 
489  return ptarray_to_SFCGAL(line->points, LINETYPE);
490  }
491  break;
492 
493  case TRIANGLETYPE:
494  {
495  const LWTRIANGLE *triangle = (const LWTRIANGLE *)geom;
496  if (lwgeom_is_empty(geom))
497  return sfcgal_triangle_create();
498  return ptarray_to_SFCGAL(triangle->points, TRIANGLETYPE);
499  }
500  break;
501 
502  case POLYGONTYPE:
503  {
504  const LWPOLY *poly = (const LWPOLY *)geom;
505  uint32_t nrings = poly->nrings - 1;
506 
507  if (lwgeom_is_empty(geom))
508  return sfcgal_polygon_create();
509 
510  sfcgal_geometry_t *exterior_ring = ptarray_to_SFCGAL(poly->rings[0], LINETYPE);
511  ret_geom = sfcgal_polygon_create_from_exterior_ring(exterior_ring);
512 
513  for (i = 0; i < nrings; i++)
514  {
515  sfcgal_geometry_t *ring = ptarray_to_SFCGAL(poly->rings[i + 1], LINETYPE);
516  sfcgal_polygon_add_interior_ring(ret_geom, ring);
517  }
518  return ret_geom;
519  }
520  break;
521 
522  case MULTIPOINTTYPE:
523  case MULTILINETYPE:
524  case MULTIPOLYGONTYPE:
525  case COLLECTIONTYPE:
526  {
527  if (geom->type == MULTIPOINTTYPE)
528  ret_geom = sfcgal_multi_point_create();
529  else if (geom->type == MULTILINETYPE)
530  ret_geom = sfcgal_multi_linestring_create();
531  else if (geom->type == MULTIPOLYGONTYPE)
532  ret_geom = sfcgal_multi_polygon_create();
533  else
534  ret_geom = sfcgal_geometry_collection_create();
535 
536  const LWCOLLECTION *lwc = (const LWCOLLECTION *)geom;
537  for (i = 0; i < lwc->ngeoms; i++)
538  {
539  sfcgal_geometry_t *g = LWGEOM2SFCGAL(lwc->geoms[i]);
540  sfcgal_geometry_collection_add_geometry(ret_geom, g);
541  }
542 
543  return ret_geom;
544  }
545  break;
546 
548  {
549  const LWPSURFACE *lwp = (const LWPSURFACE *)geom;
550  ret_geom = sfcgal_polyhedral_surface_create();
551 
552  for (i = 0; i < lwp->ngeoms; i++)
553  {
554  sfcgal_geometry_t *g = LWGEOM2SFCGAL((const LWGEOM *)lwp->geoms[i]);
555  sfcgal_polyhedral_surface_add_polygon(ret_geom, g);
556  }
557  /* We treat polyhedral surface as the only exterior shell,
558  since we can't distinguish exterior from interior shells ... */
559  if (FLAGS_GET_SOLID(lwp->flags))
560  {
561  return sfcgal_solid_create_from_exterior_shell(ret_geom);
562  }
563 
564  return ret_geom;
565  }
566  break;
567 
568  case TINTYPE:
569  {
570  const LWTIN *lwp = (const LWTIN *)geom;
571  ret_geom = sfcgal_triangulated_surface_create();
572 
573  for (i = 0; i < lwp->ngeoms; i++)
574  {
575  sfcgal_geometry_t *g = LWGEOM2SFCGAL((const LWGEOM *)lwp->geoms[i]);
576  sfcgal_triangulated_surface_add_triangle(ret_geom, g);
577  }
578 
579  return ret_geom;
580  }
581  break;
582 
583  default:
584  lwerror("LWGEOM2SFCGAL: Unsupported geometry type %s !", lwtype_name(geom->type));
585  return NULL;
586  }
587 }
#define COLLECTIONTYPE
Definition: liblwgeom.h:123
#define MULTILINETYPE
Definition: liblwgeom.h:121
#define LINETYPE
Definition: liblwgeom.h:118
#define MULTIPOINTTYPE
Definition: liblwgeom.h:120
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
Definition: liblwgeom.h:117
#define TINTYPE
Definition: liblwgeom.h:131
#define MULTIPOLYGONTYPE
Definition: liblwgeom.h:122
#define POLYGONTYPE
Definition: liblwgeom.h:119
#define POLYHEDRALSURFACETYPE
Definition: liblwgeom.h:129
const char * lwtype_name(uint8_t type)
Return the type name string associated with a type number (e.g.
Definition: lwutil.c:216
#define FLAGS_GET_SOLID(flags)
Definition: liblwgeom.h:185
#define TRIANGLETYPE
Definition: liblwgeom.h:130
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:190
sfcgal_geometry_t * LWGEOM2SFCGAL(const LWGEOM *geom)
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)
Definition: lwinline.h:203
uint32_t ngeoms
Definition: liblwgeom.h:595
LWGEOM ** geoms
Definition: liblwgeom.h:590
uint8_t type
Definition: liblwgeom.h:477
POINTARRAY * points
Definition: liblwgeom.h:498
POINTARRAY * point
Definition: liblwgeom.h:486
POINTARRAY ** rings
Definition: liblwgeom.h:534
uint32_t nrings
Definition: liblwgeom.h:539
lwflags_t flags
Definition: liblwgeom.h:662
LWPOLY ** geoms
Definition: liblwgeom.h:660
uint32_t ngeoms
Definition: liblwgeom.h:665
uint32_t ngeoms
Definition: liblwgeom.h:679
LWTRIANGLE ** geoms
Definition: liblwgeom.h:674
POINTARRAY * points
Definition: liblwgeom.h:510

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

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