PostGIS  2.5.1dev-r@@SVN_REVISION@@

◆ lw_dist2d_poly_poly()

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 which one is inside.

Definition at line 847 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().

848 {
849 
850  const POINT2D *pt;
851  uint32_t i;
852 
853  LWDEBUG(2, "lw_dist2d_poly_poly called");
854 
855  /*1 if we are looking for maxdistance, just check the outer rings.*/
856  if (dl->mode == DIST_MAX)
857  {
858  return lw_dist2d_ptarray_ptarray(poly1->rings[0], poly2->rings[0], dl);
859  }
860 
861 
862  /* 2 check if poly1 has first point outside poly2 and vice versa, if so, just check outer rings
863  here it would be possible to handle the information about which one is inside which one and only search for the smaller ones in the bigger ones holes.*/
864  pt = getPoint2d_cp(poly1->rings[0], 0);
865  if ( ptarray_contains_point(poly2->rings[0], pt) == LW_OUTSIDE )
866  {
867  pt = getPoint2d_cp(poly2->rings[0], 0);
868  if ( ptarray_contains_point(poly1->rings[0], pt) == LW_OUTSIDE )
869  {
870  return lw_dist2d_ptarray_ptarray(poly1->rings[0], poly2->rings[0], dl);
871  }
872  }
873 
874  /*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*/
875  pt = getPoint2d_cp(poly2->rings[0], 0);
876  for (i=1; i<poly1->nrings; i++)
877  {
878  /* Inside a hole */
879  if ( ptarray_contains_point(poly1->rings[i], pt) != LW_OUTSIDE )
880  {
881  return lw_dist2d_ptarray_ptarray(poly1->rings[i], poly2->rings[0], dl);
882  }
883  }
884 
885  /*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*/
886  pt = getPoint2d_cp(poly1->rings[0], 0);
887  for (i=1; i<poly2->nrings; i++)
888  {
889  /* Inside a hole */
890  if ( ptarray_contains_point(poly2->rings[i], pt) != LW_OUTSIDE )
891  {
892  return lw_dist2d_ptarray_ptarray(poly1->rings[0], poly2->rings[i], dl);
893  }
894  }
895 
896 
897  /*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.*/
898  pt = getPoint2d_cp(poly1->rings[0], 0);
899  if ( ptarray_contains_point(poly2->rings[0], pt) != LW_OUTSIDE )
900  {
901  dl->distance = 0.0;
902  dl->p1.x = dl->p2.x = pt->x;
903  dl->p1.y = dl->p2.y = pt->y;
904  return LW_TRUE;
905  }
906 
907  pt = getPoint2d_cp(poly2->rings[0], 0);
908  if ( ptarray_contains_point(poly1->rings[0], pt) != LW_OUTSIDE )
909  {
910  dl->distance = 0.0;
911  dl->p1.x = dl->p2.x = pt->x;
912  dl->p1.y = dl->p2.y = pt->y;
913  return LW_TRUE;
914  }
915 
916 
917  lwerror("Unspecified error in function lw_dist2d_poly_poly");
918  return LW_FALSE;
919 }
int mode
Definition: measures.h:51
#define LWDEBUG(level, msg)
Definition: lwgeom_log.h:83
uint32_t nrings
Definition: liblwgeom.h:457
POINT2D p1
Definition: measures.h:49
unsigned int uint32_t
Definition: uthash.h:78
double x
Definition: liblwgeom.h:330
#define LW_FALSE
Definition: liblwgeom.h:76
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:75
POINTARRAY ** rings
Definition: liblwgeom.h:459
POINT2D p2
Definition: measures.h:50
double y
Definition: liblwgeom.h:330
double distance
Definition: measures.h:48
#define DIST_MAX
Definition: measures.h:40
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:734
#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:1135
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:190
const POINT2D * getPoint2d_cp(const POINTARRAY *pa, uint32_t n)
Returns a POINT2D pointer into the POINTARRAY serialized_ptlist, suitable for reading from...
Definition: lwgeom_api.c:364
Here is the call graph for this function:
Here is the caller graph for this function: