PostGIS  3.3.9dev-r@@SVN_REVISION@@

◆ lwt_GetFaceGeometry()

LWGEOM* lwt_GetFaceGeometry ( LWT_TOPOLOGY topo,
LWT_ELEMID  face 
)

Return the geometry of a face.

For ST_GetFaceGeometry

Parameters
topothe topology to operate on
faceidentifier of the face
Returns
a polygon geometry representing the face, ownership to caller, to be released with lwgeom_release, or NULL on error (liblwgeom error handler will be invoked with error message)

Definition at line 2847 of file lwgeom_topo.c.

2848 {
2849  uint64_t numfaceedges;
2850  LWT_ISO_EDGE *edges;
2851  LWT_ISO_FACE *face;
2852  LWPOLY *out;
2853  LWGEOM *outg;
2854  uint64_t i, edgeid;
2855  int fields;
2856 
2857  if (faceid == 0)
2858  {
2859  lwerror("SQL/MM Spatial exception - universal face has no geometry");
2860  return NULL;
2861  }
2862 
2863  /* Construct the face geometry */
2864  numfaceedges = 1;
2865  fields = LWT_COL_EDGE_GEOM |
2869  ;
2870  edges = lwt_be_getEdgeByFace( topo, &faceid, &numfaceedges, fields, NULL );
2871  if (numfaceedges == UINT64_MAX)
2872  {
2873  lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
2874  return NULL;
2875  }
2876  LWDEBUGF(1, "lwt_GetFaceGeometry: lwt_be_getEdgeByFace returned %d edges", numfaceedges);
2877 
2878  if ( numfaceedges == 0 )
2879  {
2880  i = 1;
2881  face = lwt_be_getFaceById(topo, &faceid, &i, LWT_COL_FACE_FACE_ID);
2882  if (i == UINT64_MAX)
2883  {
2884  lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
2885  return NULL;
2886  }
2887  if ( i == 0 ) {
2888  lwerror("SQL/MM Spatial exception - non-existent face.");
2889  return NULL;
2890  }
2891  lwfree( face );
2892  if ( i > 1 ) {
2893  lwerror("Corrupted topology: multiple face records have face_id=%"
2894  LWTFMT_ELEMID, faceid);
2895  return NULL;
2896  }
2897  /* Face has no boundary edges, we'll return EMPTY, see
2898  * https://trac.osgeo.org/postgis/ticket/3221 */
2899  lwnotice("Corrupted topology: face %"
2900  LWTFMT_ELEMID " has no associated edges.", faceid);
2901  out = lwpoly_construct_empty(topo->srid, topo->hasZ, 0);
2902  return lwpoly_as_lwgeom(out);
2903  }
2904  edgeid = edges[0].edge_id;
2905 
2906  outg = _lwt_FaceByEdges( topo, edges, numfaceedges );
2907  _lwt_release_edges(edges, numfaceedges);
2908 
2909  if ( ! outg )
2910  {
2911  /* Face did have edges but no polygon could be constructed
2912  * with that material, sounds like a corrupted topology..
2913  *
2914  * We'll return EMPTY, see
2915  * https://trac.osgeo.org/postgis/ticket/3221 */
2916  lwnotice("Corrupted topology: face %"
2917  LWTFMT_ELEMID " could not be constructed only from edges "
2918  "knowing about it (like edge %" LWTFMT_ELEMID ").",
2919  faceid, edgeid);
2920  out = lwpoly_construct_empty(topo->srid, topo->hasZ, 0);
2921  return lwpoly_as_lwgeom(out);
2922  }
2923 
2924  return outg;
2925 }
LWGEOM * lwpoly_as_lwgeom(const LWPOLY *obj)
Definition: lwgeom.c:329
void lwfree(void *mem)
Definition: lwutil.c:242
LWPOLY * lwpoly_construct_empty(int32_t srid, char hasz, char hasm)
Definition: lwpoly.c:161
#define LWT_COL_EDGE_FACE_RIGHT
#define LWT_COL_FACE_FACE_ID
Face fields.
#define LWT_COL_EDGE_FACE_LEFT
#define LWT_COL_EDGE_EDGE_ID
Edge fields.
#define LWT_COL_EDGE_GEOM
#define LWDEBUGF(level, msg,...)
Definition: lwgeom_log.h:88
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:190
void lwnotice(const char *fmt,...)
Write a notice out to the notice handler.
Definition: lwutil.c:177
const char * lwt_be_lastErrorMessage(const LWT_BE_IFACE *be)
Definition: lwgeom_topo.c:119
static LWT_ISO_EDGE * lwt_be_getEdgeByFace(LWT_TOPOLOGY *topo, const LWT_ELEMID *ids, uint64_t *numelems, int fields, const GBOX *box)
Definition: lwgeom_topo.c:238
static LWGEOM * _lwt_FaceByEdges(LWT_TOPOLOGY *topo, LWT_ISO_EDGE *edges, int numfaceedges)
Definition: lwgeom_topo.c:2800
static LWT_ISO_FACE * lwt_be_getFaceById(LWT_TOPOLOGY *topo, const LWT_ELEMID *ids, uint64_t *numelems, int fields)
Definition: lwgeom_topo.c:226
#define LWTFMT_ELEMID
Definition: lwgeom_topo.c:43
static void _lwt_release_edges(LWT_ISO_EDGE *edges, int num_edges)
Definition: lwgeom_topo.c:465
LWT_ELEMID edge_id
const LWT_BE_IFACE * be_iface

References _lwt_FaceByEdges(), _lwt_release_edges(), LWT_TOPOLOGY_T::be_iface, LWT_ISO_EDGE::edge_id, LWT_TOPOLOGY_T::hasZ, LWDEBUGF, lwerror(), lwfree(), lwnotice(), lwpoly_as_lwgeom(), lwpoly_construct_empty(), lwt_be_getEdgeByFace(), lwt_be_getFaceById(), lwt_be_lastErrorMessage(), LWT_COL_EDGE_EDGE_ID, LWT_COL_EDGE_FACE_LEFT, LWT_COL_EDGE_FACE_RIGHT, LWT_COL_EDGE_GEOM, LWT_COL_FACE_FACE_ID, LWTFMT_ELEMID, and LWT_TOPOLOGY_T::srid.

Referenced by lwt_AddPolygon().

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