我们有> 25 MB的静态四叉树数据,我们希望将其作为跨平台应用的一部分提供,然后可以通过应用代码进行搜索,以获取靠近用户当前位置的详细信息GPS位置。
我们希望在不将所有数据加载到内存中的情况下快速搜索数据,理想情况下无需重新发明轮子。
我们已经考虑过在SQLite中使用R-Trees提供数据库,这听起来很理想,但显然这些在Android提供的SQLite版本中不可用。运送我们自己的版本的SQLite for android(包括R-Tree结构)听起来很痛苦 - 但我们有兴趣听到其他人'经验与此。
我们可以创建一个文件系统模型,但是我们的数据可能非常大,感觉我们可能会遇到以这种方式误用文件系统的麻烦。
我们希望可能有一些其他文件格式已经设计用于此目的,并且可能存在java / obj-c库来搜索它。有谁能指出我们这样的事情?
另一个明显的解决方案是创建我们自己的文件格式和搜索系统,但这可能会有很多工作。
该应用程序实际上是一个可用于ios和android的cordova / phonegap应用程序,但为每个平台编写本机插件来处理这个问题并不是一个问题。
提前致谢
答案 0 :(得分:2)
忽略问题的偏离主题方面,在Android上使用R-tree数据需要您使用NDK编译SQLite并将其发送给您想要支持的任何架构。
但是,SQLite的R树模块实现为使用“普通”表来存储R树数据的扩展。 处理R-tree最复杂的部分是更新和重新平衡树;与此相比,搜索是微不足道的。 如果您只想搜索静态数据,则可以手动实现它们。
source code有这样说:
R-Tree表的数据库格式
单个虚拟r树表的数据结构存储在三个中 原生SQLite表声明如下。在每种情况下,'%'字符 在表名中,用用户提供的r-tree名称替换 表
CREATE TABLE %_node(nodeno INTEGER PRIMARY KEY, data BLOB) CREATE TABLE %_parent(nodeno INTEGER PRIMARY KEY, parentnode INTEGER) CREATE TABLE %_rowid(rowid INTEGER PRIMARY KEY, nodeno INTEGER)
r-tree结构的每个节点的数据存储在%_node中 表。对于不是r树的根节点的每个节点,有 %_parent表中的一个条目,用于将节点与其父节点相关联。 对于表中的每一行数据,%_rowid中都有一个条目 从条目rowid映射到它的节点的id的表 存储在。
即使r树表是,r树的根节点也始终存在 空。根节点的nodeno始终为1.节点中的所有其他节点 table必须与根节点的大小相同。每个节点的内容 格式如下:
如果节点是根节点(节点1),则前2个字节 节点包含树深度作为big-endian整数。 对于非根节点,前两个字节未使用。
接下来的2个字节包含当前的条目数 存储在节点中。
- 醇>
节点的其余部分包含节点条目。每个条目 由一个8字节整数后跟一个偶数组成 4字节坐标。对于叶节点,整数是rowid 记录。对于内部节点,它是a的节点号 子页面。
对于搜索,您不需要_parent
或_rowid
表。
算法如下所示:
def search(nodeno = 1, root = True, tree_depth = -1, depth = 0):
execute("SELECT data FROM X_node WHERE nodeno = ?", [nodeno])
if root:
tree_depth = first_two_bytes
for entry in data:
if entry.rectangle matches:
if depth == tree_depth:
result += entry.id
else:
search(entry.nodeno, False, tree_depth, depth + 1)