先看几个需要空间索引技术的场景:
如何根据给定位置来查询附近1000米的poi?
如何查找给定位置的最近poi?
如何查找给定矩形框内所有link和面数据?
1.用B-tree、B tree或者hash算法对空间数据建索引可以吗?
B-tree是平衡多路查找树,在节点上及其子节点上存放有序的关键字,非叶子节点关键字数等于指向子树指针数减1;查找从根节点开始,叶子节点和非叶子节点都有可能命中。
B-tree树形结构图
B tree的非叶子节点子树指针数和关键字数相等,所有关键字都存储在叶子节点中,非叶子节点不存储数据,只存储关键字,为叶子节点增加链表指针;查找也从根节点开始搜索,到叶子节点才能命中。性能等价于对关键字全集做一次二分查找。更适合做文件索引系统。
B tree树形结构图
hash索引用hash值指针指向关键字位置;
这三种索引都是基于关键字,不能满足二维及多维空间信息索引。
2.根据空间点数据特性,我设计了一种基于二分查找的一种简单快速查找最近poi的算法
对每个poi计算一个到原点的距离,按地区编码adcode和这个原点距离两个字段排序,并计算出每个adcode的开始索引和结束索引,当根据给定位置查找最近poi时,先按adcode查找到这个adcode的开始索引和结束索引,再根据原点距离,查找到其buffer内的记录,然后向两头分别查找,当超出buf