PostGIS  3.4.0dev-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 978 of file measures.c.

979 {
980  const POINT2D *pt;
981 
982  LWDEBUG(2, "lw_dist2d_poly_poly called");
983 
984  /*1 if we are looking for maxdistance, just check the outer rings.*/
985  if (dl->mode == DIST_MAX)
986  return lw_dist2d_ptarray_ptarray(poly1->rings[0], poly2->rings[0], dl);
987 
988  /* 2 check if poly1 has first point outside poly2 and vice versa, if so, just check outer rings
989  here it would be possible to handle the information about which one is inside which one and only search for the
990  smaller ones in the bigger ones holes.*/
991  pt = getPoint2d_cp(poly1->rings[0], 0);
992  if (ptarray_contains_point(poly2->rings[0], pt) == LW_OUTSIDE)
993  {
994  pt = getPoint2d_cp(poly2->rings[0], 0);
995  if (ptarray_contains_point(poly1->rings[0], pt) == LW_OUTSIDE)
996  return lw_dist2d_ptarray_ptarray(poly1->rings[0], poly2->rings[0], dl);
997  }
998 
999  /*3 check if first point of poly2 is in a hole of poly1. If so check outer ring of poly2 against that hole
1000  * of poly1*/
1001  pt = getPoint2d_cp(poly2->rings[0], 0);
1002  for (uint32_t i = 1; i < poly1->nrings; i++)
1003  if (ptarray_contains_point(poly1->rings[i], pt) != LW_OUTSIDE)
1004  return lw_dist2d_ptarray_ptarray(poly1->rings[i], poly2->rings[0], dl);
1005 
1006  /*4 check if first point of poly1 is in a hole of poly2. If so check outer ring of poly1 against that hole
1007  * of poly2*/
1008  pt = getPoint2d_cp(poly1->rings[0], 0);
1009  for (uint32_t i = 1; i < poly2->nrings; i++)
1010  if (ptarray_contains_point(poly2->rings[i], pt) != LW_OUTSIDE)
1011  return lw_dist2d_ptarray_ptarray(poly1->rings[0], poly2->rings[i], dl);
1012 
1013  /*5 If we have come all the way here we know that the first point of one of them is inside the other ones
1014  * outer ring and not in holes so we check wich one is inside.*/
1015  pt = getPoint2d_cp(poly1->rings[0], 0);
1016  if (ptarray_contains_point(poly2->rings[0], pt) != LW_OUTSIDE)
1017  {
1018  dl->distance = 0.0;
1019  dl->p1.x = dl->p2.x = pt->x;
1020  dl->p1.y = dl->p2.y = pt->y;
1021  return LW_TRUE;
1022  }
1023 
1024  pt = getPoint2d_cp(poly2->rings[0], 0);
1025  if (ptarray_contains_point(poly1->rings[0], pt) != LW_OUTSIDE)
1026  {
1027  dl->distance = 0.0;
1028  dl->p1.x = dl->p2.x = pt->x;
1029  dl->p1.y = dl->p2.y = pt->y;
1030  return LW_TRUE;
1031  }
1032 
1033  lwerror("Unspecified error in function lw_dist2d_poly_poly");
1034  return LW_FALSE;
1035 }
#define LW_FALSE
Definition: liblwgeom.h:94
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:93
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:753
#define LW_OUTSIDE
#define LWDEBUG(level, msg)
Definition: lwgeom_log.h:83
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:190
static const POINT2D * getPoint2d_cp(const POINTARRAY *pa, uint32_t n)
Returns a POINT2D pointer into the POINTARRAY serialized_ptlist, suitable for reading from.
Definition: lwinline.h:101
int lw_dist2d_ptarray_ptarray(POINTARRAY *l1, POINTARRAY *l2, DISTPTS *dl)
test each segment of l1 against each segment of l2.
Definition: measures.c:1209
#define DIST_MAX
Definition: measures.h:43
POINT2D p1
Definition: measures.h:52
POINT2D p2
Definition: measures.h:53
int mode
Definition: measures.h:54
double distance
Definition: measures.h:51
POINTARRAY ** rings
Definition: liblwgeom.h:519
uint32_t nrings
Definition: liblwgeom.h:524
double y
Definition: liblwgeom.h:390
double x
Definition: liblwgeom.h:390

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().

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