【问题标题】:Use quadtree to locate large number of points使用四叉树定位大量点
【发布时间】:2017-04-26 02:23:02
【问题描述】:

我是这方面的新手,所以希望有经验的人能给点建议。

我有一个形状文件文档,其中包含许多形状。需要处理的数据是大量的点。我尝试为 shapefile 生成四叉树索引,然后定位这些点。我找到了适合它的课程。

http://docs.geotools.org/latest/javadocs/org/geotools/data/shapefile/index/quadtree/QuadTree.html#insert-org.geotools.data.shapefile.index.quadtree.Node-int-com.vividsolutions.jts.geom.Envelope-int-

下面是我的代码

    ShpFiles shpFile = new ShpFiles(shpFileName);
    IndexFile indexShapeFile = new IndexFile(shpFile,true);
    int numShapes = indexShapeFile.getRecordCount();
    com.vividsolutions.jts.geom.Envelope eRoot = new com.vividsolutions.jts.geom.Envelope(-85,85,-180,180);
    QuadTree t1 = new QuadTree(numShapes,eRoot,indexShapeFile);

问题是,接下来我需要怎么做?我需要手动插入所有多边形吗?我怎么能用这棵树搜索点?

【问题讨论】:

    标签: java shapefile quadtree


    【解决方案1】:

    quad-tree 是一类称为bounding volume hierarchies (BVH) 的数据结构的成员。具体来说,四叉树递归地将有限的二维空间细分为 4 个象限。在您的情况下,您似乎必须手动执行此操作,通过创建Node 对象的层次结构并向它们添加形状,或者它会通过insert() 将形状插入树中来为您完成。不幸的是,文档对正确用法不是很清楚。

    您需要注意的一件事是QuadTree 类如何处理由多个四叉树节点相交的形状。乍一看,不清楚这个库是否会为您拆分形状,因此您可能需要提出自己的解决方案。

    【讨论】:

    • 感谢您的回复。这个库的文档对我来说很难理解,我已经尝试阅读了很长时间。创建这些节点后,我不确定如何将形状添加到相应的节点。那么如果我尝试使用insert(int recno, Envelope bounds) 来插入形状,那么从你的角度来看,bounds 的含义是什么?
    • 看起来像一个 Envelope 代表一个形状的边界框:docs.geotools.org/latest/javadocs/org/geotools/geometry/…
    • 知道了。如果我已成功生成索引四叉树,我该如何使用它来定位点?我的意思是,它只有一个函数search(Envelope bounds) ,它可能对查找边界中的形状(?)很有用。找点有用吗?
    • 是的,它对定位点很有用。您定位点的方式与定位形状的方式相同 - 通过提供 Envelope 指定边界。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 2012-10-01
    • 1970-01-01
    • 2021-02-15
    相关资源
    最近更新 更多