在ArcPy脚本中迭代轴承距离到行

182
6
跳到解决方案
01-04-2023 04:45 am
KedaravindanBhaskar
新贡献者III

你好,

我试图写一个循环,迭代线生成4个罗盘方向,使用ArcGIS笔记本上的“轴承距离到线”工具。

基本上,我想在“Bearing field”一行中输入4个字段。我已经将这4个字段存储在一个名为“Dirfields”的列表中。我试图使用这个列表作为“轴承场”的输入。

关于我如何实现这个工作流有什么想法吗?我附上了“与线的距离”对话框的照片和下面脚本的摘录。如果还有什么我可以提供的,请告诉我。

附注:由于我之前的帖子没有得到回复,所以转发了。

谢谢你!

#创建四个字段(每个罗盘方向一个),并在特征类“SusBui_Point”中指定它们的值。取值为十进制。arcpy.management。CalculateField("SusBui_Point", "DirNorth", "0", "PYTHON3", ", "DOUBLE", " no_enfor_domains ")CalculateField("SusBui_Point", "DirEast", "90", "PYTHON3", ", "DOUBLE", " no_enfor_domains ")CalculateField("SusBui_Point", "DirSouth", "180", "PYTHON3", "DOUBLE", " no_enfor_domains ")CalculateField("SusBui_Point", "DirWest", "270", "PYTHON3", ", "DOUBLE", " no_enfor_domains ") #创建一个包含四个字段的列表Dirfields = arcpy。ListFields ("SusBui_Point", "Dir*", "Double") #现在,我想使用一个for循环,在四个罗盘方向上迭代线的创建,使用"Bearing Distance to line "工具和在上一步中创建的列表。#不知道如何开始

0荣誉
1解决方案

接受的解决方案
DanielMiranda2
新贡献者III

啊,我的错。您应该使用field.name作为bearing_field参数。该工具需要字段的名称才能工作。我刚刚在一些虚拟数据上尝试了一下,现在似乎起作用了。

在原帖子中查看解决方案

6个回答
DanielMiranda2
新贡献者III

下面是至少一种方法。在这种情况下,输出特性类名将是字段名。如果需要使名称更加独特,则必须向名称附加某种字符串。

请注意,您还必须指定轴承距离到直线工具所需的各种参数轴承距线(数据管理)-ArcGIS Pro |文档.这只是显示了变量的位置:

Dirfields中的f: arcpy.management。BearingDistanceToLine("SusBui_Point", f.name, x_field, y_field, distance_field, {distance_units}, f, {bearing_units}, {line_type}, {id_field}, {spatial_reference}, {attributes})

至少,您仍然需要指定x_field、y_field和distance_field,然后根据需要在{}中指定尽可能多的可选输入参数。使用字段对象列表,我们将f.name或字段的名称作为输出特性类。我们用f,或者场本身,作为承载场。

KedaravindanBhaskar
新贡献者III

对于Dirfields中的字段:arcpy.management。BearingDistanceToLine("SusBui_Point", "Dirfields.name", "POINT_X", "POINT_Y", "LengthOfSampleLine", "METERS", "Dirfields", "DEGREES", "GEODESIC", None, '{spatial_reference}', "NO_ATTRIBUTES")

嗨,丹尼尔,非常感谢你的回复,但是当我使用这个方法时,我仍然得到以下错误-

ExecuteError:执行失败。参数无效。错误000728:字段Dirfields不存在于表Failed to execute (BearingDistanceToLine)。

我已经附上了我上面使用的代码。请注意,我在原始代码中使用了完整的空间引用,但为了可读性,我在这里缩短了它。

我对ArcPy很陌生,所以我可能错过了一些明显的东西……知道是什么吗?

如果你还有什么需要帮助的,请告诉我。

谢谢

0荣誉
DanielMiranda2
新贡献者III

你需要在你的“方位距离”中改变两个参数:

不要使用“Dirfields.name”,而是使用field.name(不带引号)。而不是“Dirfields”使用字段没有报价。当使用变量作为输入参数时,我们不使用引号。否则,该工具认为您只是指定了一个字符串,或者基本上是指定了一个名为“Dirfields”的字段。

当我们使用以下代码时:

对于Dirfields中的字段:

我们用的是变量作为清单上每一项的“替身”。因此,当循环在每个项上运行时,我们用.这就是为什么我们使用field.name而不是Dirfields.name。和field而不是Dirfields。

你几乎可以使用任何东西作为你的循环变量。Field是有意义的,因为这就是它,但它也可以是f,或者apple,或者别的什么。当引用列表中的项时,只需要在循环中使用该变量。

我希望这是有意义的,这可能是一个很难掌握最初的概念。

KedaravindanBhaskar
新贡献者III

嗨,丹尼尔,

我现在得到一个不同的错误。

这是我试过的代码

对于Dirfields中的字段:arcpy.management。BearingDistanceToLine("SusBui_Point", field.name, "POINT_X", "POINT_Y", "LengthOfSampleLine", "METERS", field, "DEGREES", "GEODESIC", None, '{spatial_reference}', "NO_ATTRIBUTES")

这里是错误信息-

ExecuteError: ERROR 000622:执行失败(轴承距离到行)。参数无效。错误000623:参数bearing_field的值类型无效

我错过了什么?

再次感谢您的帮助,如果您还需要什么帮助,请告诉我。

谢谢

0荣誉
DanielMiranda2
新贡献者III

啊,我的错。您应该使用field.name作为bearing_field参数。该工具需要字段的名称才能工作。我刚刚在一些虚拟数据上尝试了一下,现在似乎起作用了。

KedaravindanBhaskar
新贡献者III

作品完美!

我使用field.name作为输出文件名以及bearing_field参数。

非常感谢!