如何获取变量到arcpy.management.CalculateField的Python代码块

257
5
12-01-2022 06:02上午
TomGeo
通过
临时贡献者III

我有一个计算,它工作得很好,得到一个变量:

arcpy.management。CalculateField(sector_angle, 'Buffer', "getBuffer(!Area!)", "PYTHON3", f""" "def getBuffer(Area):如果区域< {median_area}:返回1 if区域> {median_area}:返回2""","TEXT", "NO_ENFORCE_DOMAINS")

我在同样的特征类上做了另一个计算,它不成立。

arcpy.management。CalculateField(sector_angle, 'Buffer_Radius', "setDistance(!Buffer!)", "PYTHON3", f"""def setDistance(Buffer): if Buffer == 1:返回{pnt[2]} elif Buffer == 2:返回{pnt[3]}""", "FLOAT")

一些关于变量外观的例子:

Pnt [2] = 2043.8900146484375

Pnt [3] = 4087.780029296875

这两个变量的类型都是float,但是生成的'Buffer_Radius'字段只包含NaN。

tomgeo_1 - 1669903249036. - png

关于如何将变量放入代码块,我尝试了各种各样的方法,但是虽然在第一个函数中很容易,但在第二个函数中我就没有运气了。我如何得到我的变量到'Buffer_radius'字段?

——我们生活在21世纪。
GIS继续前进,没有人需要由至少三个文件组成的格式!不,没有人需要shapefile,即使是为了交换格式。人,用GeoPackage与其他GIS交换数据!
标签(2)
0荣誉
5回复
DanPatterson
通过 尊敬的贡献者
尊敬的贡献者
pnt [2]

不能是一个变量它是pnt的一个切片,那么pnt是在哪里定义的呢?也许在某个地方试试

P2 = pnt[2]

P3 = pnt[3]

当然,假设这些值是PNT的切片


...有点退休了…
0荣誉
RogerDunnGIS
通过
偶然的因素

我认为这与buffer_radius字段的属性有关。也许在规模和精度方面有一些问题,不让像2043.8900146484375和4087.780029296875这样的数字适合它。或者,如果buffer_radius是一个文本字段,可能它不够长。你能给我们讲讲那个领域吗?

0荣誉
DavidAnderson_1701
偶然的因素

在这里抛出一些想法。那么使用lambda函数呢?我还想知道{}的用法。这不是定义字典的语法吗?我认为NAN可能是因为返回值是一个NULL字典。

0荣誉
DanPatterson
通过 尊敬的贡献者
尊敬的贡献者

{}也用于python格式字符串。

median_area = 5 area = 2 func = f""" def getBuffer(area):如果区域< {median_area}:返回1如果区域> {median_area}:返回2 """ print(func) def getBuffer(area):如果区域< 5:返回1如果区域> 5:返回2


...有点退休了…
0荣誉
TomGeo
通过
临时贡献者III

感谢所有宝贵的意见和投入。最后,因为我在Python中拥有所有的逻辑,所以我最终使用了一个更新游标。时间方面,它几乎是相同的,如果我运行这两个CalculateField运行,稍慢…

我尝试了所有的事情,当然直接在ArcGIS Pro和我的代码块工作。然而,我认为@RogerDunnGIS谈论字段的格式有一个公平的观点。第一次运行CalculateField是创建缓冲区字段,作为'TEXT'!但是我的第二次CalculateField运行是在if语句中使用整数…

我还没有时间尝试,但1不应该是“1”,因此错误源再次在屏幕前约40厘米处发现。: grinning_face_with_sweat:

——我们生活在21世纪。
GIS继续前进,没有人需要由至少三个文件组成的格式!不,没有人需要shapefile,即使是为了交换格式。人,用GeoPackage与其他GIS交换数据!
0荣誉