为ArcGIS_Pro的字段计算器开一帖。
# 序
购入了正版ArcGIS Pro,竟兴奋地玩起了字段计算器。以下部分每实现一个功能都会新开一个标题。在这里就写一下使用属性表的字段计算器的基础规则吧。
使用字段计算器的 Python 3 时,需要将字段名用 ! 括起。如!shape!和!CITY_NAME!等等。且在传参时,把属性字段写在前面。
计算文本或字符字段的字符串时,在对话框中,字符串必须使用双引号(”字符串”),而在脚本中,还必须对使用双引号的字符串两边添加单引号(例如,'”string”‘)。但若在表达式参数中输入数值,则两端无需引号。
在函数的参数传递中,可使用type、extent、centroid、firstPoint、lastPoint、area、length、isMultipart和partCount等Geometry对象中的属性
Python表达式可以将几何的area与length属性与面积或线性单位结合使用,从而将值转换为不同的测量单位(如!shape.length@kilometers!)。 如果数据存储在地理坐标系中且具有线性单位,例如英里,则使用测地线算法计算长度。 在地理数据中使用面积单位会产生不正确的结果,这是因为沿地球面的十进制度数并不一致。
面积测量单位关键字如下所示:
线性测量单位关键字如下所示:
通过结合使用 geodesicArea 或 geodesicLength 属性与面积或线性测量单位,Python 表达式可用于计算要素的测地线面积或长度(如 !shape.geodesicArea@hectares! 或 !shape.geodesicLength@miles!)。
# 引用模块
增加这一标题主要是为了演示,它在代码块里可以进行一个 import
new_field = add_random()
Code Block:
import numpy
def add_random():
return numpy.random.random()
# 全局变量
在代码块中还可以定义全局变量,使用方式和在 PyCharm 中一样,感动。
new_field = add_row_num()
Code Block:
row_num = 0
def add_row_num():
global row_num
row_num += 1
return row_num
# 计算点的坐标
第一晚整了接近一个小时,才获取一个不那么离谱的函数。
计算点数据的点要素的坐标可以用
new_field = get_coordinates(!shape!)
Code Block:
def get_coordinates(shape):
return shape.getPart(0).X
在属性表的字段计算器中,应该可以使用ArcPy内的类和方法。
计算线数据里每一个线要素的起始坐标和终点坐标会用到 shape.firstpoint 或 shape.lastpoint 类。
first_point_xy = get_startpoint_xy(!shape!)
Code Block:
def get_startpoint_xy(shape):
return '%s, %s' % (shape.firstpoint.x, shape.firstpoint.y)
last_point_xy = get_endpoint_xy(!shape!)
Code Block:
def get_endpoint_xy(shape):
return '%s, %s' % (shape.lastpoint.x, shape.lastpoint.y)
有时候不仅需要计算点的坐标,还要进行坐标系的更改以得到正确的数值,可以直接调用ArcPy的方法。
coord_in_wgs84 = get_coord_wgs84(!shape!)
Code Block:
def get_coord_wgs84(shape):
x = arcpy.PointGeometry(shape.firstpoint, shape.spatialReference).projectAs(arcpy.SpatialReference(4326)).firstPoint.X
return x