PostGIS  2.1.10dev-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 803 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().

804 {
805 
806  const POINT2D *pt;
807  int i;
808 
809  LWDEBUG(2, "lw_dist2d_poly_poly called");
810 
811  /*1 if we are looking for maxdistance, just check the outer rings.*/
812  if (dl->mode == DIST_MAX)
813  {
814  return lw_dist2d_ptarray_ptarray(poly1->rings[0], poly2->rings[0], dl);
815  }
816 
817 
818  /* 2 check if poly1 has first point outside poly2 and vice versa, if so, just check outer rings
819  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.*/
820  pt = getPoint2d_cp(poly1->rings[0], 0);
821  if ( ptarray_contains_point(poly2->rings[0], pt) == LW_OUTSIDE )
822  {
823  pt = getPoint2d_cp(poly2->rings[0], 0);
824  if ( ptarray_contains_point(poly1->rings[0], pt) == LW_OUTSIDE )
825  {
826  return lw_dist2d_ptarray_ptarray(poly1->rings[0], poly2->rings[0], dl);
827  }
828  }
829 
830  /*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*/
831  pt = getPoint2d_cp(poly2->rings[0], 0);
832  for (i=1; i<poly1->nrings; i++)
833  {
834  /* Inside a hole */
835  if ( ptarray_contains_point(poly1->rings[i], pt) != LW_OUTSIDE )
836  {
837  return lw_dist2d_ptarray_ptarray(poly1->rings[i], poly2->rings[0], dl);
838  }
839  }
840 
841  /*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*/
842  pt = getPoint2d_cp(poly1->rings[0], 0);
843  for (i=1; i<poly2->nrings; i++)
844  {
845  /* Inside a hole */
846  if ( ptarray_contains_point(poly2->rings[i], pt) != LW_OUTSIDE )
847  {
848  return lw_dist2d_ptarray_ptarray(poly1->rings[0], poly2->rings[i], dl);
849  }
850  }
851 
852 
853  /*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.*/
854  pt = getPoint2d_cp(poly1->rings[0], 0);
855  if ( ptarray_contains_point(poly2->rings[0], pt) != LW_OUTSIDE )
856  {
857  dl->distance = 0.0;
858  dl->p1.x = dl->p2.x = pt->x;
859  dl->p1.y = dl->p2.y = pt->y;
860  return LW_TRUE;
861  }
862 
863  pt = getPoint2d_cp(poly2->rings[0], 0);
864  if ( ptarray_contains_point(poly1->rings[0], pt) != LW_OUTSIDE )
865  {
866  dl->distance = 0.0;
867  dl->p1.x = dl->p2.x = pt->x;
868  dl->p1.y = dl->p2.y = pt->y;
869  return LW_TRUE;
870  }
871 
872 
873  lwerror("Unspecified error in function lw_dist2d_poly_poly");
874  return LW_FALSE;
875 }
#define DIST_MAX
int mode
Definition: measures.h:26
#define LWDEBUG(level, msg)
Definition: lwgeom_log.h:50
POINT2D p1
Definition: measures.h:24
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:67
double x
Definition: liblwgeom.h:284
#define LW_FALSE
Definition: liblwgeom.h:52
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:458
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:51
POINTARRAY ** rings
Definition: liblwgeom.h:413
POINT2D p2
Definition: measures.h:25
int nrings
Definition: liblwgeom.h:411
double y
Definition: liblwgeom.h:284
double distance
Definition: measures.h:23
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:697
#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:1091

Here is the call graph for this function:

Here is the caller graph for this function: