PostGIS  2.2.7dev-r@@SVN_REVISION@@
int lw_dist2d_poly_poly ( LWPOLY poly1,
LWPOLY poly2,
DISTPTS dl 
)

Function handling polygon to polygon calculation 1 if we are looking for maxdistance, just check the outer rings.

2 check if poly1 has first point outside poly2 and vice versa, if so, just check outer rings 3 check if first point of poly2 is in a hole of poly1. If so check outer ring of poly2 against that hole of poly1 4 check if first point of poly1 is in a hole of poly2. If so check outer ring of poly1 against that hole of poly2 5 If we have come all the way here we know that the first point of one of them is inside the other ones outer ring and not in holes so we check wich one is inside.

Definition at line 829 of file measures.c.

References DIST_MAX, DISTPTS::distance, getPoint2d_cp(), lw_dist2d_ptarray_ptarray(), LW_FALSE, LW_OUTSIDE, LW_TRUE, LWDEBUG, lwerror(), DISTPTS::mode, LWPOLY::nrings, DISTPTS::p1, DISTPTS::p2, ptarray_contains_point(), LWPOLY::rings, POINT2D::x, and POINT2D::y.

Referenced by lw_dist2d_distribute_bruteforce().

830 {
831 
832  const POINT2D *pt;
833  int i;
834 
835  LWDEBUG(2, "lw_dist2d_poly_poly called");
836 
837  /*1 if we are looking for maxdistance, just check the outer rings.*/
838  if (dl->mode == DIST_MAX)
839  {
840  return lw_dist2d_ptarray_ptarray(poly1->rings[0], poly2->rings[0], dl);
841  }
842 
843 
844  /* 2 check if poly1 has first point outside poly2 and vice versa, if so, just check outer rings
845  here it would be possible to handle the information about wich one is inside wich one and only search for the smaller ones in the bigger ones holes.*/
846  pt = getPoint2d_cp(poly1->rings[0], 0);
847  if ( ptarray_contains_point(poly2->rings[0], pt) == LW_OUTSIDE )
848  {
849  pt = getPoint2d_cp(poly2->rings[0], 0);
850  if ( ptarray_contains_point(poly1->rings[0], pt) == LW_OUTSIDE )
851  {
852  return lw_dist2d_ptarray_ptarray(poly1->rings[0], poly2->rings[0], dl);
853  }
854  }
855 
856  /*3 check if first point of poly2 is in a hole of poly1. If so check outer ring of poly2 against that hole of poly1*/
857  pt = getPoint2d_cp(poly2->rings[0], 0);
858  for (i=1; i<poly1->nrings; i++)
859  {
860  /* Inside a hole */
861  if ( ptarray_contains_point(poly1->rings[i], pt) != LW_OUTSIDE )
862  {
863  return lw_dist2d_ptarray_ptarray(poly1->rings[i], poly2->rings[0], dl);
864  }
865  }
866 
867  /*4 check if first point of poly1 is in a hole of poly2. If so check outer ring of poly1 against that hole of poly2*/
868  pt = getPoint2d_cp(poly1->rings[0], 0);
869  for (i=1; i<poly2->nrings; i++)
870  {
871  /* Inside a hole */
872  if ( ptarray_contains_point(poly2->rings[i], pt) != LW_OUTSIDE )
873  {
874  return lw_dist2d_ptarray_ptarray(poly1->rings[0], poly2->rings[i], dl);
875  }
876  }
877 
878 
879  /*5 If we have come all the way here we know that the first point of one of them is inside the other ones outer ring and not in holes so we check wich one is inside.*/
880  pt = getPoint2d_cp(poly1->rings[0], 0);
881  if ( ptarray_contains_point(poly2->rings[0], pt) != LW_OUTSIDE )
882  {
883  dl->distance = 0.0;
884  dl->p1.x = dl->p2.x = pt->x;
885  dl->p1.y = dl->p2.y = pt->y;
886  return LW_TRUE;
887  }
888 
889  pt = getPoint2d_cp(poly2->rings[0], 0);
890  if ( ptarray_contains_point(poly1->rings[0], pt) != LW_OUTSIDE )
891  {
892  dl->distance = 0.0;
893  dl->p1.x = dl->p2.x = pt->x;
894  dl->p1.y = dl->p2.y = pt->y;
895  return LW_TRUE;
896  }
897 
898 
899  lwerror("Unspecified error in function lw_dist2d_poly_poly");
900  return LW_FALSE;
901 }
int mode
Definition: measures.h:27
#define LWDEBUG(level, msg)
Definition: lwgeom_log.h:50
POINT2D p1
Definition: measures.h:25
double x
Definition: liblwgeom.h:312
#define LW_FALSE
Definition: liblwgeom.h:62
const POINT2D * getPoint2d_cp(const POINTARRAY *pa, int n)
Returns a POINT2D pointer into the POINTARRAY serialized_ptlist, suitable for reading from...
Definition: lwgeom_api.c:472
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:61
POINTARRAY ** rings
Definition: liblwgeom.h:441
POINT2D p2
Definition: measures.h:26
int nrings
Definition: liblwgeom.h:439
double y
Definition: liblwgeom.h:312
double distance
Definition: measures.h:24
#define DIST_MAX
Definition: measures.h:16
int ptarray_contains_point(const POINTARRAY *pa, const POINT2D *pt)
Return 1 if the point is inside the POINTARRAY, -1 if it is outside, and 0 if it is on the boundary...
Definition: ptarray.c:733
#define LW_OUTSIDE
int lw_dist2d_ptarray_ptarray(POINTARRAY *l1, POINTARRAY *l2, DISTPTS *dl)
test each segment of l1 against each segment of l2.
Definition: measures.c:1117
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:74

Here is the call graph for this function:

Here is the caller graph for this function: