将属性从一个多边形图层复制到另一多边形图层?


11

我有一个问题,我似乎无法理解。我有两个多边形层:

  • 多边形A-是具有相同字段的多边形B的子集,并且具有与多边形B相同的多边形
  • 多边形B-具有要在多边形A中显示的属性数据

如何才能做到这一点?我尝试使用QGIS工具“按位置连接属性”,但是由于某些多边形在其他多边形内,因此它倾向于链接到找到的第一个相交点(外部多边形)。


创建多边形的质心(点),并加入属性B和导出到新的文件保存从A属性
Mapperz

3
@Mapperz这是一种危险的方法,因为即使通常会生成看起来很不错的答案,它也会产生错误。如果多边形彼此重叠,则所有投注均无效。即使没有重叠,多边形的质心也可能位于不同的(不重叠)多边形内。通常,只有当A中的所有多边形均不重叠且不凸时,才能确保正确性。
ub

+1 @ Diego-您的问题引发了非常有趣的讨论/辩论;那个很有趣!
达诺(Dano)

Answers:


9

@Dano正确地提出了一些最好在完整答复中解决的问题。

@Celenius已经指出,一个困难是B和A之间的连接(在任一方向上)都将复制所有字段。纠正这一点可能会很麻烦。我曾在评论中建议,显而易见的简便方法(导出到电子表格)会引发数据完整性问题。 Celenius的建议已经解决的另一个困难是,当没有任何属性组合可以同时用作A和B的键时解决此问题,因为这排除了数据库联接的可能性。空间连接解决了这个问题。

那么,什么是好的解决方案? 一种方法是使用A来标识包含所需数据的B的相应记录。根据有关多边形配置的假设(它们是否重叠,某些对象是否可以包含其他对象等),这可以通过多种方式来实现:使用一层在另一层中选择对象,或通过联接。这里的要点是,我们在此阶段要做的只是选择与A相对应的B子集。

完成选择后,导出选择并替换A. Done

该解决方案假定B中的所有字段都打算替换其A中的对应字段。如果不是,则确实有必要执行B(源)与A(目的地)的1-1连接。 基于标识符的联接是最好的,但是如果没有id,则对多边形标识(Celenius)进行联接可以很好地工作,并且A和B中相应的多边形形状不可能会有所不同,但是会略有不同。(这是一个微妙的问题,也是潜在的隐患的原因,因为如果GIS是“捕捉”或“维护拓扑”,则先前在B中对不对应于A的多边形进行的编辑仍可以不可见地修改B中的其他多边形。否则会在本地编辑期间自动进行全局更改。)

此时,每个字段都有两个副本:如果[Foo]是A和B的公共字段,则联接包含A. [Foo]和B. [Foo]。 使用字段计算,将B. [Foo]复制到A. [Foo]。对所有必填字段重复此操作。完成此操作后,删除联接。

尽管在涉及多个领域时此过程可能会有些麻烦,但它的优点包括

  • 编写脚本非常简单快捷。
  • 通过编写脚本,可以留下审核跟踪,记录对数据进行的处理。这对于保护数据完整性至关重要。
  • 它可以防止某些批发错误,例如在连接后保留错误的字段(从而保留该字段的旧数据,而不是新数据)或删除关键字段。
  • 它利用了数据库管理系统提供的内置防御,例如数据类型实施和业务规则实施,以防止和识别错误并维护数据库中所有表和层之间的一致性。

此建议涉及的一些指导原则

  1. 使用数据库管理系统来处理数据,而不要使用非设计或不适合此任务的软件。
  2. 当操作并非绝对需要时,请避免更改数据库结构(例如删除或添加字段)。
  3. 使用该软件的自动化功能可以简化工作,对其进行记录和使操作可重复。

一个人可能会反对,在许多情况下,有更快,更轻松的方法来达到相同的结果。是的,可以,而且它们可以有效并且通常在谨慎执行的情况下可以正常工作。但是,冒着数据风险的解决方案很难推荐和捍卫作为通用答案。它们最适合一次性使用小型数据集的情况,在这种情况下,数据损坏应迅速变得显而易见,并且此类错误的后果无关紧要。


+1 @ whuber-很显然,您尝试权衡了所有此处的变量;一个深思熟虑的答案。请查看原始答案的补充内容,因为我将在注释框中用完空间。
达诺

1
对于想知道“ Celenius”发生了什么的人们,在该线程中提到了多个地方:现在称为@djq,他/她的答案在这里。向
后退

5

在Arcmap中,您可以在空间上将多边形B连接到多边形A;这将与属性相关。由于字段名称相同,它将创建名称的一些新组合。


这就是我要说的。在我看来,这个简短的答案是正确的。
西蒙

4

将Shapefile“ B”的表导出到Excel,并删除多余的列以及包含不需要信息的任何列。确保保留共享标识符列,然后将其保存到适当的文件夹中。进入ArcMap,添加表,然后在Shapefile“ A”上单击鼠标右键并进行表连接。该链接应引导您观看有关如何执行此操作的视频。


