西班牙
斯潘4
嗨伙计们,
我有个挑战给你:我有500K +网格点距离0.5米,需要发现邻居从给定半径内的每个点(比如2米)。
这个NeighborFinder拿可怕的长.这个SpatialRelator有差不多相同的计算时间。
我现在想的是让邻居数学而不是空间上。对于每个点,我可以创建属性minX、minY、maxX和maxY。然后,我只需要测试其他点的坐标是大还是小,对吧?!
最后每一点都应该有他的所有邻居的列表(以及它们的属性)。
有什么想法吗?或者提示我如何加快空间测试器的速度?
干杯,
玛丽亚
……给你@gpt_executer!一个FME工作亚搏在线流,使用R*树索引搜索的强大功能,并结合了超级强大但轻量级的SQL引擎,如SQLite。需要15分钟的时间来输出一个24000000行的OrthPosiTId与ValuePosiTiTd完全平坦的查找表,其中距离在500000点、2米点网格中的距离为<0米。底层的SQL查询本身只需要大约4:00分钟就可以完成,但是FME读取查询结果的速度存在瓶颈。
工作流生亚搏在线成一个500000点的二维网格,并将其发送给SpatiaLite(SQLIte的扩展)以运行一个R*树最近的SQL查询(SpatiaLite使用虚拟表“SpatialIndex”向其内置的几何R*树索引放置一个访问器)。通过插入TempPathNameCreator,*.sqlite文件可以成为临时文件。
…以及搜索R*树的特定SQL。这将在点周围创建一个4x4正方形,并且引擎使用此搜索几何体的最小/最大X,Y来查找空间索引到该位置的点。该组的最终细化是通过检查使用ST_距离返回的较小点组的实际距离(粗略地等同于NeighbourFinder)
谢谢@mark2atsafe。亚搏在线吸引我使用FME的一个原因是它能够在工作区之间无缝地将数据移动到SQLite或spacealite,然后再移动回来,这样两个环境的能力就可以同时被释放。多年来,我一直在使用这两个引擎来粉碎具有非常大数据集的高性能数据连接和查询,尽管解锁性能是为了构建它们的索引并了解如何使用它们的细微差别。
我发现了一些进一步的优化。首先,我15分钟的测量是在功能缓存打开的情况下进行的。我不认为这将是一个巨大的开销,但事实证明是这样的,并且随着它的关闭,源点和邻近点的全部2400万个特征只从Sql Existor返回。6分钟!这几乎与底层SQLite/SpatiaLite引擎执行查询的速度一样快。
另一个增加的好处是知道了其他一些SQLite技巧:SQLite还可以将查询结果预处理到临时RAM表中,然后您可以让SQLExecutor从该表中读取后端已经预处理到RAM中的数据。
示例工作流中的SQLExecutor的SQL还有几行,但它是这样的:亚搏在线
FME_SQL_分隔符;(这告诉FME执行解析字符是“;”)PRAGMA temp_store=2;(这向SQLite引擎提供了一个提示,您希望它将临时表写入RAM。它试图在可能的情况下服从这一点)创建临时表TMPRGIdPositTras结果作为ActhPosithId的选择A.PosiTID,B.PosiTID作为GrimePosits A的RealsixPosid,G点B,其中StHead距离(A.几何,B.Geometry)<=2和A.PointID<>B.PointID和B.rowID IN(从空间索引中选择rowID,其中f_table廑name='GridPoints'和Search廑Frame=ST廑u Expand(A.Geometry,2));(这通过将结果写入临时RAM表在后端对表进行预处理。连接关闭时删除SQLite中的临时表ie。当SQLExecutor完成时)从tmpGridPointResults中选择*;(前面的所有语句返回空SQL的结果,因此,所有SQLExecutor在“数据”的条款时看到所有的语句都串在一起,从已写入临时RAM表行检索记录)
使用这种削减了处理时间,减少运行5分钟〜15%。
优化基本上只是创建和搜索R树索引,并且是空间索引和搜索工作的核心。从本质上讲,你要找到A点(XA,YA),那里是具有ABS(X-XA)<2和ABS(Y-雅)<2的值,如果你正在测试的接近与此相关的任何其他点 2 metres.这是一个矩形的搜索模式(什么R-树做),然后NeigbourFinder可用于细化用于测试该点的那些最终基团是2米的圆形的距离内通过在分组依据模式中使用它,这将工作 way faster than in a Naive, non-Grouped mode, or you can also solve it in SQL using the formula for distance as well.
这可以在SQL相当容易,这导致被处理,并有可能使用InlineQuerier:
从网格点B,网格点A
其中B.rowID IN(从GridPoints.XCoord
和(B.XCoord-A.XCoord)*(B.XCoord-A.XCoord)+(B.YCoord-A.YCoord)*(B.YCoord-A.YCoord)<(2*2)和B.rowID不在(从GridPoints.PointID=A.PointID的网格点中选择rowID)“这可能需要很多单独的解释,但这只是优化SQLite的方法,以使其根据https://www.sqlite.org/optoverview.html
虽然一个字的警告是,我还没有完全测试InlineQuerier的实现的SQLite以及它是否制造和使用创造了用途索引“CREATE INDEX ...”语句。但上面是原始SQL方式空间索引通过进行粗最小外接矩形做一个最终距离测试之前先搜索到组最多接近的几何形状的工作。
如果点是一个真正的网格相等间距,不能你只是假设由行/列属性的邻居?
恩。点I,J将有邻居:
第(i + 2,J-1)第(i + 2,j)的第(i + 2,j + 1)第(i + 1,J-2)(I + 1,J-1)第(i + 1,j)的 (i+1, j+1) (i+1, j+2) (i, j-2) (i, j-1) (i, j+1) (i, j+2) (i-1, j-2) (i-1, j-1) (i-1, j) (i-1, j+1) (i-1, j+2) (i-2, j-1) (i-2, j) (i-2, j+1)
确切的内核将取决于缓冲距离Vs单元间隔,并确定是否在细胞的任何部分是缓冲距离内,或者仅重心事项
?2019安全亚搏在线软件公司|合法的