PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ LWGEOM2SFCGAL()

sfcgal_geometry_t* LWGEOM2SFCGAL ( const LWGEOM geom)

Definition at line 466 of file lwgeom_sfcgal.c.

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