@ whuber-整个方法都是正确的,并且可以确保数据的完整性。我唯一可以反驳这个答案的是,某些情况/项目无法为我们提供方法上的方法性时间或预算。

一个真实的例子:

一家初级矿业公司正坐在一个主要矿体上,以其“证明”资源的能力注资数亿美元。通过对出版物和地质图/数据进行桌面审查,可以得出具有针对性且成本很高的钻探计划。当测定从第一次运行返回时,这些值将通过表格连接标记到它们各自的点位置,并以Excel格式抽回,在此格式中,数据被精心准备导入到DataMine中(用于3D矿体插值)。

以我的经验,项目地质学家要求将数据准备在Excel中,并遵循字母的所有格式规则/惯例(无空格,无特殊字符等),并且DataMine导入文件以.csv格式交付(无论如何,然后返回)。这将导致针对定向钻探的更多投资,并且我们将多次(特别是在某些情况下)重新审查该过程。所有这些通常都发生在非常紧迫和关键的时间表上。

我们每个人都有自己的故事,以及我们自己的一系列经验,这些经验已经融入到我们做事的方法中。话虽如此,根据我的经验,Excel是绝对必要的,并且是工作流程中的重要工具。这就是我所知道的。在准备此数据时,我们采取了所有QA / QC预防措施。你们会回避Excel的地方,我别无选择,只能使用它。


(-1)使用Excel进行联接不仅比用GIS或RDBMS完成联接更困难,而且还会引发严重的错误。
ub

8
Excel非常简单,可以正常工作,因此,它可能导致比以前生产的任何软件都要多的未被发现的批发错误。它违反了DBMS的基本原理,该原理是为防止Excel太容易提交而导致的错误而开发的,例如(1)对某些列进行排序,而对其他列不进行排序;(2)更改数据类型的印刷错误;(3)误击击键破坏了数据;(4)意外删除行或列;(5)隐式转换数据,例如文本到日期;(6)隐藏的数据截断;(7)数值的隐藏舍入;还有很多。
ub

2
这个答案和由此产生的评论很好地说明了“错误”答案如何调用良好结果,从而揭示了否则可能无法发现的信息。请不要觉得您应该删除它以避免“受到打击”。
马特·威尔基,

3
...为了弥补这一点,一个伟大的问题是要问为什么使用Excel处理数据会导致非常严重的问题。以及如何安全使用它。
马特·威尔基2011年

1
(+1)对于经过深思熟虑和精心描述的编辑。@matt查看stats.stackexchange.com上有关在Excel中处理大型数据集的一种好方法的讨论Excel作为统计工作台
ub

1

在1990年代后期,我们收到了所有水域和水道的大规模更新,涵盖了约55个NTS地图纸和成千上万的特征。我们需要保留旧水文学的增值属性(湖泊名称,表面标高等)并替换几何图形。新旧几何之间的距离足够近,我们可以保证每个多边形的质心仍会受到新多边形边界的限制-这是很重要的一点,如果没有这种基本确定性,以下方法并不是一个好主意。

在这种特定情况下,解决方案是将几何带到属性,而不是将属性带到几何。因此,从概念上讲:

  1. 从* Layer_with_attributes *中删除多边形,但保留表格记录,
  2. 从* Layer_with_polys *复制几何并将其粘贴到* Layer_with_attributes *
  3. 合并并保存。

有关的更多扩展说明和配方,请参见此处。我不确定在现代Arcgis或Qgis中甚至可以在不同时删除属性记录的情况下删除几何图形,但是嘿,以防万一,这就是想法。


1

我不确定,但是也许某些DBMS对SQL(?)中的Shape字段执行相等操作。在我看来,如果两个几何相同,则SQL =运算符应返回true(WHERE A.Shape = B.Shape)。

如果对于正在使用的数据库而言这是正确的,则应该能够使用与非空间连接相同的语法进行空间连接。


看起来ST_Equals方法(OGC标准)可以用于此目的。


0

像往常一样,胡布是正确的。您需要仔细考虑您的过程。特别是如果这些是大型数据集,并且此操作将执行多次或数据对于任务至关重要。

考虑您的数据和职责:

你做了什么?

你在做什么?

您打算做什么?

总是问:为什么?


现在,一个简单的答案直接针对所提出的问题。请记住,总是至少有5种方法来做事情,但通常只有一种最佳方法。

假设完整集具有您想要包含在子集中的每个属性,并且该子集除了已过时的信息外,没有其他任何内容。

猜测子集拓扑与全套匹配(包括原点/投影和XY容差)。

1)在选中“内部”复选框的情况下使用“特征指向”,并从子集中创建一个点要素类或shapefile。

2)使用“按空间连接选择”以基于新创建的Point要素类或shapefile查找全套中与子集对应的所有多边形。

3)从全集导出选区,这可以是您的新子集。


0

当然,如果多边形A是多边形B的子集,最简单的方法是遍历多边形A,使用多边形A中的ID(如果A是子集或B,则使用B中的ID)在其中搜索行数据。多边形B,然后更新多边形A中的行。

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.