四叉树 gis java_四叉树空间索引原理及其实现

本文详细介绍了如何使用C++实现四叉树数据结构,并应用于GIS空间索引,包括创建、插入、搜索和删除节点的函数。通过四叉树,可以高效地进行地理空间对象的组织和查询,提升GIS系统的性能。
摘要由CSDN通过智能技术生成

48304ba5e6f9fe08f3fa1abda7d326ab.png

#include "QuadTree.h"

QuadNode *InitQuadNode()

{

QuadNode *node = new QuadNode;

node->Box.maxX = 0;

node->Box.maxY = 0;

node->Box.minX = 0;

node->Box.minY = 0;

for (int i = 0; i < 4; i ++)

{

node->children[i] = NULL;

}

node->nChildCount = 0;

node->nShpCount = 0;

node->pShapeObj = NULL;

return node;

}

void CreateQuadTree(int depth,GeoLayer *poLayer,QuadTree* pQuadTree)

{

pQuadTree->depth = depth;

GeoEnvelope env; //整个图层的MBR

poLayer->GetExtent(&env);

MapRect rect;

rect.minX = env.MinX;

rect.minY = env.MinY;

rect.maxX = env.MaxX;

rect.maxY = env.MaxY;

//创建各个分支

CreateQuadBranch(depth,rect,&(pQuadTree->root));

int nCount = poLayer->GetFeatureCount();

GeoFeature **pFeatureClass = new GeoFeature*[nCount];

for (int i = 0; i < poLayer->GetFeatureCount(); i ++)

{

pFeatureClass[i] = poLayer->GetFeature(i);

}

//插入各个要素

GeoEnvelope envObj; //空间对象的MBR

//#pragma omp parallel for

for (int i = 0; i < nCount; i ++)

{

pFeatureClass[i]->GetGeometry()->getEnvelope(&envObj);

rect.minX = envObj.MinX;

rect.minY = envObj.MinY;

rect.maxX = envObj.MaxX;

rect.maxY = envObj.MaxY;

InsertQuad(i,rect,pQuadTree->root);

}

//DelFalseNode(pQuadTree->root);

}

void CreateQuadBranch(int depth,MapRect &rect,QuadNode** node)

{

if (depth != 0)

{

*node = InitQuadNode(); //创建树根

QuadNode *pNode = *node;

pNode->Box = rect;

pNode->nChildCount = 4;

MapRect boxs[4];

pNode->Box.Split(boxs,boxs+1,boxs+2,boxs+3);

for (int i = 0; i < 4; i ++)

{

//创建四个节点并插入相应的MBR

pNode->children[i] = InitQuadNode();

pNode->children[i]->Box = boxs[i];

CreateQuadBranch(depth-1,boxs[i],&(pNode->children[i]));

}

}

}

void BuildQuadTree(GeoLayer *poLayer,QuadTree* pQuadTree)

{

assert(poLayer);

GeoEnvelope env; //整个图层的MBR

poLayer->GetExtent(&env);

pQuadTree->root = InitQuadNode();

QuadNode* rootNode = pQuadTree->root;

rootNode->Box.minX = env.MinX;

rootNode->Box.minY = env.MinY;

rootNode->Box.maxX = env.MaxX;

rootNode->Box.maxY = env.MaxY;

//设置树的深度( 根据等比数列的求和公式)

//pQuadTree->depth = log(poLayer->GetFeatureCount()*3/8.0+1)/log(4.0);

int nCount = poLayer->GetFeatureCount();

MapRect rect;

GeoEnvelope envObj; //空间对象的MBR

for (int i = 0; i < nCount; i ++)

{

poLayer->GetFeature(i)->GetGeometry()->getEnvelope(&envObj);

rect.minX = envObj.MinX;

rect.minY = envObj.MinY;

rect.maxX = envObj.MaxX;

rect.maxY = envObj.MaxY;

InsertQuad2(i,rect,rootNode);

}

DelFalseNode(pQuadTree->root);

}

void SearchQuadTree(QuadNode* node,MapRect &queryRect,vector& ItemSearched)

{

assert(node);

//int coreNum = omp_get_num_procs();

//vector * pResArr = new vector[coreNum];

if (NULL != node)</

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值