PostGIS  2.5.0dev-r@@SVN_REVISION@@
static CIRC_NODE* lwcollection_calculate_circ_tree ( const LWCOLLECTION lwcol)
static

Definition at line 898 of file lwgeodetic_tree.c.

References circ_nodes_merge(), circ_nodes_sort(), circ_node::geom_type, LWCOLLECTION::geoms, lwalloc(), lwfree(), lwgeom_calculate_circ_tree(), lwgeom_get_type(), and LWCOLLECTION::ngeoms.

Referenced by lwgeom_calculate_circ_tree().

899 {
900  uint32_t i = 0, j = 0;
901  CIRC_NODE** nodes;
902  CIRC_NODE* node;
903 
904  /* One geometry? Done! */
905  if ( lwcol->ngeoms == 1 )
906  return lwgeom_calculate_circ_tree(lwcol->geoms[0]);
907 
908  /* Calculate a tree for each sub-geometry*/
909  nodes = lwalloc(lwcol->ngeoms * sizeof(CIRC_NODE*));
910  for ( i = 0; i < lwcol->ngeoms; i++ )
911  {
912  node = lwgeom_calculate_circ_tree(lwcol->geoms[i]);
913  if ( node )
914  nodes[j++] = node;
915  }
916  /* Put the trees into a spatially correlated order */
917  circ_nodes_sort(nodes, j);
918  /* Merge the trees pairwise up to a parent node and return */
919  node = circ_nodes_merge(nodes, j);
920  /* Don't need the working list any more */
921  lwfree(nodes);
922  node->geom_type = lwgeom_get_type((LWGEOM*)lwcol);
923  return node;
924 }
Note that p1 and p2 are pointers into an independent POINTARRAY, do not free them.
uint32_t geom_type
void lwfree(void *mem)
Definition: lwutil.c:244
uint32_t lwgeom_get_type(const LWGEOM *geom)
Return LWTYPE number.
Definition: lwgeom.c:916
uint32_t ngeoms
Definition: liblwgeom.h:506
CIRC_NODE * lwgeom_calculate_circ_tree(const LWGEOM *lwgeom)
unsigned int uint32_t
Definition: uthash.h:78
LWGEOM ** geoms
Definition: liblwgeom.h:508
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 ...
void * lwalloc(size_t size)
Definition: lwutil.c:229

Here is the call graph for this function:

Here is the caller graph for this function: