为应用程序提供四叉树GPS数据的最佳选择?

时间:2014-08-11 10:45:42

标签: android ios sqlite cordova gps

我们有> 25 MB的静态四叉树数据,我们希望将其作为跨平台应用的一部分提供,然后可以通过应用代码进行搜索,以获取靠近用户当前位置的详细信息GPS位置。

我们希望在不将所有数据加载到内存中的情况下快速搜索数据,理想情况下无需重新发明轮子。

我们已经考虑过在SQLite中使用R-Trees提供数据库,这听起来很理想,但显然这些在Android提供的SQLite版本中不可用。运送我们自己的版本的SQLite for android(包括R-Tree结构)听起来很痛苦 - 但我们有兴趣听到其他人'经验与此。

我们可以创建一个文件系统模型,但是我们的数据可能非常大,感觉我们可能会遇到以这种方式误用文件系统的麻烦。

我们希望可能有一些其他文件格式已经设计用于此目的,并且可能存在java / obj-c库来搜索它。有谁能指出我们这样的事情?

另一个明显的解决方案是创建我们自己的文件格式和搜索系统,但这可能会有很多工作。

该应用程序实际上是一个可用于ios和android的cordova / phonegap应用程序,但为每个平台编写本机插件来处理这个问题并不是一个问题。

提前致谢

1 个答案:

答案 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. 如果节点是根节点(节点1),则前2个字节    节点包含树深度作为big-endian整数。    对于非根节点,前两个字节未使用。

  2.   
  3. 接下来的2个字节包含当前的条目数    存储在节点中。

  4.   
  5. 节点的其余部分包含节点条目。每个条目    由一个8字节整数后跟一个偶数组成    4字节坐标。对于叶节点,整数是rowid    记录。对于内部节点,它是a的节点号    子页面。

  6.   

对于搜索,您不需要_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)
相关问题