PostGIS 3.0.6dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ lwpoly_calculate_circ_tree()

static CIRC_NODE * lwpoly_calculate_circ_tree ( const LWPOLY lwpoly)
static

Definition at line 938 of file lwgeodetic_tree.c.

939{
940 uint32_t i = 0, j = 0;
941 CIRC_NODE** nodes;
942 CIRC_NODE* node;
943
944 /* One ring? Handle it like a line. */
945 if ( lwpoly->nrings == 1 )
946 {
947 node = circ_tree_new(lwpoly->rings[0]);
948 }
949 else
950 {
951 /* Calculate a tree for each non-trivial ring of the polygon */
952 nodes = lwalloc(lwpoly->nrings * sizeof(CIRC_NODE*));
953 for ( i = 0; i < lwpoly->nrings; i++ )
954 {
955 node = circ_tree_new(lwpoly->rings[i]);
956 if ( node )
957 nodes[j++] = node;
958 }
959 /* Put the trees into a spatially correlated order */
960 circ_nodes_sort(nodes, j);
961 /* Merge the trees pairwise up to a parent node and return */
962 node = circ_nodes_merge(nodes, j);
963 /* Don't need the working list any more */
964 lwfree(nodes);
965 }
966
967 /* Metadata about polygons, we need this to apply P-i-P tests */
968 /* selectively when doing distance calculations */
969 node->geom_type = lwgeom_get_type((LWGEOM*)lwpoly);
970 lwpoly_pt_outside(lwpoly, &(node->pt_outside));
971
972 return node;
973}
void * lwalloc(size_t size)
Definition lwutil.c:227
void lwfree(void *mem)
Definition lwutil.c:242
int lwpoly_pt_outside(const LWPOLY *poly, POINT2D *pt_outside)
CIRC_NODE * circ_tree_new(const POINTARRAY *pa)
Build a tree of nodes from a point array, one node per edge.
static CIRC_NODE * circ_nodes_merge(CIRC_NODE **nodes, int num_nodes)
static void circ_nodes_sort(CIRC_NODE **nodes, int num_nodes)
Given a list of nodes, sort them into a spatially consistent order, then pairwise merge them up into ...
static uint32_t lwgeom_get_type(const LWGEOM *geom)
Return LWTYPE number.
Definition lwinline.h:135
POINTARRAY ** rings
Definition liblwgeom.h:505
uint32_t nrings
Definition liblwgeom.h:510
POINT2D pt_outside
uint32_t geom_type
Note that p1 and p2 are pointers into an independent POINTARRAY, do not free them.

References circ_nodes_merge(), circ_nodes_sort(), circ_tree_new(), sort_node::d, circ_node::geom_type, lwalloc(), lwfree(), lwgeom_get_type(), lwpoly_pt_outside(), sort_node::node, and circ_node::pt_outside.

Referenced by lwgeom_calculate_circ_tree().

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