当缩放地球时,许多节点会重合在一起,这时候可以用 ClusterNode将节点合并显示,ClusterNode可以设置图标、名字和描述;
代码如下,为osgearth_cluster中的代码:
MapNode* mapNode = MapNode::findMapNode(node);
osg::NodeList nodes;
GeoExtent extent(SpatialReference::create("wgs84"), -160.697021484375, 18.208480196039883, -153.951416015625, 22.978623970384913);
//创建10000个节点在规定区域内
makeModels(mapNode, 10000, extent, nodes);
// ClusterNode将重叠的节点聚集到屏幕上的PlaceNode中,以避免视觉混乱并提高性能
ClusterNode* clusterNode = new ClusterNode(mapNode, osgDB::readImageFile("../data/placemark32.png"));
clusterNode->setStyleCallback(new StyleByNameCallback());//设置样式回调(根据第一个节点来显示对应的图标)
clusterNode->setCanClusterCallback(new ClusterByNameCallback());//设置集群回调(相同名字的放一起,不然的话半径内都会合并)
for (unsigned int i = 0; i < nodes.size(); i++)
{
clusterNode->addNode(nodes[i].get());//将节点放入集群节点中,里面的节点会根据距离分离
}
mapNode->addChild(clusterNode);
// _clusterNode->setRadius(value);设置半径
buildControls(container, clusterNode, mapNode);
当ClusterNode中包含的节点距离小于设置的半径时,就会合并成一个节点,当视点距离小于半径时,就会自动分开显示实际节点;