从一组弧线计算覆盖率+重叠的算法


10

我有一个shapefile,其中包含表示卡车将肥料传播到农场的路径的弧线。

假设我知道传播宽度为30m,即卡车可以在车辆的任何一侧传播15m的肥料。

我想生成一组多边形,这些多边形显示:
1)接收肥料的总面积
2)重叠的面积,即两个单独的通道过于靠近的位置,以致农场的某些部分收到了正确的“剂量”的两倍肥料。

天真的方法是仅将coverage多边形创建为圆弧周围的缓冲区。这在散布线彼此不同的特殊情况下有效。但是,可以想象,卡车可能会以不断下降的螺旋线在农场周围行驶,并且简单的缓冲区无法显示出重叠,因为螺旋线的两个通道过于靠近(如果螺旋线是一个弧,我最终会得出结论)没有重叠部分的单个多边形)。

如果相关的话,我正在使用TatukGIS VCL DK,但我实际上是在寻找一种算法而不是特定的解决方案。

到目前为止对讨论的一些澄清:

1)我不能依靠具有任何特定元数据(例如GPS日志或传播速率)的矢量数据。我允许用户选择一个图层并指定展开宽度,然后运行报表。

2)该报告的目的实际上是向用户显示车辆操作员的“技能”水平,其中“技能”表示“以最小的重叠实现了最高的覆盖率”。

3)我在矢量土地上比在光栅土地上更舒适,因此将更喜欢基于矢量的解决方案。

谢谢,

达伦


1
我想知道这是否类似于根据预测的风暴路径预测累积降水的方法。
Kirk Kuykendall

Answers:


3

也许最简单的解决方案是将单个几何图形分割成段,然后缓冲那些单独的段:在螺旋情况下,您将缓冲每个弧,然后将各个弧相交以得出一个计数。注意不要通过仅在段本身的左侧和右侧缓冲段的末端来避免错误的重叠。

另一种方法是在数据上覆盖一个多边形网格,然后在每个网格单元中分别缓冲每个相交的线段。为准确起见,您希望获取待分析的网格单元,对其进行缓冲,然后收集相交的线段,并对其进行缓冲,以在原始单元格窗口中执行分析。

这些选项中的任何一个都应该给您合理的重叠估计,我可以想到一些更准确的方法,但是它们需要了解一些有关数据的知识。


谢谢。我在按照您的第一个建议进行思考-将几何分解成段并缓冲它们。我认为我还需要缓冲线段的末端,以便在拐角处获得圆滑的边缘。考虑到我以直角线开始的情况-如果不缓冲末端,我将最终得到两个重叠的矩形,在角的外部缺少一个正方形(很难表示为文本!)
dbruning

我认为我还需要缓冲线段的末端,以便在拐角处获得圆滑的边缘。我还在考虑将每个段的缓冲区与上一个段的缓冲区相交,然后将每个缓冲区的“新”部分仅累积到一个主缓冲区中。想法是忽略与前一个段的重叠,但取而代之的是较早的段。
dbruning 2011年

2

没有解决方案,但有一些投入:

该问题似乎与地图概括中的线合并检测问题相似。当在弯曲的线上应用大样式(符号自重叠)时会发生这种情况:

在此处输入图片说明

第176至180页(法语...抱歉)提供了一种算法来检测这种自相交的部分。正如scw所建议的,该原理是对每个段使用由一个段加上0、1或2个圆弧组成的单边缓冲区。JTS包含可能有用的单面缓冲区的实现


您为什么要关注检测自己的路口?为什么要提出“单面”缓冲区?似乎都与这个问题无关。
ub

目的是检测卡车在哪里多次传播肥料,即传播区域自相交的地方。
julien 2011年

2

向量解决方案将错过一个潜在的关键变量:时间,以及通过它的扩展速率。拖拉机移动得更快时,每单位面积上散布的肥料更少,而拖拉机移动得慢(减速到转弯并从一圈加速出来)时,则每单位面积上散布的肥料更多。此外,如果拖拉机在转弯时散布物料,则物料将更集中在转弯内侧,而较少集中在外侧。

