PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ geography_segmentize()

Datum geography_segmentize ( PG_FUNCTION_ARGS  )

Definition at line 1164 of file geography_measurement.c.

1165{
1166 LWGEOM *lwgeom1 = NULL;
1167 LWGEOM *lwgeom2 = NULL;
1168 GSERIALIZED *g1 = PG_GETARG_GSERIALIZED_P(0);
1169 GSERIALIZED *g2 = NULL;
1170 double max_seg_length = PG_GETARG_FLOAT8(1) / WGS84_RADIUS;
1171 uint32_t type1 = gserialized_get_type(g1);
1172
1173 /* We can't densify points or points, reflect them back */
1174 if ( type1 == POINTTYPE || type1 == MULTIPOINTTYPE || gserialized_is_empty(g1) )
1175 PG_RETURN_POINTER(g1);
1176
1177 /* Deserialize */
1178 lwgeom1 = lwgeom_from_gserialized(g1);
1179
1180 /* Calculate the densified geometry */
1181 lwgeom2 = lwgeom_segmentize_sphere(lwgeom1, max_seg_length);
1182
1183 /*
1184 ** Set the geodetic flag so subsequent
1185 ** functions do the right thing.
1186 */
1187 lwgeom_set_geodetic(lwgeom2, true);
1188
1189 /* Recalculate the boxes after re-setting the geodetic bit */
1190 lwgeom_drop_bbox(lwgeom2);
1191
1192 /* We are trusting geography_serialize will add a box if needed */
1193 g2 = geography_serialize(lwgeom2);
1194
1195 /* Clean up */
1196 lwgeom_free(lwgeom1);
1197 lwgeom_free(lwgeom2);
1198 PG_FREE_IF_COPY(g1, 0);
1199
1200 PG_RETURN_POINTER(g2);
1201}
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
int gserialized_is_empty(const GSERIALIZED *g)
Check if a GSERIALIZED is empty without deserializing first.
uint32_t gserialized_get_type(const GSERIALIZED *g)
Extract the geometry type from the serialized form (it hides in the anonymous data area,...
void lwgeom_set_geodetic(LWGEOM *geom, int value)
Set the FLAGS geodetic bit on geometry an all sub-geometries and pointlists.
Definition lwgeom.c:992
void lwgeom_free(LWGEOM *geom)
Definition lwgeom.c:1246
#define WGS84_RADIUS
Definition liblwgeom.h:148
#define MULTIPOINTTYPE
Definition liblwgeom.h:105
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
Definition liblwgeom.h:102
void lwgeom_drop_bbox(LWGEOM *lwgeom)
Call this function to drop BBOX and SRID from LWGEOM.
Definition lwgeom.c:710
LWGEOM * lwgeom_segmentize_sphere(const LWGEOM *lwg_in, double max_seg_length)
Derive a new geometry with vertices added to ensure no vertex is more than max_seg_length (in radians...

References gserialized_get_type(), gserialized_is_empty(), lwgeom_drop_bbox(), lwgeom_free(), lwgeom_from_gserialized(), lwgeom_segmentize_sphere(), lwgeom_set_geodetic(), MULTIPOINTTYPE, POINTTYPE, and WGS84_RADIUS.

Here is the call graph for this function: