PostGIS  3.0.6dev-r@@SVN_REVISION@@

◆ 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(), 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 lwgeom_sfcgal_noop(), POSTGIS2SFCGALGeometry(), and POSTGIS2SFCGALPreparedGeometry().

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