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

◆ ST_FrechetDistance()

Datum ST_FrechetDistance ( PG_FUNCTION_ARGS  )

Definition at line 213 of file postgis/lwgeom_geos.c.

214{
215 GSERIALIZED *geom1;
216 GSERIALIZED *geom2;
217 GEOSGeometry *g1;
218 GEOSGeometry *g2;
219 double densifyFrac;
220 double result;
221 int retcode;
222
223 geom1 = PG_GETARG_GSERIALIZED_P(0);
224 geom2 = PG_GETARG_GSERIALIZED_P(1);
225 densifyFrac = PG_GETARG_FLOAT8(2);
226
227 if ( gserialized_is_empty(geom1) || gserialized_is_empty(geom2) )
228 PG_RETURN_NULL();
229
230 initGEOS(lwpgnotice, lwgeom_geos_error);
231
232 g1 = POSTGIS2GEOS(geom1);
233 if (!g1)
234 HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS");
235
236 g2 = POSTGIS2GEOS(geom2);
237 if (!g2)
238 {
239 GEOSGeom_destroy(g1);
240 HANDLE_GEOS_ERROR("Second argument geometry could not be converted to GEOS");
241 }
242
243 if (densifyFrac <= 0.0)
244 {
245 retcode = GEOSFrechetDistance(g1, g2, &result);
246 }
247 else
248 {
249 retcode = GEOSFrechetDistanceDensify(g1, g2, densifyFrac, &result);
250 }
251
252 GEOSGeom_destroy(g1);
253 GEOSGeom_destroy(g2);
254
255 if (retcode == 0) HANDLE_GEOS_ERROR("GEOSFrechetDistance");
256
257 PG_FREE_IF_COPY(geom1, 0);
258 PG_FREE_IF_COPY(geom2, 1);
259
260 PG_RETURN_FLOAT8(result);
261}
char result[OUT_DOUBLE_BUFFER_SIZE]
Definition cu_print.c:267
int gserialized_is_empty(const GSERIALIZED *g)
Check if a GSERIALIZED is empty without deserializing first.
void lwgeom_geos_error(const char *fmt,...)
GEOSGeometry * POSTGIS2GEOS(const GSERIALIZED *pglwgeom)
#define HANDLE_GEOS_ERROR(label)

References gserialized_is_empty(), HANDLE_GEOS_ERROR, lwgeom_geos_error(), POSTGIS2GEOS(), and result.

Here is the call graph for this function: