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.
2206 uint8_t type1, type2;
2216 LWDEBUGF(4,
"entered function, tolerance %.8g", tolerance);
2225 type1 = lwgeom1->
type;
2226 type2 = lwgeom2->
type;
2229 if ( lwgeom1->
bbox )
2230 gbox1 = *(lwgeom1->
bbox);
2235 if ( lwgeom2->
bbox )
2236 gbox2 = *(lwgeom2->
bbox);
2251 pa1 = ((
LWPOINT*)lwgeom1)->point;
2253 pa1 = ((
LWLINE*)lwgeom1)->points;
2256 pa2 = ((
LWPOINT*)lwgeom2)->point;
2258 pa2 = ((
LWLINE*)lwgeom2)->points;
2276 lwpoly = (
LWPOLY*)lwgeom2;
2281 lwpoly = (
LWPOLY*)lwgeom1;
2292 for ( i = 0; i < lwpoly->
nrings; i++ )
2315 lwline = (
LWLINE*)lwgeom1;
2316 lwpoly = (
LWPOLY*)lwgeom2;
2320 lwline = (
LWLINE*)lwgeom2;
2321 lwpoly = (
LWPOLY*)lwgeom1;
2325 LWDEBUG(4,
"checking if a point of line is in polygon");
2331 LWDEBUG(4,
"checking ring distances");
2334 for ( i = 0; i < lwpoly->
nrings; i++ )
2337 LWDEBUGF(4,
"ring[%d] ring_distance = %.8g", i, ring_distance);
2367 for (i = 0; i < lwpoly1->
nrings; i++)
2369 for (j = 0; j < lwpoly2->
nrings; j++)
2371 double ring_distance =
2377 check_intersection);
2393 for ( i = 0; i < col->
ngeoms; i++ )
2396 col->
geoms[i], lwgeom2, spheroid, tolerance);
2412 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)