PostGIS  2.4.9dev-r@@SVN_REVISION@@

◆ lwgeom_clip_to_ordinate_range()

LWCOLLECTION* lwgeom_clip_to_ordinate_range ( const LWGEOM lwin,
char  ordinate,
double  from,
double  to,
double  offset 
)

Given a geometry clip based on the from/to range of one of its ordinates (x, y, z, m).

Use for m- and z- clipping.

Definition at line 773 of file lwlinearreferencing.c.

References FP_EQUALS, LWCOLLECTION::geoms, LINETYPE, lwcollection_add_lwgeom(), lwcollection_as_lwgeom(), lwcollection_construct_empty(), lwerror(), lwgeom_as_lwline(), lwgeom_is_empty(), lwgeom_offsetcurve(), lwline_clip_to_ordinate_range(), lwmline_clip_to_ordinate_range(), lwmpoint_clip_to_ordinate_range(), lwnotice(), lwpoint_clip_to_ordinate_range(), lwtype_name(), MULTILINETYPE, MULTIPOINTTYPE, LWCOLLECTION::ngeoms, POINTTYPE, LWGEOM::srid, ovdump::type, LWGEOM::type, and LWPOINT::type.

Referenced by lwgeom_locate_between(), ST_LocateBetween(), and ST_LocateBetweenElevations().

774 {
775  LWCOLLECTION *out_col;
776  LWCOLLECTION *out_offset;
777  int i;
778 
779  if ( ! lwin )
780  lwerror("lwgeom_clip_to_ordinate_range: null input geometry!");
781 
782  switch ( lwin->type )
783  {
784  case LINETYPE:
785  out_col = lwline_clip_to_ordinate_range((LWLINE*)lwin, ordinate, from, to);
786  break;
787  case MULTILINETYPE:
788  out_col = lwmline_clip_to_ordinate_range((LWMLINE*)lwin, ordinate, from, to);
789  break;
790  case MULTIPOINTTYPE:
791  out_col = lwmpoint_clip_to_ordinate_range((LWMPOINT*)lwin, ordinate, from, to);
792  break;
793  case POINTTYPE:
794  out_col = lwpoint_clip_to_ordinate_range((LWPOINT*)lwin, ordinate, from, to);
795  break;
796  default:
797  lwerror("This function does not accept %s geometries.", lwtype_name(lwin->type));
798  return NULL;;
799  }
800 
801  /* Stop if result is NULL */
802  if ( out_col == NULL )
803  lwerror("lwgeom_clip_to_ordinate_range clipping routine returned NULL");
804 
805  /* Return if we aren't going to offset the result */
806  if ( FP_EQUALS(offset, 0.0) || lwgeom_is_empty(lwcollection_as_lwgeom(out_col)) )
807  return out_col;
808 
809  /* Construct a collection to hold our outputs. */
810  /* Things get ugly: GEOS offset drops Z's and M's so we have to drop ours */
811  out_offset = lwcollection_construct_empty(MULTILINETYPE, lwin->srid, 0, 0);
812 
813  /* Try and offset the linear portions of the return value */
814  for ( i = 0; i < out_col->ngeoms; i++ )
815  {
816  int type = out_col->geoms[i]->type;
817  if ( type == POINTTYPE )
818  {
819  lwnotice("lwgeom_clip_to_ordinate_range cannot offset a clipped point");
820  continue;
821  }
822  else if ( type == LINETYPE )
823  {
824  /* lwgeom_offsetcurve(line, offset, quadsegs, joinstyle (round), mitrelimit) */
825  LWGEOM *lwoff = lwgeom_offsetcurve(lwgeom_as_lwline(out_col->geoms[i]), offset, 8, 1, 5.0);
826  if ( ! lwoff )
827  {
828  lwerror("lwgeom_offsetcurve returned null");
829  }
830  lwcollection_add_lwgeom(out_offset, lwoff);
831  }
832  else
833  {
834  lwerror("lwgeom_clip_to_ordinate_range found an unexpected type (%s) in the offset routine",lwtype_name(type));
835  }
836  }
837 
838  return out_offset;
839 }
#define LINETYPE
Definition: liblwgeom.h:86
LWCOLLECTION * lwpoint_clip_to_ordinate_range(const LWPOINT *point, char ordinate, double from, double to)
Clip an input POINT between two values, on any ordinate input.
LWCOLLECTION * lwmpoint_clip_to_ordinate_range(const LWMPOINT *mpoint, char ordinate, double from, double to)
Clip an input MULTIPOINT between two values, on any ordinate input.
void lwnotice(const char *fmt,...)
Write a notice out to the notice handler.
Definition: lwutil.c:177
#define MULTIPOINTTYPE
Definition: liblwgeom.h:88
LWGEOM * lwgeom_offsetcurve(const LWLINE *lwline, double size, int quadsegs, int joinStyle, double mitreLimit)
LWCOLLECTION * lwline_clip_to_ordinate_range(const LWLINE *line, char ordinate, double from, double to)
Take in a LINESTRING and return a MULTILINESTRING of those portions of the LINESTRING between the fro...
int32_t srid
Definition: liblwgeom.h:399
const char * lwtype_name(uint8_t type)
Return the type name string associated with a type number (e.g.
Definition: lwutil.c:218
LWGEOM ** geoms
Definition: liblwgeom.h:509
LWCOLLECTION * lwmline_clip_to_ordinate_range(const LWMLINE *mline, char ordinate, double from, double to)
Clip an input MULTILINESTRING between two values, on any ordinate input.
LWLINE * lwgeom_as_lwline(const LWGEOM *lwgeom)
Definition: lwgeom.c:138
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
Definition: liblwgeom.h:85
uint8_t type
Definition: liblwgeom.h:396
type
Definition: ovdump.py:41
#define FP_EQUALS(A, B)
int lwgeom_is_empty(const LWGEOM *geom)
Return true or false depending on whether a geometry is an "empty" geometry (no vertices members) ...
Definition: lwgeom.c:1346
#define MULTILINETYPE
Definition: liblwgeom.h:89
LWCOLLECTION * lwcollection_construct_empty(uint8_t type, int srid, char hasz, char hasm)
Definition: lwcollection.c:94
LWCOLLECTION * lwcollection_add_lwgeom(LWCOLLECTION *col, const LWGEOM *geom)
Appends geom to the collection managed by col.
Definition: lwcollection.c:187
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:190
LWGEOM * lwcollection_as_lwgeom(const LWCOLLECTION *obj)
Definition: lwgeom.c:268
Here is the call graph for this function:
Here is the caller graph for this function: