这里有代表街道的两层,其思想是:我们想用存储在另一层中的一些数据(浅蓝色)更新最新的层(红线),但是这些层是在地理位置上类似,根据地图上的位置可能非常接近且稍微远一些,并且如果另一条线相同(codlog x codlog5),则只有一个属性会匹配。
例如:在图像的中间,两层都有一个正方形,但是我该如何在地图上识别蓝色和绿色相同并更新最近的一层呢?
我该怎么做?有帮助的插件或工具吗?
这里有代表街道的两层,其思想是:我们想用存储在另一层中的一些数据(浅蓝色)更新最新的层(红线),但是这些层是在地理位置上类似,根据地图上的位置可能非常接近且稍微远一些,并且如果另一条线相同(codlog x codlog5),则只有一个属性会匹配。
例如:在图像的中间,两层都有一个正方形,但是我该如何在地图上识别蓝色和绿色相同并更新最近的一层呢?
我该怎么做?有帮助的插件或工具吗?
Answers:
这是一个很大的问题,最近我不得不做类似的事情,但是数据集要小得多,所以我可以使用简单的交集并进行一些额外的视觉质量检查,这很好。
但这是一个主意,尽管我没有代码,但这是一个繁重的过程。首先使用完整数据集中的样本进行绝对测试。您可能会在此处找到一些有用的代码。(下面的缩进有点奇怪。):
选取良好的几何图形集(要在其中放置属性的地方)并为其创建一个缓冲区*
遍历每个缓冲区功能:
2a。计算特征的一般方向(max_y-min_y / max_x-min_x等)
2b。使用此单一功能在另一层上进行按位置选择查询
您将拥有不止一个与按位置选择查询相匹配的功能,因此要遍历这些选定功能并计算每个功能的方向
从具有最接近于缓冲区特征的方向的任何一个特征获取属性。
*我将以很小的距离(一个地图单位或类似单位)开始,然后以增加的距离运行此过程,注意不要覆盖您已经转移的任何属性。
**您实际上可能会放弃制作缓冲区功能,而只在其中有缓冲区距离的情况下通过位置查询进行选择。我对QGIS不太熟悉,但是我敢肯定您能够做到这一点。
不可能完全适合您的所有功能,但这只是一个开始,然后归结为制定一个良好的QA / QC策略以检查并完成转移。
编辑考虑更多,这是一个基本示例,如果您从一个很小的缓冲区距离开始并按照我的建议选择具有最佳匹配方向的特征,这将完全破坏系统:
来自错误红线的属性将被采用。为避免这种情况,您可能需要创建某种公差,并且仅当特征的方向(与原始蓝色特征的方向相比)在该公差范围内时,才采用特征的属性。
编辑2糟糕,这些是多边形吗?我想我只是假设它们是灰色背景上的线。如果它们是多边形,我真的不知道这种定向概念是否合适。但是,您可以选择所有相交的要素,并找出重叠最多的要素(运行“联合”类型的工具,然后使用面积最大的多边形...)。
如果您在两层中都有一些唯一的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)