栅格数据的四叉树

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法难点-通过行列值获取morton值
int GetMortonIndex(int rowindex, int columnindex, int level) {
int i,morton=0; for(i = 0; i < level; i++) { } return morton;
morton |= ( ((rowindex >> i) & 1) << (i * 2) ); morton |= ( ((columnindex >> i) & 1) << ( (i * 2) + 1) );
从底向上合并节点
从底层开始,以每层最后一个节点起,对每四
个非中间节点,判断其象元值是否相等 相等则在上一层相对位置保存其像元值,不相 等,则保存像元值为-1,NextIndex为从底层 最后一个开始的有效节点的个数。
获取非象元节点的索引
从最上层开始,对非叶子节点象元,其象元索
引为从上层开始到此节点所对应的下层节点前 所有有效节点的个数。 缺点,每次遍历有效节点,效率极低。 改进:合并象元时已存储此节点所对应的下层 节点到最后的有效节点个数,用总结点减去即 可得到。
treelevel = i; break;
}
} treelevel++;
maxRowsColu=4
将0011左移后得到0001后 和11111…比较
结果是1,则层数=i=1,之 后再将得到的层数加1,得 到了最终的层数2。 3X4 之所以要先减1,循环结束后再加1是因为: 当既不减一下方也不加一时 若栅格为2X2时,会是1层,栅格为3X3时,也会是 1层,但实际应该有2层。 但若只是在循环外加一,则当栅格为2X2时,会使 层数为2。
算法重点
通过morton获取象元的行列值,当行列值不在
原来的栅格图层范围内的时候,需要自定义一 个栅格值,而没有办法从原栅格中得到。
算法难点-获取四叉树层数
for (i = 0; i < 30; i++) {
if ((((maxRowsColu-1) >> i) & 0x7fffffff) == 1) {
A1
A2
A3
A4
B1
B2
B3
B4
C1
C2
C3
C4
节点号 索引值
B1 A1→C1
B2 -1 Sum-B2的 NextIndex (C4→B2)
改进后的索引计算 Sum-B1的 NextIndex 方法 (C4→B1)
将完全四叉树中的有效节点存储 到Raster_Qtree中去
根据有效节点个数分配内存 从四叉树顶层开始,顺序存储每层有效节点
}
*rowindex |= ( ((morton >> (i * 2)) & 1) << i ); *columnindex |= ( ((morton >> ( (i * 2) + 1)) & 1) << i );
}
谢谢
栅格数据的四 叉树编码
王成龙 邱陶 李亚飞 杜欣威 张 军 曹恩溯 吕佳琪
设计思路
构建完全四叉树 从底向上合并节点
获取非象元节点的索引
将完全四叉树中的有效节点存储到
Raster_Qtree中去
构建完全四叉树
栅格数据的四叉树分层,各层的节点数分别应
为4、16、64、256…… 根据各层的节点数为各层分配内存 最底层的节点数正好为填充后栅格总数,根据 Morton码获取象元的行列值,从Morton 为0 开始填充四叉树底层。 构建的同时可以获取有效象元的总个数
}
算法难点-通过morton获取行列值
void GetRowColumnIndex(int morton, int leபைடு நூலகம்el, int* rowindex,int* columnindex) {
int i; *rowindex=*columnindex=0; for(i = 0; i < level; i++) {
相关文档
最新文档