PostGIS  3.6.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 968 of file measures.c.

969 {
970  const POINT2D *pt;
971 
972  LWDEBUG(2, "lw_dist2d_poly_poly called");
973 
974  /*1 if we are looking for maxdistance, just check the outer rings.*/
975  if (dl->mode == DIST_MAX)
976  return lw_dist2d_ptarray_ptarray(poly1->rings[0], poly2->rings[0], dl);
977 
978  /* 2 check if poly1 has first point outside poly2 and vice versa, if so, just check outer rings
979  here it would be possible to handle the information about which one is inside which one and only search for the
980  smaller ones in the bigger ones holes.*/
981  pt = getPoint2d_cp(poly1->rings[0], 0);
982  if (ptarray_contains_point(poly2->rings[0], pt) == LW_OUTSIDE)
983  {
984  pt = getPoint2d_cp(poly2->rings[0], 0);
985  if (ptarray_contains_point(poly1->rings[0], pt) == LW_OUTSIDE)
986  return lw_dist2d_ptarray_ptarray(poly1->rings[0], poly2->rings[0], dl);
987  }
988 
989  /*3 check if first point of poly2 is in a hole of poly1. If so check outer ring of poly2 against that hole
990  * of poly1*/
991  pt = getPoint2d_cp(poly2->rings[0], 0);
992  for (uint32_t i = 1; i < poly1->nrings; i++)
993  if (ptarray_contains_point(poly1->rings[i], pt) != LW_OUTSIDE)
994  return lw_dist2d_ptarray_ptarray(poly1->rings[i], poly2->rings[0], dl);
995 
996  /*4 check if first point of poly1 is in a hole of poly2. If so check outer ring of poly1 against that hole
997  * of poly2*/
998  pt = getPoint2d_cp(poly1->rings[0], 0);
999  for (uint32_t i = 1; i < poly2->nrings; i++)
1000  if (ptarray_contains_point(poly2->rings[i], pt) != LW_OUTSIDE)
1001  return lw_dist2d_ptarray_ptarray(poly1->rings[0], poly2->rings[i], dl);
1002 
1003  /*5 If we have come all the way here we know that the first point of one of them is inside the other ones
1004  * outer ring and not in holes so we check which one is inside.*/
1005  pt = getPoint2d_cp(poly1->rings[0], 0);
1006  if (ptarray_contains_point(poly2->rings[0], pt) != LW_OUTSIDE)
1007  {
1008  lw_dist2d_distpts_set(dl, 0.0, pt, pt);
1009  return LW_TRUE;
1010  }
1011 
1012  pt = getPoint2d_cp(poly2->rings[0], 0);
1013  if (ptarray_contains_point(poly1->rings[0], pt) != LW_OUTSIDE)
1014  {
1015  lw_dist2d_distpts_set(dl, 0.0, pt, pt);
1016  return LW_TRUE;
1017  }
1018 
1019  lwerror("Unspecified error in function lw_dist2d_poly_poly");
1020  return LW_FALSE;
1021 }
#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)
The following is based on the "Fast Winding Number Inclusion of a Point in a Polygon" algorithm by Da...
Definition: ptarray.c:755
#define LW_OUTSIDE
#define LWDEBUG(level, msg)
Definition: lwgeom_log.h:101
void void lwerror(const char *fmt,...) __attribute__((format(printf
Write a notice out to the error handler.
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:97
static void lw_dist2d_distpts_set(DISTPTS *dl, double distance, const POINT2D *p1, const POINT2D *p2)
Definition: measures.c:81
int lw_dist2d_ptarray_ptarray(POINTARRAY *l1, POINTARRAY *l2, DISTPTS *dl)
test each segment of l1 against each segment of l2.
Definition: measures.c:1197
#define DIST_MAX
Definition: measures.h:43
int mode
Definition: measures.h:54
POINTARRAY ** rings
Definition: liblwgeom.h:519
uint32_t nrings
Definition: liblwgeom.h:524

References DIST_MAX, getPoint2d_cp(), lw_dist2d_distpts_set(), lw_dist2d_ptarray_ptarray(), LW_FALSE, LW_OUTSIDE, LW_TRUE, LWDEBUG, lwerror(), DISTPTS::mode, LWPOLY::nrings, ptarray_contains_point(), and LWPOLY::rings.

Referenced by lw_dist2d_distribute_bruteforce().

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