使用QGIS将点触线属性返回到线层?


12

我正在使用QGIS 2.14.4-Essen。我有两层:

  • points.shp包含带有YEAR列的点
  • lines.shp包含精确连接点与point.shp的线

我想将point.shp的YEAR属性返回到lines.shp。每条线都是一个单独的线段,两端各有一个点(请参见下图)。我想得到的是从第一点开始的YEAR和从第二点开始的YEAR,回到每条线属性。

例如:第1行触及YEAR = 2010的第一点和YEAR = 2011的第二点。我想将“ 2010-2011”之类的内容恢复到第1行属性中。结果应如下所示:

id  | points
----+-----------------
1   | 2010-2011
2   | 2011-2012
3   | 2012-2016

在此处输入图片说明

有没有一种使用QGIS来实现这一目标的方法?

Answers:


9

尽管@radouxju答案是有效的,但我会更详细地说明。

  1. 您需要确保折线要素正好在点位置上方分割。
  2. 使用Join attribute by location。在点位置选择分割线要素作为目标图层-在我的情况下,我将其命名为“爆炸”。
  3. 在摘要部分中,选择“获取相交特征的摘要”。在这里,而不是两次运行该工具;一个代表Min,另一个代表Max,您可以运行一次并选择Min和Max。

在此处输入图片说明

  1. 输出文件将具有以下属性:

在此处输入图片说明

  1. 将名称为“ Year”的字符串类型的新字段添加到步骤4中的新shapefile中。
  2. 使用字段计算器,然后去更新现有字段。选择“年份”并输入以下表达式:

    to_string(“ MINYEAR2”)+'-'+ to_string(“ MAXYEAR2”)

  3. 最终的输出属性将如下所示:

在此处输入图片说明

  1. 最终输出将如下所示:

在此处输入图片说明


这是测试数据后的输出:

在此处输入图片说明

左侧的表是创建新的整数类型的字段后的点数据,右侧的表是使用上述步骤2将线与点数据连接在一起之后的点数据。然后,我使用步骤5-6创建最终数据。

更新资料

我试图使用表达式to_int()将YEAR字段从字符串转换为整数,并且可以正常工作。因此,您无需手动进行操作。但是,字段类型应为Integernot 类型Integer64。确保字段长度最大为9。如果选择的字段长度为10,它将被转换为Interger64,并且不能与一起使用Interger64。然后,您可以按照步骤2-6进行操作

这是使用表达式to_int()之后的最终输出:

在此处输入图片说明

在左侧的上述属性表中,YEAR是字符串类型,而YEAR2是使用表达式to_int()转换的整数类型。在执行步骤2-6之后,您可以在右侧的属性表中看到MINYEAR2和MAXYEAR2,然后再次转换为字符串以将字段YEAR中的所有内容连接在一起。


非常感谢!那正是我几次做的。我猜想折线要素正好在点位置上方分割,因为我使用Points2One插件从点图层创建了线。您是否可以尝试使用以下数据子集:drive.google.com/file/d/0B7ZWEFkkfYgheG92Q29sa0I3LW8/view?再次感谢!
wiltomap

属性表中的字段YEAR是字符串类型。您需要添加一个整数类型的新字段并手动输入年份。创建整数类型字段并保存编辑后,请删除旧的字符串字段。然后,按照上面的详细过程。
ahmadhanb '16

我尝试使用表达式to_int()将字段YEAR从字符串转换为整数,但是也没有用。当我手动输入年份时,它按预期工作。
ahmadhanb '16

明确的解释@ahmadhanb
至孝

谢谢@ahmadhanb!事实是我上面共享的数据是一个子集。我有数千条线和点,因此手动输入年份将是很多工作!这是一个错误吗?
wiltomap

5

当将连接点连接到线时,您将具有多个关系。使用“按位置连接属性”,您将可以请求给定的汇总方法。对于您的情况,请执行两次:一次最小化,一次最大化。之后,您可以将两个字段串联到一个新字段中,最终得到所需的内容。

在此处输入图片说明

现场计算器:

tostring(minYEAR) + '-' + tostring(maxYEAR)

此方法返回另一列COUNT,该列的名称2为每行,并包含值。最小值和最大值选项都将返回这些信息。我选择了线层作为目标层,选择了点层作为连接层,对吗?
wiltomap,2016年

您是年份字段数字还是文本?
radouxju

YEAR字段是整数。我尝试使用创建一个新列,to_string("YEAR")但结果完全相同...
wiltomap

我进行了一次快速测试以确保(QGIS 2.8.3)正常运行。如果计数为2,则表示每个细分市场确实有2分,这是正确的。但是对于我来说,我在空间连接创建的新线向量中具有属性值MINYEAR MAXYEAR。我不明白为什么在您的情况下它不起作用。您可以尝试另一个文件吗?
radouxju

4

假设拓扑是完美的,则使用表达式创建字段“ WKT”

geom_to_wkt( $geometry) 

在您的点图层中,可以使用以下表达式:

min( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))||'-'|| max( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))

在管道层的字段计算器中,创建一个文本字符串。

  • attribute(feature,attribute_name)从要素中返回指定属性的值,此处是
    获得的点要素的年份。
  • get_feature(layer,attribute,value)返回与给定属性值匹配的图层的第一个特征。在这里,我们检查是否可以找到与
    线的起点和终点相同的点(采用WKT格式)。
  • start_point(geometry)从几何返回第一个节点。这是您的直线的第一个顶点。
  • end_point(geometry)返回几何中的最后一个节点。这是行的最后一个顶点。
  • geom_to_wkt(geometry)返回几何的知名文本(WKT)表示形式。 在此处输入图片说明

您甚至可以将其更新为:

CASE
WHEN attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year') = attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year')
THEN attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year')
ELSE min( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))||'-'|| max( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))
END

如果仅显示同一年份的两个点,则仅显示一年(获取200X而不是200X-200X)。

此方法的主要优点是,如果您的数据在点中发生变化,则只需一个字段计算器就可以非常快速地更新它。
您甚至可以在创建新行时将此规则添加为自动字段
干杯,

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.