时间数据将在拖拉机行驶进度的GPS记录中提供。坡度(行进距离除以经过的时间)将估计每个点的速度。另一种方法是,可以(近似地)假设一个场内部的速度恒定,而在一个合理的场边界内部缓冲区内的速度较慢。

栅格表示可以处理这些问题。 栅格化拖拉机的路径。这会将牵引车未越过的所有像元设置为NoData值(或设置为零)。如果牵引车以标准的恒定速度移动,则只需在每个数据单元中放置一个恒定值即可。现在,例如,如果拖拉机以该速度的两倍移动,那么(大概)它的施用率将减半,这可以通过将单元格中的值减半来表示。

通常,放置在任何单元格中的值是每单位面积的施用率。如果拖拉机在以y m / sec 的速度行进时将每秒每秒X Kg的肥料均匀地传播到两侧的15 m ,则它正在传播 x / y Kg / sec / [m / sec] /(2 * 15 m)= x /(30 y)Kg / m ^ 2肥料。因此,x /(30 y)是要放入每个单元格的值。 给定x并根据GPS数据计算y

自相交原则上没有问题。如果牵引车的路径交叉,则在每次重新穿过小区时添加贡献。为此,可能需要一些特殊处理,具体取决于网格的创建方式和GIS软件的功能。

完成该准备工作之后,其余的工作将变得轻松快捷:使用一个半径为15 m的圆形邻域,使用该网格的焦点总和,可以找到每个单元中每单位面积的累积散布量。


1
+1看来,如果您有一个工具可以使内核(代表拖拉机)沿着路径(而不是沿着每一行)移动,则此问题将更易于处理。
柯克·库肯达尔

@Kirk无需使用路径,行或任何其他内核。重要的是要欣赏伴随焦点求和的观点变化:与其将问题视为从点的路径传播物质的问题,不如将其视为计算领域中每个点累积的物质之一的问题。 。显然,使用相同的解决方案是同样的问题。移动内核方法(和建议的缓冲方法)采用第一种观点;焦点和,第二。但是焦点工具可用。移动内核计算不是。
ub

我认为,如果我们知道速度和传播速度,那么您概述的栅格方法将是最好的方法。不幸的是,在这种情况下我们都不知道。我们的最终用户可以选择任何图层作为此覆盖率报告的输入,并且我们不能依赖具有任何特定元数据的几何图形。
dbruning

@dbruning这种方法似乎不需要已知的速度/扩展速率。如果您拥有它们,它只会允许它们(+更精确的现实模型)。但是,还需要一些单元阈值+计数才能从系统中获取所需的指标(总覆盖率;重叠面积),并且在精度方面也要进行权衡。
Dan S.

@dbruning如果您不知道价差率,您将获得一个相对价差率。如果您不知道速度,您仍然会知道(或应该知道)人们如何驾驶拖拉机,并且应该能够得出相对速度的合理估计值。如果您假设速度恒定,传播速度恒定,您仍将获得合理的答案;他们将同意拖拉机路线的直线部分上基于缓冲区的答案;并且它们在弯曲部分可能更真实。
ub

2

我不确定100%是否同意StackExchange协议,因此我将其发布为我的问题的答案。无论如何,这就是我最终使用的答案。

基本算法是:
1.将图层上的任何几何图形分解为不超过扩展宽度1/2的线段。
2.对于每个段:
-通过沿形状向后看来创建“滚动缓冲区”,并缓冲所有先前的段,这些段的累积长度小于展开宽度(缓冲区半径= 1/2展开宽度)
-创建仅是下一个片段的“下一个片段缓冲区”(缓冲区半径= 1/2扩展宽度)
-从“下一个片段缓冲区”中减去“滚动缓冲区”以获得“新缓冲区”
-加入所有“新缓冲区”多边形在一起就可以得到每个形状一个多边形。

从本质上讲,这可使吊具驾驶员进行直角(或更宽)的转弯而不会产生重叠惩罚,但是,如果他们转弯得太厉害以至于它们散布在“旧地面”上,我们就会开始重叠。

蓝色重叠

螺旋状看起来像我想要的那样:

螺旋

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.