3

现在我在文本文件中有一组数据(足够大),假设每行代表一个矩形:

x1,y1,x2,y2

阅读文件后,如何使用http://www.vividsolutions.com/jts/javadoc/index.html批量加载和构建 R-tree 索引?

我检查了它的API,似乎只能insert在批量加载时使用。

这是我的测试代码:

    STRtree rtree = new STRtree();

    rtree.insert(new Envelope(1.0,2.0,1.2,3.4),new Integer(1));
    rtree.insert(new Envelope(4.0,3.2,1.9,4.4),new Integer(2));
    rtree.insert(new Envelope(3.4,3.8,2.2,5.2),new Integer(3));
    rtree.insert(new Envelope(2.1,5.3,5.2,3.6),new Integer(4));
    rtree.insert(new Envelope(4.2,2.2,2.9,10.3),new Integer(5));

    List<Object> list = rtree.query(new Envelope(1.4,5.6,2.0,3.0));

它是构建 R-tree 索引的正确方法(仅使用insert方法)吗?

另一个问题是,假设输入文件足够大,例如GB甚至TB规模,存储HDFSApache Spark.

最后,任何想法将 R-tree 保存到文件中进行存储,并有利于恢复供以后使用?

编辑: 现在我读取HDFS文件来构建索引,这是我的代码:

    val inputDataPath = "hdfs://localhost:9000/user/chenzhongpu/testData.dat"
    val conf = new SparkConf().setAppName("Range Query")

    // notice that: the function names for queries differ accoss systems.
    // here we simply refer intersect.

    val sc = new SparkContext(conf)

    val inputData = sc.textFile(inputDataPath).cache()

    val strtree = new STRtree

    inputData.foreach(line => {val array = line.split(",").map(_.toDouble); strtree.insert(new Envelope(array(0),array(1),array(2),array(3)),
      new Rectangle(array(0),array(1),array(2),array(3)))})

我打电话给insertforeach当我打印 的大小时strtree,是零!

为什么insert里面的方法foreach不起作用?我错过了什么?

4

1 回答 1

0

您正在正确构建所有内容,STRTree 会进行批量加载,直到您查询,之后它不允许您添加或删除节点。如果您想与 apache spark 并行化,您可以制作一个自定义分区器(类似于范围分区器),将您的区域划分为一个大网格,然后为每个分区运行一个 STRTree。在 spark(和标准 java)中,您可以轻松地将 STRTree 保存到文件中,因为它实现了可序列化。

RangePartioner的代码非常复杂,因为它对输入数据进行采样并创建范围的概率分区,如果您已经知道最大界限,您可以通过根据您想要的并行度制作网格来做一些更简单的事情(分区器基本上可以工作,通过找出几何图形是网格的哪一部分并将所有几何图形发送到该分区,分区程序还可能使用 STRTree 来提高速度)

还有一个建议,为简单起见,您可以使用 spark 中的标准 RangePartitioner 仅在 x 或 y 上对范围进行分区,但使用自定义的可能会更好

于 2015-03-18T15:22:47.000 回答