1. mapserver
2. ms的索引机制
ms的索引也是树索引机制,一般的有两种可能:二叉树后者四叉树(由 MAX_SUBNODE 在编译期决定)。
ms的索引树描述:
/* 树根节点 */
typedef struct {
ms_int32 numshapes;
ms_int32 maxdepth;
treeNodeObj *root;
} treeObj;
/* 树子结点,存储实体id-这些实体是块几个子区域的,无法被放入子结点中,和子子结点 */
typedef struct shape_tree_node {
/* area covered by this node */
rectObj rect;
/* list of shapes stored at this node. */
ms_int32 numshapes;
ms_int32 *ids;
int numsubnodes;
struct shape_tree_node *subnode[MAX_SUBNODES];
} treeNodeObj;
treeNodeAddShapeId 函数负责建树(递归,没什么好说的)。其中有一个注意的地方就是结点分裂的时候,使用了 treeSplitBounds 函数。而这个函数在分裂后的两个矩形是有10%的重叠。我推测这种机制可能是为了把实体尽量分到子结点中的一个策略。
3. 值得一提的是,ms的建索引唯一约束就是maxdepth,只是避免了检索次数可能过多的问题。但对于某些结点存储的实体过度的问题无法避免。这是由于期索引定义的规则决定的,其建树过程是静态的。但如果能适当考虑这个问题就好了。
4.索引结构可以保存为qix文件(是不是esri最初创意就不知道了),用shptree也可以做类似的事情,不同的是前者保存id,后者直接保存shp分割结果。