2017-05-09 41 views
1

我们收集了一些数据,其中我们测量了沿特定物种重叠的卷尺的长度。在某些情况下,多个物种可能会在同一个地点重叠。我需要弄清楚当多个植物重叠在同一地点时,有多少胶带被植物重叠而没有计算相同长度的胶带两次,我需要按照植被类型(例如灌木,树等)进行分组。所以,我正在回答这个问题:“有多少胶带被灌木覆盖?”例如。如何在不包含重叠的情况下对重叠间隔进行求和

例如,假设虚线是卷尺,星号是与磁带重叠的所有不同的灌木。这就是我的数据现在所代表的内容。如果我算所有的灌木长,我会得到一个巨大的数字,比磁带的实际长度更长......

*** ** ********* 
    ****  **  ******* 
---------------------------- 

...但是这是我需要弄清楚,实际任何灌木覆盖的磁带的长度:

***** ** ************** 
---------------------------- 

我希望是有道理的,但这里有一些例子来解释进一步如果需要的话:

示例:假设我遇到了道格杉木树是重叠的卷尺拉伸从4'标记到10'标记和20'标记到25'标记。我也遇到了从7英尺到14英尺重叠磁带的云杉树。我需要知道树种重叠的总长度(这些都是树),所以我需要将Spruce和Doug Fir的这些范围的长度相加。但是,如果我只是将所有的范围正常求和,那么我最终会计算7'到10'的面积(总和= 3')两次而不是一次,其中Spruce和Doug Firs都覆盖了磁带。所以,我需要从最终值中减去3',以便这部分卷尺不会被计数超过一次。所以,我的范围是6',5'和7',总计18'。减去重叠的3'后,总共有15英尺的树木与胶带重叠。

下面的示例表。我已经有了SPECIES,START,END,TYPE和SUM数据。我需要excel来帮助我计算的是表格下方显示的值,它们是考虑到多物种重叠之后的总和。例如,如果灌木X从10'重叠到20',并且灌木Y从13'重叠到25',则总重叠将从10'到25',因此十五英尺重叠。不22英尺重叠,这是它会是什么,如果你计算每个范围的分别。)

SPECIES START(ft) END(ft) TYPE SUM (ft) 
Dogwood 40.3  40.9 Shrub 0.6 
Cedar 52.8  79.5 Tree 26.7 
Dogwood 50.2  55.6 Shrub 5.4 
Rose 53.8  54.4 Shrub 0.6 
Alder 88.2  95.5 Tree 7.3 
Clover 75.8  76.2 Forb 0.4 
Bunch 82.8  90.3 Grass 7.5 
Poa  86.1  95.3 Grass 9.2 
Sedge 99.4  100.9 Grass 1.5 
Bttrcp 74.5  101.3 Forb 26.8 
Elder 105.8  120.3 Shrub 14.5 
Bttrcp 110.3  120.2 Forb 9.9 
Cedar 90.4  99.9 Tree 9.5 



SHRUB SUM TREE SUM FORB SUM GRASS SUM 
    20.5  38.4   35.4   14 

在搞清楚了这一点任何指导,将不胜感激!

+0

从那张桌子你如何确定每个植物的重叠? – jivko

+0

正因为如此,您只需查看并找出重叠的位置即可。例如,看它,我可以看到Bunch草从82.8到90.3,而Poa草从86.1到95.3,所以它们在86.1和90.3之间重叠。 90.3-86.1 = 4.2的重叠。 –

回答

0

这是一些可能工作的伪代码。此外,这只是估计每个类型。要获取整个区域,请重复每种类型:

get_max_area(data): 
    sort(data, START) 
    for i <- 1 to n: 
     for j <- i to n: 
      if data[j][START] < data[i][START]:   // Two segments overlap 
       if data[j][END] < data[i][END]:   // j is fully contained within i 
        ignore(data[j]) 
       else:         // They just overlap 
        merge(data[i], data[i + 1]) 
                 // ELSE: independent segments 

    return sum(data[SUM]) 

忽略意味着该段不再测试。合并意味着使段a(i,j)和b(x,y)成为新的段c(i,y)。这只是一个快速的方法,它需要O(n^2)。必须有更好的方法。

+0

你能帮我整理一下吗?一年前,我会确切地知道该做什么,但看起来我的VBA技能已经消失。 –

+0

我真的没有那么多的VBA经验,对不起。 – mmiranda96