Calculate the geodetic distance from lwgeom1 to lwgeom2 on the spheroid.
A spheroid with major axis == minor axis will be treated as a sphere. Pass in a tolerance in spheroid units.
Calculate the geodetic distance from lwgeom1 to lwgeom2 on the spheroid.
Return immediately when the calculated distance drops below the tolerance (useful for dwithin calculations). Return a negative distance for incalculable cases.
2199 LWDEBUGF(4,
"entered function, tolerance %.8g", tolerance);
2208 type1 = lwgeom1->
type;
2209 type2 = lwgeom2->
type;
2212 if ( lwgeom1->
bbox )
2213 gbox1 = *(lwgeom1->
bbox);
2218 if ( lwgeom2->
bbox )
2219 gbox2 = *(lwgeom2->
bbox);
2234 pa1 = ((
LWPOINT*)lwgeom1)->point;
2236 pa1 = ((
LWLINE*)lwgeom1)->points;
2239 pa2 = ((
LWPOINT*)lwgeom2)->point;
2241 pa2 = ((
LWLINE*)lwgeom2)->points;
2259 lwpoly = (
LWPOLY*)lwgeom2;
2264 lwpoly = (
LWPOLY*)lwgeom1;
2275 for ( i = 0; i < lwpoly->
nrings; i++ )
2298 lwline = (
LWLINE*)lwgeom1;
2299 lwpoly = (
LWPOLY*)lwgeom2;
2303 lwline = (
LWLINE*)lwgeom2;
2304 lwpoly = (
LWPOLY*)lwgeom1;
2308 LWDEBUG(4,
"checking if a point of line is in polygon");
2314 LWDEBUG(4,
"checking ring distances");
2317 for ( i = 0; i < lwpoly->
nrings; i++ )
2320 LWDEBUGF(4,
"ring[%d] ring_distance = %.8g", i, ring_distance);
2350 for (i = 0; i < lwpoly1->
nrings; i++)
2352 for (j = 0; j < lwpoly2->
nrings; j++)
2354 double ring_distance =
2360 check_intersection);
2376 for ( i = 0; i < col->
ngeoms; i++ )
2379 col->
geoms[i], lwgeom2, spheroid, tolerance);
2395 for ( i = 0; i < col->
ngeoms; i++ )
int gbox_overlaps(const GBOX *g1, const GBOX *g2)
Return LW_TRUE if the GBOX overlaps, LW_FALSE otherwise.
void gbox_init(GBOX *gbox)
Zero out all the entries in the GBOX.
int lwtype_is_collection(uint8_t type)
Determine whether a type number is a collection or not.
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
const char * lwtype_name(uint8_t type)
Return the type name string associated with a type number (e.g.
int lwgeom_is_empty(const LWGEOM *geom)
Return true or false depending on whether a geometry is an "empty" geometry (no vertices members)
#define LW_TRUE
Return types for functions with status returns.
const POINT2D * getPoint2d_cp(const POINTARRAY *pa, uint32_t n)
Returns a POINT2D pointer into the POINTARRAY serialized_ptlist, suitable for reading from.
int lwpoly_covers_point2d(const LWPOLY *poly, const POINT2D *pt_to_test)
Given a polygon (lon/lat decimal degrees) and point (lon/lat decimal degrees) and a guaranteed outsid...
double lwgeom_distance_spheroid(const LWGEOM *lwgeom1, const LWGEOM *lwgeom2, const SPHEROID *spheroid, double tolerance)
Calculate the distance between two LWGEOMs, using the coordinates are longitude and latitude.
int lwgeom_calculate_gbox_geodetic(const LWGEOM *geom, GBOX *gbox)
Calculate the geodetic bounding box for an LWGEOM.
static double ptarray_distance_spheroid(const POINTARRAY *pa1, const POINTARRAY *pa2, const SPHEROID *s, double tolerance, int check_intersection)
Datum distance(PG_FUNCTION_ARGS)
#define LWDEBUG(level, msg)
#define LWDEBUGF(level, msg,...)
void lwerror(const char *fmt,...)
Write a notice out to the error handler.