Since we do a full scan of pointarray from ptarray_locate_point, take the chance to also return min distance

git-svn-id: http://svn.osgeo.org/postgis/trunk@5395 b70326c6-7e19-0410-871a-916f4a2858ee
This commit is contained in:
Sandro Santilli 2010-03-10 15:29:39 +00:00
parent c2eac6cc1a
commit fb7ab3a9a3
3 changed files with 10 additions and 4 deletions

View file

@ -1394,9 +1394,12 @@ extern POINTARRAY *ptarray_substring(POINTARRAY *, double, double);
/*
* Given a point, returns the location of closest point on pointarray
* as a fraction of total length (0: first point -- 1: last point)
* as a fraction of total length (0: first point -- 1: last point).
*
* If not-null, the third argument will be set to the actual distance
* of the point from the pointarray.
*/
extern double ptarray_locate_point(POINTARRAY *, POINT2D *);
extern double ptarray_locate_point(POINTARRAY *, POINT2D *, double *);
/*
* Write into *ret the coordinates of the closest point on

View file

@ -778,9 +778,10 @@ closest_point_on_segment(POINT2D *p, POINT2D *A, POINT2D *B, POINT2D *ret)
/*
* Given a point, returns the location of closest point on pointarray
* and, optionally, it's actual distance from the point array.
*/
double
ptarray_locate_point(POINTARRAY *pa, POINT2D *p)
ptarray_locate_point(POINTARRAY *pa, POINT2D *p, double* mindistout)
{
double mindist=-1;
double tlen, plen;
@ -844,6 +845,8 @@ ptarray_locate_point(POINTARRAY *pa, POINT2D *p)
LWDEBUGF(3, "plen %g, tlen %g", plen, tlen);
LWDEBUGF(3, "mindist: %g", mindist);
if ( mindistout ) *mindistout = mindist;
return plen/tlen;
}

View file

@ -1232,7 +1232,7 @@ Datum LWGEOM_line_locate_point(PG_FUNCTION_ARGS)
pa = lwline->points;
lwpoint_getPoint2d_p(lwpoint, &p);
ret = ptarray_locate_point(pa, &p);
ret = ptarray_locate_point(pa, &p, NULL);
PG_RETURN_FLOAT8(ret);
}