traverse the quadtree to find the best renking cluster */
| 631 | |
| 632 | /* traverse the quadtree to find the best renking cluster */ |
| 633 | static void findBestCluster(layerObj* layer, msClusterLayerInfo* layerinfo, clusterTreeNode *node) |
| 634 | { |
| 635 | int i; |
| 636 | double rank; |
| 637 | clusterInfo* s = node->shapes; |
| 638 | while (s) |
| 639 | { |
| 640 | if (s->filter < 0 && layer->cluster.filter.string != NULL) |
| 641 | { |
| 642 | InitShapeAttributes(layer, s); |
| 643 | s->filter = msClusterEvaluateFilter(&layer->cluster.filter, &s->shape); |
| 644 | } |
| 645 | |
| 646 | if (s->numsiblings == 0 || s->filter == 0) |
| 647 | { |
| 648 | /* individual or filtered shapes must be removed for sure */ |
| 649 | layerinfo->current = s; |
| 650 | return; |
| 651 | } |
| 652 | |
| 653 | /* calculating the rank */ |
| 654 | rank = (s->x - s->avgx) * (s->x - s->avgx) + (s->y - s->avgy) * (s->y - s->avgy) /*+ s->varx + s->vary*/ + (double)1/ (1 + s->numsiblings); |
| 655 | |
| 656 | if (rank < layerinfo->rank) |
| 657 | { |
| 658 | layerinfo->current = s; |
| 659 | layerinfo->rank = rank; |
| 660 | } |
| 661 | s = s->next; |
| 662 | } |
| 663 | |
| 664 | /* Recurse to subnodes if they exist */ |
| 665 | for (i = 0; i < 4; i++) |
| 666 | { |
| 667 | if (node->subnode[i]) |
| 668 | findBestCluster(layer, layerinfo, node->subnode[i]); |
| 669 | } |
| 670 | } |
| 671 | |
| 672 | /* adding the shape based on the shape bounds (point) */ |
| 673 | static int treeNodeAddShape(msClusterLayerInfo* layerinfo, clusterTreeNode* node, clusterInfo* shape, int depth) |
no test coverage detected