QgisArcgis如何合并相邻要素在没有相同的字段的情况下

Qgis/Arcgis如何合并相邻要素在没有相同的字段的情况下,同时保持要素的独立性。

How to dissolve adjacent features without common fields value using Qgis/Arcgis maintaining independence between features

写在前面:标题之所以标注Qgis/Arcgis是该教程使用的工具Arcgis和Qgis都有,且名字相同。这是我最近遇到的一个问题,google搜了很久,没人写过解决方法,我自己误打误撞弄出来了。不过我感觉我这个比较复杂,如果有更简单的解决方法,欢迎把方法放到评论区。

数据 Data

下图是我所得到的矢量文件,是易康面向对象分类方法导出的树冠分类矢量。查看属性表,所有要素都是ID都是0,且没有其他字段。选择一个要素确实有对应。这片文章的目的就是要将下面那些本来就是一棵树,结果他有两个要素的,将这些给合并了。

错误探索

这种情况直接使用dissolve确实把相邻要素整合了,但是全部要素都合并成了一个要素,查看属性表,只剩一个要素了。这不是我想要的,因为我想要统计树的棵树。

解决方法

这个方法可能看到中间你会看得比较迷惑,但如果你有类似问题,请看完再说话。

定义ID

使用属性表里的计算器,将每个要素的ID定义区分一下,选择更新已有的字段,把ID赋值为行号就行。

效果如下图所示,所有要素都有唯一的ID了。我之前好奇,这时候dissolve会怎么样,会得到正确结果吗。我试过了,不定义dissolve字段得到的结果和之前原文件dissolve一样,整个一个要素。定义了dissolve字段的话,就是根本没变。所以直接dissolve不行

创建缓冲区buffer

很多人好奇为什么要创建缓冲区,我不是个合并相邻要素吗:这个是个辅助作用,后续要利用intersect的特性,在结果弄出来之后,你再创建个负的缓冲区抵消了之前的创建的缓冲区就行了。反正看完你就懂了。我这里创建的缓冲区半径很小0.01m,因为我只希望原来相邻的要素相交,而不想原来不是相邻的要素也相邻或者相交了。结果图就不展示了,因为0.01m半径缓冲区很难看出来。

要素相交

利用Intersection或者Union(我不知道他们两有什么区别),把buffer之后的要素取个相交,相交的两个对象都取选buffer后的对象。我这里用的Qgis可以两个都选同一个layer,如果Arcgis不行可以Duplicate一下。

为什么要这么做?因为相交之后就会把要素与要素之间的关系描述出来,咱们先看看相交之后变成什么样了,下图是缓冲相交后的要素和原要素的对比。还多出一个要素,不是合并吗??咋越整越多了?

放心,文章作者是做出来最后的结果了不会坑人的,其实我现在也讲不清什么原理,先看看属性表。发现原本很多单独的要素现在看到有很多同为为这个ID的要素,比如这个1000,原来按行定义的肯定只有一个,现在有三个。

查看会发现,每个1000的prefixID都不一样,3个ID为1000的要素的prefixID分别为1000(本身)、998、997。让我们看看这三个要素

这就说得通了这三个要素原本就是相邻的,所以intersect只是描述了他们之间的相邻关系。那么我现在大胆猜测,intersect之后应该有3个997,三个998,3个1000,prefixID分别是本身和其他两个,我自己用filter工具验证了一下,果然是这样的。为什么有3个1000?一个是本身,另外两个是与原本997,998的相交区域。那为什么会有9个?3个两两相交不是只有六个(解释一下,intersect只计算两两相交),因为算法导出这个相交区域是分主次的,主对象是ID,次对象是prefixID,也就是说两两相交的相交区域会导出两个要素一个ID为1prefixID为2,一个ID为2prefixID为1(打比方)。那么这有什么用呢?请继续看

Aggregate

Aggregate我理解的就是分类统计的意思,因为在R语言里就是这个意思,我们现在用Qgis的Aggregate工具按ID统计他们的最小值,先看看操作步骤,输入intersect的结果,以ID分组,统计他们prefixID的最小值,也可以是最大值。

我们以刚刚那个例子看看结果。我们发现刚刚ID为1000、998、997的要素,现在全是997了。因为我取的是与他们相交的最小字段,最小就是997啊。那现在不就可以dissolve了吗。对嘛,现在就可以dissolve了,相邻的要素之间有相同的字段了。

dissolve

dissolve按照PrefixID为dissolve字段。

上结果对比图,可以看到绝大部分分裂的树都被合并了,而且不是一个整体要素,可以单选(这里我就不证明了)。

但是还是可以看到没有合并的树,因为这个算法处理不了下图情况,这种情况在取最小值的时候只能是将其中两个要素取到同样的最小值,所以他会先合并ID最小的要素和与他相邻的要素。没关系,你可以多来几次上述流程,基本就OK了

最后一步!!!

别忘了你一开始是buffer过的,所以你最后还要创建一个于一开始值相同但半径为负的buffer以还原要素。但是我只做个树的统计,而且并不是个完美主义者,不做也没关系了。

感谢阅读!👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂👯‍♂

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值