比较相似的线条并更新图层


16

这里有代表街道的两层,其思想是:我们想用存储在另一层中的一些数据(浅蓝色)更新最新的层(红线),但是这些层是在地理位置上类似,根据地图上的位置可能非常接近且稍微远一些,并且如果另一条线相同(codlog x codlog5),则只有一个属性会匹配。

Qgis层。

例如:在图像的中间,两层都有一个正方形,但是我该如何在地图上识别蓝色和绿色相同并更新最近的一层呢?

我该怎么做?有帮助的插件或工具吗?


您要使用蓝色图层的属性还是蓝色图层的其他要素更新红色图层?
dmh126

属性。情况:红色层包含列(a,b,c,d),蓝色层包含列(d,e,f)。我想在红色层中添加另一层中的列(e,f)及其匹配的结果。
Jhonatan Oliveira 2015年

有一些文档,这里的糅合在一起的插件。不知道开发是否已经完成。
Barbarossa 2015年

1
您是否尝试过Jump?
radouxju

但是,蓝线的“ d”列和红色的“ d”列是唯一的公共ID?它们包含什么?
塞尔吉奥2015年

Answers:


6

这是一个很大的问题,最近我不得不做类似的事情,但是数据集要小得多,所以我可以使用简单的交集并进行一些额外的视觉质量检查,这很好。

但这是一个主意,尽管我没有代码,但这是一个繁重的过程。首先使用完整数据集中的样本进行绝对测试。您可能会在此处找到一些有用的代码。(下面的缩进有点奇怪。):

  1. 选取良好的几何图形集(要在其中放置属性的地方)并为其创建一个缓冲区*

  2. 遍历每个缓冲区功能:

    2a。计算特征的一般方向(max_y-min_y / max_x-min_x等)

    2b。使用此单一功能在另一层上进行按位置选择查询

    1. 您将拥有不止一个与按位置选择查询相匹配的功能,因此要遍历这些选定功能并计算每个功能的方向

    2. 从具有最接近于缓冲区特征的方向的任何一个特征获取属性。

*我将以很小的距离(一个地图单位或类似单位)开始,然后以增加的距离运行此过程,注意不要覆盖您已经转移的任何属性。

**您实际上可能会放弃制作缓冲区功能,而只在其中有缓冲区距离的情况下通过位置查询进行选择。我对QGIS不太熟悉,但是我敢肯定您能够做到这一点。

不可能完全适合您的所有功能,但这只是一个开始,然后归结为制定一个良好的QA / QC策略以检查并完成转移。

编辑考虑更多,这是一个基本示例,如果您从一个很小的缓冲区距离开始并按照我的建议选择具有最佳匹配方向的特征,这将完全破坏系统:

在此处输入图片说明

来自错误红线的属性将被采用。为避免这种情况,您可能需要创建某种公差,并且仅当特征的方向(与原始蓝色特征的方向相比)在该公差范围内时,才采用特征的属性。

编辑2糟糕,这些是多边形吗?我想我只是假设它们是灰色背景上的线。如果它们是多边形,我真的不知道这种定向概念是否合适。但是,您可以选择所有相交的要素,并找出重叠最多的要素(运行“联合”类型的工具,然后使用面积最大的多边形...)。


这种逻辑是合理的。我在C#/ ArcObjects中使用了类似的方法将属性从具有属性的不准确数据集中复制到没有属性的准确数据集中……正确率95%。在狭窄的区域中必须进行手动检查/修复,但是肯定比手动完成更快。
Michael Stimson

2

如果要将红色图层的某些属性添加到蓝色图层,并且两个图层中的一个属性很常见,则必须使用“ 添加矢量连接”

我已经在这里写过这件事了

  1. 右键单击“图层面板”上的红色shapefile图层,然后选择“ 属性”
  2. 然后转到“ 加入”选项卡。
  3. 按下+按钮,它将创建新的联接。
  4. 连接层是您的红色shapefile层。Join字段是在两个字段中都有共同值的字段。目标字段是您要从蓝色图层加入的字段。
  5. 之后,您将在shapefiles表中获得一个新属性。

而已。

这里有一个带有截图的例子。


1

我非常喜欢@ dmh126的答案,因为他的方法可以很轻松地更新red_line层。

只需添加一个替代方法,就可以使用“ 处理工具箱”中的“ 连接属性”表工具,并选择具有公共字段的图层。请注意,此方法将创建一个新的shapefile,而不是更新现有的shapefile:

联接属性表


0

如果您在两层中都有一些唯一的ID,可用来轻松地将值从旧层连接到新层,那简直是小菜一碟。但这似乎不是这种情况。

如果没有,那将是非常困难的问题。我不知道为什么user30184的建议使用OpenJUMP和插件http://www.vividsolutions.com/products.asp?catg=spaapp&code=roadmatcher的评论没有发布,而是作为答案,因为在这种情况下,这听起来完全合法。

否则,我认为没有一些编码就无法做到这一点。使用QGIS,您可以整齐使用,并且在组合缓冲和相交时,应该能够进行一些重要的自动检查。

一种方法可能是比较一些比较大的红线和蓝线缓冲区,并获得匹配的属性和比率。用伪代码:

for r_line in red_lines:
  r_line_buf = r_line.buffer()
  intersecting_b_lines = []
  for b_line in blue_lines:
    if r_line_buf.intersects(b_line):
      intersect_length = calculateIntersectionLength(r_line_buf,b_line)
      b_line_values = getAttributes(b_line)
      intersecting_b_lines.append((b_line_values,intersect_length))
  b_line_best_fit = findLongestLineWithinIntersected(intersecting_b_lines)
  r_line_length = r_line.length
  b_vs_r_line_ratio = compareLength(r_line_length,b_line_best_fit)
  saveToNewColumns(r_line, b_line_best_fit.Atribute1, b_line_best_fit.Atribute2..., b_vs_r_line_ratio)
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.