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

◆ edge_distance_to_point()

double edge_distance_to_point ( const GEOGRAPHIC_EDGE e,
const GEOGRAPHIC_POINT gp,
GEOGRAPHIC_POINT closest 
)

Definition at line 1170 of file lwgeodetic.c.

1171{
1172 double d1 = 1000000000.0, d2, d3, d_nearest;
1173 POINT3D n, p, k;
1174 GEOGRAPHIC_POINT gk, g_nearest;
1175
1176 /* Zero length edge, */
1177 if ( geographic_point_equals(&(e->start), &(e->end)) )
1178 {
1179 if (closest)
1180 *closest = e->start;
1181
1182 return sphere_distance(&(e->start), gp);
1183 }
1184
1185 robust_cross_product(&(e->start), &(e->end), &n);
1186 normalize(&n);
1187 geog2cart(gp, &p);
1188 vector_scale(&n, dot_product(&p, &n));
1189 vector_difference(&p, &n, &k);
1190 normalize(&k);
1191 cart2geog(&k, &gk);
1192 if ( edge_point_in_cone(e, &gk) )
1193 {
1194 d1 = sphere_distance(gp, &gk);
1195 }
1196 d2 = sphere_distance(gp, &(e->start));
1197 d3 = sphere_distance(gp, &(e->end));
1198
1199 d_nearest = d1;
1200 g_nearest = gk;
1201
1202 if ( d2 < d_nearest )
1203 {
1204 d_nearest = d2;
1205 g_nearest = e->start;
1206 }
1207 if ( d3 < d_nearest )
1208 {
1209 d_nearest = d3;
1210 g_nearest = e->end;
1211 }
1212 if (closest)
1213 *closest = g_nearest;
1214
1215 return d_nearest;
1216}
void normalize(POINT3D *p)
Normalize to a unit vector.
Definition lwgeodetic.c:615
void vector_scale(POINT3D *n, double scale)
Scale a vector out by a factor.
Definition lwgeodetic.c:487
void cart2geog(const POINT3D *p, GEOGRAPHIC_POINT *g)
Convert cartesian coordinates on unit sphere to spherical coordinates.
Definition lwgeodetic.c:414
int edge_point_in_cone(const GEOGRAPHIC_EDGE *e, const GEOGRAPHIC_POINT *p)
Returns true if the point p is inside the cone defined by the two ends of the edge e.
Definition lwgeodetic.c:736
void robust_cross_product(const GEOGRAPHIC_POINT *p, const GEOGRAPHIC_POINT *q, POINT3D *a)
Computes the cross product of two vectors using their lat, lng representations.
Definition lwgeodetic.c:634
static void vector_difference(const POINT3D *a, const POINT3D *b, POINT3D *n)
Calculate the difference of two vectors.
Definition lwgeodetic.c:476
double sphere_distance(const GEOGRAPHIC_POINT *s, const GEOGRAPHIC_POINT *e)
Given two points on a unit sphere, calculate their distance apart in radians.
Definition lwgeodetic.c:896
static double dot_product(const POINT3D *p1, const POINT3D *p2)
Convert cartesian coordinates on unit sphere to lon/lat coordinates static void cart2ll(const POINT3D...
Definition lwgeodetic.c:446
void geog2cart(const GEOGRAPHIC_POINT *g, POINT3D *p)
Convert spherical coordinates to cartesian coordinates on unit sphere.
Definition lwgeodetic.c:404
int geographic_point_equals(const GEOGRAPHIC_POINT *g1, const GEOGRAPHIC_POINT *g2)
Definition lwgeodetic.c:170
GEOGRAPHIC_POINT start
Definition lwgeodetic.h:64
GEOGRAPHIC_POINT end
Definition lwgeodetic.h:65
Point in spherical coordinates on the world.
Definition lwgeodetic.h:54

References cart2geog(), dot_product(), edge_point_in_cone(), GEOGRAPHIC_EDGE::end, geog2cart(), geographic_point_equals(), normalize(), robust_cross_product(), sphere_distance(), GEOGRAPHIC_EDGE::start, vector_difference(), and vector_scale().

Referenced by circ_tree_contains_point(), circ_tree_distance_tree_internal(), edge_distance_to_edge(), ptarray_distance_spheroid(), ptarray_locate_point_spheroid(), and test_edge_distance_to_point().

Here is the call graph for this function:
Here is the caller graph for this function: