arcgis学习笔记
arcgis的概念
arcgis的应用场景
arcgis的发展历史
arcgis的cc工具箱
arcgis操作四十四个技巧
arcigspro中的动态文本技巧
ARCgis的图斑对比操作实操
arcgis如何汇总统计
arcgis如何布满布局操作
arcgis如何在dem栅格中提取水文线
arcgispro中如何创建空图层-最快办法
arcgismap过渡到PRO的操作细节
arcgisPRO如何画建筑阴影
arcgis的模型构建器-减轻重复劳动利器
如果在ArcGIS Pro的地图系列中插入动态统计表
arcgis土地利用转移矩阵
ArcGIS中的【OBJECTID_1】字段是什么鬼?如何还原成【OBJECTID】
arcgis四十个操作技巧-提高工作效率
ArcGIS 批量导出 MXD 地图,高效不加班
arcgis获取四至坐标
ArcGIS 强行修改字段类型工具
在ArcGIS中生成界址点的方法——基于arcpy脚本的实践指南
【ArcGIS 小技巧】为国空用地字段设置属性域,快速填充属性值并减少出错
arcgis导出csv格式
arcgis小技巧
数据分享2024年5月全国行政区划
arcgis计算子段的表达式
ArcGIS_空间连接_工具详解
ArcMap的那些功能在ArcGIS Pro里都去哪儿了?
【平面面积、椭球面积】计算方法全收录
解锁 ArcGIS 字段计算器!
ArcGIS【汇总统计】方法详解
解决你的所有 ArcGIS 标注问题:二分式、三分式、上下标、牵引线……
ArcGIS 模型构建器(ModelBuilder)_知识要点汇总
一篇文章学会 ArcGIS 模型构建器(ModelBuilder)
ArcGIS 筛选工具:19 段 SQL 代码,所有需求一网打尽
ArcGIS 模型构建器 Pro 版_更多花活演示
ArcGIS Pro 属性规则:数据自动化神器
【模型构建器高级技巧】迭代要素选择实现带属性的线面转换
【超级干货】26 段 python 代码,解锁 ArcGIS 字段计算器!
一文搞定 ArcGIS Pro 布局中的动态文本
本文档使用 MrDoc 发布
-
+
首页
解锁 ArcGIS 字段计算器!
# 【超级干货】26 段 python 代码,解锁 ArcGIS 字段计算器! 在某些情况下,为了设置字段值,可能要对单条记录甚至是所有记录执行数学计算。字段计算器可以对所有记录或选中记录执行简单计算和高级计算。 计算可以通过【Python】或【VBScript】执行。**建议使用【Python】**,字段计算器的使用,其实主要就是【Python】基础语法的简单应用。 **注意,在代码框里输入的符号都必须是在英文状态下输入。** 在任一要素类或者表上右击【打开属性表】,再找到要计算的字段上右击【字段计算器】,即可打开字段计算器。   打开窗口如上图。 1)选择脚本语言。默认是【VB】,需要手动改成【Python】。 2)要素或表的字段名,可以双击,会自己在(5)或者(6)的代码里自动生成字段名的代码。 3)python 的一些简单函数和方法,同样可以双击自动生成。 4)如果勾选【显示代码块】,则会出现代码框(6)。默认是不勾选的,如果计算脚本比较复杂,需要多行,就勾选,在代码框(5)中定义方法,再在代码框(6)中进行引用。 5)主代码框。 6)引用方法的时候用到的代码框, 默认是不开启的。 **具体用法示例如下:** **01** **四则运算** 简单的加减乘除运算,例如: ``` !数值 01! * !数值 02 ```  **02** ### **字符串叠加** ``` !字符串 01! + !字符串 02! ```  **03** ****字符串切片**** 如字符串的前 3 位: ``` !字符串 01![:3] ```  类似的情况还有,取字符串的后 3 位: ``` !字符串 01![-3:] ``` 取字符串的 2 到 4 位。 ``` !字符串 01![1:4] ``` 取关键字及前面或后面的文字,如,取“市”及前面的字。 **注意,要查找的如果是中文,需要在前面加 u,这是 python2.*版本的问题。如果是 ArcgisPro 就不用加。** ``` !字符串 01! [:!字符串 01!.find(u'市')+1] ```  如果要考虑“市”和“县”2 个关键字,情况就稍微复杂一些。可以勾选【显示代码块】,写一个方法再引用。 ``` def ss(a): list_str = [u'市', u'县'] index = -1 for s in list_str: if a.find(s) != -1: index = a.find(s) return a [:index+1] ```  **04** **英文转大写、小写、首字母大写** 全部转大写: ``` !字符串 01!.upper() ``` 全部转小写: ``` !字符串 01!.lower() ``` 首字母大写,其余字母小写: ``` !字符串 01!.capitalize() ```  **05** ****字符串替换**** 如:要把“县”替换成“市”,**注意这里不是在新字段里生成结果,而是修改原字段,要小心。** ``` !字符串 01!.replace(u'县', u'市') ``` 引申一下,如果要去取字符串中的空格,则可以如下计算: ``` !字符串 01!.replace(' ', '') ``` **06** **在字符串的每个字符中插入一个指定字符** 如:要把【福州市】计算成【福_州_市】,字符也可以是空格。 ``` '_'.join( !字符串 01! ) ```  **07** **保留 2 个小数** 如果要把一个小数类型的字段,保留 2 个小数,可以如下: ``` round(!Shape_Area!,2) ```  **08** **计算椭球面积** **注意,要计算的字段必须是 float 或是 double 类型。要素也不能没有定义坐标系。** ``` !shape.geodesicarea! ``` **09** **提取中文、英文、数字、特殊符号** 这里有用到正则表达式。如,提取汉字: ``` import re def ss(a): va = re.findall(u'[\u4e00-\u9fa5]+',a) if len(va) == 0: result = '' else: result = '' for i in range(0, len(va)): result += va[i] return result ```  如果是提取英文,则上面第 3 行代码替换成: ``` va = re.findall(r'[a-zA-Z]', a) ``` 如果是提取数字: ``` va = re.findall(r'\d', a) ``` 特殊符号: ``` va = re.findall(r'\W', a) ``` **10** **if-else 语句的运用** 例如:通过建筑结构和层数来简单判断建筑质量。 ``` def ss(a,b): if a == u'混' and b>2: return '质量较好' elif a == u'混' and b<=2: return '质量一般' else: return '质量较差' ```  **11** **计算要素的四至、部件数等** ``` # 东 !shape.extent.XMax! # 西 !shape.extent.XMin! # 北 !shape.extent.YMax! # 南 !shape.extent.YMin! # 部件数 !shape.PartCount! # 是否是多部件 !shape.isMultipart! ``` **12** **字段值前面补齐 0** 例如:在 OID 前补 0,补到 8 位。注意要计算的字段必须是字符串类型。 ``` (8-len(str(!数值 01!))) * '0' + str( !数值 01! ) ```  **13** **度分秒转十进制度** 这个例子算是一个综合运用,代码较长。 ``` def ss(a): index1 = a.find(u'°') index2 = a.find(u'′') index3 = a.find(u'″') degree = float(a[0:index1]) minutes = float(a[index1 + 1:index2]) seconds = float(a[index2 + 1:index3]) result = degree + minutes / 60 + seconds / 3600 return result ```  **14** ****数字前填充 0**** 一般用在编号中, 例如取【OBJECTID】的数字并在前面填充 0 至 5 位,注意计算的字段必须是字符串型。**因为【OBJECTID】的值是数字,所以要加 str()转成字符串:** ``` str(!OBJECTID!).zfill(5) ```  **15** **小数点后保留固定位数,不足部分用 0 填充** 正常情况下用 round()函数可以保留固定位数,但是因为生成的是数值型,所以如果最后位是 0 会自动消掉。 如果想要实现不足部分用 0 填充,则需要字段为字符串型,并如下计算: ``` format(!TBMJ!, '.5f') ```  **16** **文本居中,两端填充** 再整点活,如果想在文本两端都进行填充。例如要在文本前后都填充【0】至文本长度为 8: ``` !JQDLMC!.center(8,"0") ```  **17** **文本左右对齐,另一端填充** 例如文本左对齐,右侧填充至 8 位: ``` !JQDLMC!.ljust(8,"%") ```  相反的话则是: ``` !JQDLMC!.rjust(8,"%") ``` **18** ****获取特定字符在字符串的位置**** 例如获取字符串中【8】的位置,注意是从左开始获取第一个【8】的位置: ``` !BSM!.find("8") ``` 如果是从右开始获取: ``` !BSM!.rfind("8") ``` **19** **获取多个数字型字段值中的最大值或最小值** 取最大值: ``` max(!TBMJ!,!Shape_Area!) ```  取最小值: ``` min(!TBMJ!,!Shape_Area!) ``` **20** **获取随机数** 例如要获取 0 至 10 之间的随机整数: ``` random.randrange(0,10) ``` 在代码块中输入: ``` import random ```  **21** ****赋空值**** 空值不是空格: ``` None ``` **22** **计算数字的百分比变化** 例如计算图斑的面积变化,以百分比的方式表达: ``` PercentChange(!TBMJ!) ``` 在代码块中输入: ``` lastValue = 0 def PercentChange(arg): newValue = arg global lastValue if lastValue: percentage = (float(newValue - lastValue) / lastValue) * 100 else: percentage = 0 lastValue = newValue return percentage ```  **23** **计算数字的累积值** 例如逐个累积图斑的面积之和: ``` AccumulateValue(!TBMJ!) ``` 在代码块中输入: ``` total = 0 def AccumulateValue(arg): value = arg global total if total: total += value else: total = value return total ```  **24** **给图斑顺序编号** 结果输入: ``` SequentialNumber() ``` 在代码块中输入: ``` rec=0 def SequentialNumber(): global rec pStart = 1 pInterval = 1 if (rec == 0): rec = pStart else: rec = rec + pInterval return rec ```  **25** **获取面要素的折点数** 可以获取面要素折点线,需注意获取的折点数包括首末点,比你看上去的要多一个。选择一个整型字段进行计算: ``` getVertexCount(!shape!) ``` 在代码块中输入: ``` def getVertexCount(feat): partnum = 0 partcount = feat.partCount pntcount = 0 while partnum < partcount: part = feat.getPart(partnum) pnt = part.next() while pnt: pntcount += 1 pnt = part.next() if not pnt: pnt = part.next() partnum += 1 return pntcount ``` **26** **移动点要素** 在【shape】字段上点击计算字段,实现点要素 x 坐标增加 100: ``` shiftXCoordinate(!SHAPE!) ``` 在代码块中输入: ``` def shiftXCoordinate(shape): shiftValue = 100 point = shape.getPart(0) point.X += shiftValue return point ``` 
睡觉的骆驼
2024年8月15日 20:50
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码