Calculate the distance between two LWGEOMs, using the coordinates are longitude and latitude.
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.
2194 uint8_t type1, type2;
2204 LWDEBUGF(4,
"entered function, tolerance %.8g", tolerance);
2213 type1 = lwgeom1->
type;
2214 type2 = lwgeom2->
type;
2217 if ( lwgeom1->
bbox )
2218 gbox1 = *(lwgeom1->
bbox);
2223 if ( lwgeom2->
bbox )
2224 gbox2 = *(lwgeom2->
bbox);
2239 pa1 = ((
LWPOINT*)lwgeom1)->point;
2241 pa1 = ((
LWLINE*)lwgeom1)->points;
2244 pa2 = ((
LWPOINT*)lwgeom2)->point;
2246 pa2 = ((
LWLINE*)lwgeom2)->points;
2264 lwpoly = (
LWPOLY*)lwgeom2;
2269 lwpoly = (
LWPOLY*)lwgeom1;
2280 for ( i = 0; i < lwpoly->
nrings; i++ )
2303 lwline = (
LWLINE*)lwgeom1;
2304 lwpoly = (
LWPOLY*)lwgeom2;
2308 lwline = (
LWLINE*)lwgeom2;
2309 lwpoly = (
LWPOLY*)lwgeom1;
2313 LWDEBUG(4,
"checking if a point of line is in polygon");
2319 LWDEBUG(4,
"checking ring distances");
2322 for ( i = 0; i < lwpoly->
nrings; i++ )
2325 LWDEBUGF(4,
"ring[%d] ring_distance = %.8g", i, ring_distance);
2355 for (i = 0; i < lwpoly1->
nrings; i++)
2357 for (j = 0; j < lwpoly2->
nrings; j++)
2359 double ring_distance =
2365 check_intersection);
2381 for ( i = 0; i < col->
ngeoms; i++ )
2384 col->
geoms[i], lwgeom2, spheroid, tolerance);
2400 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.
#define LW_TRUE
Return types for functions with status returns.
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)
#define LWDEBUG(level, msg)
#define LWDEBUGF(level, msg,...)
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
static const POINT2D * getPoint2d_cp(const POINTARRAY *pa, uint32_t n)
Returns a POINT2D pointer into the POINTARRAY serialized_ptlist, suitable for reading from.
static int lwgeom_is_empty(const LWGEOM *geom)
Return true or false depending on whether a geometry is an "empty" geometry (no vertices members)
static double distance(double x1, double y1, double x2, double y2)