将点ID分配给折线的相应开始和结束属性?


9

我有两个shapefile,点和折线。我正在尝试用点数据ID(systemID)填充我的折线图层,这些点从线条开始到结束为止。例如。创建两列(从和到)。线路已经分配了流向。我正在使用ArcHydro工具,但Arcpy也很好。

在ArcHydro中,我尝试使用“属性工具”>“为线生成从/到节点”,但是它创建的“从”和“从”值并非来自我的点数据。我的另一种选择是对顶点使用特征,然后将结果连接到我的点数据表中以获得systemID。但是然后我也必须更新折线层。我敢肯定,有一种更简单的方法可以做到这一点。

注意:并非所有线在顶点处都具有点,因此空白值适合它们。


因此,您的点有一个需要在FNode中输入的字段“ systemID”,在折线中的TNode字段...对吗?
Michael Stimson 2014年

在这里某处存在这样的问题,其答案基本上是将线作为起始要素和终点作为单独的要素类,将两个(分别)与您的点数据相交以获得id,然后使用该线将它们空间连接回线ID并分配给正确的开始或结束字段(可能是在其中计算的字段)。我似乎现在找不到。找到它,而四处寻找这一个
克里斯W

在这里是:gis.stackexchange.com/questions/85082这是点的要素点,而不是线或点的要素。您在问题末尾提到的内容差不多。
克里斯W

@ChrisW,我真的很喜欢FelixIP对此的回答。只有两个属性联接。
Michael Stimson 2014年

Answers:


12

有时最好不要使用开箱即用的解决方案。这就是为什么我建议

  1. 在节点层中填充X和Y字段,将它们转换为整数,例如cm。创建字符串字段并通过串联整数的字符串表示形式填充它。
  2. 在链接表中为形状的第一个点做类似的事情。
  3. 使用最新创建的字段将节点表联接到链接,并将nodeID传输到FROM字段。

转到2,但使用最后一点分配TO节点ID


喜欢它!字段为节点(str(round)计算类似str(round(!Shape!.firstPoint.X,3))+“,” + str(round(!Shape!.firstPoint.Y,3))(Python解析器)(!Shape!.lastPoint.X,3))+“,” + str(round(!Shape!.lastPoint.Y,3))到节点,然后类似于该点(作为文本)然后加入...费利克斯无痛苦的绝佳空间连接方式!四舍五入为地理数据的更高有效数字(例如7或8)。
Michael Stimson 2014年

在脚本环境中也非常快,其中字典当然代替了慢速表连接
FelixIP 2014年

如果以米为单位,则为Int(X * 100)。或者使用Michael的代码
FelixIP,2014年

绝对比我上面提到的问题中的方法简单。步骤更少,工具更少,并且没有许可证级别限制。将空间连接变成常规属性连接的有趣想法。
克里斯W

1

几个月前,我做了同样的事情。我使用了arcpy,但脚本太长了,无法在此处发布,因此我将向您概述我的工作。

  1. 我使用空间连接来检测特定线要素内的点/节点。

  2. 因为空间连接未考虑流动方向,所以我使用arcpy来确定哪个是起点,哪个是终点。通过使用arcpy describe函数提取线要素的起点/终点的坐标信息并将它们与连接点的坐标值进行比较,我能够做到这一点。

  3. 最后,一旦确定了哪个to / from点,便使用setValue函数在原始折线数据集中填充to / from字段。

显然,这还不止于此,但我已经概述了要点。


在我的几何网络中,流动方向可以是任何基本方向。除非我也使用流向栅格或类似的东西,否则无法通过原始坐标的比较来确定流向。即使这样也可能会造成问题,因为有时管道会相对于自然轮廓倾斜,或者水会被泵上山。如何确定流向正确?
普里西拉

1

我受到@FelixIP的启发,但我想编写一个无需加入连接或创建额外文件的解决方案,因为我的网络非常庞大,有400K +个管道和500K +个节点。

几何网络的建立迫使节点的X,Y与管道末端重合。您可以在arcpy光标中使用形状标记访问这些位置并进行匹配。线的形状标记按绘制顺序返回顶点数组。在我的网络中,管道的绘制顺序经过大量质量检查,因为我们使用它来设置流向。因此,第一个顶点是管道的起点,而最后一个顶点是管道的终点。

参考:ASSETID =管道的ID,UNITID =管道开始的节点ID,UNITID2 =管道结束的节点ID。

nodes = "mergeNodes"
pipes = "SEWER_1"

nodeDict = {}
pipeDict = {}

#populate node dictionary with X,Y as the key and node ID as the value
for node in arcpy.da.SearchCursor(nodes, ["UNITID", "SHAPE@XY"]):
    nodeDict[(node[1][0], node[1][1])] = node[0]

#populate pipe dictionary with pipe ID as the key and list of X,Y as values 
#vertices populated in the order that the line was draw
#so that [0] is the first vertex and [-1] is the final vertex
for pipe in arcpy.da.SearchCursor(pipes, ["ASSETID", "SHAPE@"]):
    for arrayOb in pipe[1]:
        for point in arrayOb:
            if pipe[0] in pipeDict:
                pipeDict[pipe[0]].append((point.X, point.Y))
            else: 
                pipeDict[pipe[0]] = [(point.X, point.Y)]

#populate UNITID with the first vertex of the line
#populate UNITID2 with the final vertex of the line
with arcpy.da.UpdateCursor(pipes, ["ASSETID", "UNITID", "UNITID2"]) as cur:
    for pipe in cur:
        if pipeDict[pipe[0]][0] in nodeDict:
            pipe[1] = nodeDict[pipeDict[pipe[0]][0]]
        if pipeDict[pipe[0]][-1] in nodeDict:
            pipe[2] = nodeDict[pipeDict[pipe[0]][-1]]
        cur.updateRow(pipe)

这是我工作的90%,但由于节点字典已经可用,所以我不会两次通过管道。
FelixIP '19
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.