现在我在文本文件中有一组数据(足够大),假设每行代表一个矩形:
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规模,存储HDFS
在Apache 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)))})
我打电话给insert
,foreach
当我打印 的大小时strtree
,是零!
为什么insert
里面的方法foreach
不起作用?我错过了什么?