关注【GIS技术杂货铺】,开启GIS学习
获取系统、实用的 GIS 干货
【适用版本】
ArcMap 10.x/ ArcGIS Pro 2.x~3.x
包含内容: 1文本字符串处理;2数值计算;3数字 ↔ 文本互转;4条件判断 IF 多分支(地籍分类、地类编码最常用);5日期时间处理;6空间几何属性计算(面、线、点图层通用);7批量编码、自动编号函数;8高级拓展函数
一、文本字符串处理(最常用)
1. 基础拼接
① 多字段拼接
!NAME! +"-"+ !CODE!示例:NAME = 小区,CODE=001 → 小区 - 001
代码块:deflink(a,b): if a isNone: a = "" if b isNone: b = "" return a + "_" + b使用: link(!XZQMC!, !XZQDM!)
语法:#字符串[起始索引:结束索引],从 0 开始!DLBM![0:2]# 取第3位到末尾!DLBM![2:]# 最后3位!DLBM![-3:]# 第2位单个字符!DLBM![1]
# 全部大写!NAME!.upper()# 全部小写!NAME!.lower()# 首字母大写!NAME!.capitalize()
# 前后空格!TEXT!.strip()# 仅左边空格!TEXT!.lstrip()# 仅右边空格!TEXT!.rstrip()# 去除所有空格!TEXT!.replace(" ","")
# 替换指定字符!ADDRESS!.replace("村","社区")# 批量多替换(封装函数)defrepStr(s):if s isNone:return"" s = s.replace("0","一") s = s.replace("1","二") s = s.replace("2","三")return s表达式:repStr(!NUM!)
# 文本字符长度len(!NAME!)# 空值容错长度defstrLen(s):if s isNone:return0returnlen(s)表达式:strLen(!NAME!)
# 返回字符所在索引,不存在返回-1!ADDRESS!.find("街道")# 判断是否包含(返回True/False)"街道"in !ADDRESS!
#代码块defsplitTxt(s,idx):if s isNone:return"" arr = s.split("-")iflen(arr)> idx:return arr[idx]else:return""#表达式(取分隔后第 1 段):splitTxt(!BH!,0)
# 加减乘除!MJ! +100!MJ! - !LJ!!KD! * !GD!!MJ! /10000# 取余!NUM! %10# 乘方(平方)!MJ! **2
# 平方米 → 公顷(÷10000)!AREA! /10000# 平方米 → 亩(×0.0015)!AREA! *0.0015# 公顷 → 亩!HJ! *15# 米 → 千米!LENGTH! /1000
# 保留2位小数round(!MJ!,2)# 向上取整import mathmath.ceil(!MJ!)# 向下取整import mathmath.floor(!MJ!)# 取绝对值abs(!SJ!)
#代码块defcalc(a,b):if a isNone: a =0if b isNone: b =0return a + b#表达式:calc(!JS!, !XS!)
import random# 0~1随机小数defrandFloat():return random.random()# 1~100随机整数defrandInt():return random.randint(1,100)#表达式:randInt()
str(!MJ!)# 数字拼接固定字符str(!NUM!)+"号"
#代码块deftoNum(s):if s isNoneor s =="":return0try:returnfloat(s)except:return0#表达式:toNum(!TXT_NUM!)
四、条件判断 IF 多分支(地籍分类、地类编码最常用)"耕地"if !DLBM! in["0101","0102"]else"非耕地"
# 示例 1:地类代码转地类名称defdlName(code):if code isNone:return"未知"if code.startswith("01"):return"耕地"elif code.startswith("02"):return"园地"elif code.startswith("03"):return"林地"elif code.startswith("04"):return"草地"elif code.startswith("10"):return"交通运输用地"elif code.startswith("11"):return"水域及水利设施用地"elif code.startswith("12"):return"其他土地"else:return"建设用地"#表达式:dlName(!DLBM!)#示例 2:面积分级defmjLevel(mj):if mj isNone:return"无数据"if mj <100:return"小型地块"elif mj <1000:return"中型地块"else:return"大型地块"#表达式:mjLevel(!MJ!)
!NAME! if !NAME! isnotNoneelse"无名称"
#代码块import datetimedefnowTime():return datetime.datetime.now()#表达式:nowTime()
#代码块import datetimedefdateToTxt(dt):if dt isNone:return""return dt.strftime("%Y-%m-%d")#表达式:dateToTxt(!RKSJ!)
# 提取年份!RKSJ!.year# 提取月份!RKSJ!.month# 提取星期!RKSJ!.weekday()
#代码块defdateDiff(d1,d2):if d1 isNoneor d2 isNone:return0return(d2 - d1).days#表达式:dateDiff(!STARTDATE!, !ENDDATE!)
注意:坐标系必须为投影坐标系(米单位),地理坐标系(经纬度)不能直接算面积长度# 平方米!Shape_Area!# 公顷!Shape_Area! /10000
# 米!Shape_Length!# 千米!Shape_Length! /1000
# 横坐标X!Shape!.firstPoint.X# 纵坐标Y!Shape!.firstPoint.Y
# 面中心点X!Shape!.centroid.X# 面中心点Y!Shape!.centroid.Y
#代码块rec =0defautoNum():global rec rec +=1return rec#表达式:autoNum()
#代码块rec =0defautoBH():global rec rec +=1# 3位补零return"DK"+str(rec).zfill(3)#表达式:autoBH()输出:DK001、DK002...
3. 按分类分组编号(同村 / 同地类重新从 1 开始)#代码块group_dict ={}defgroupNo(groupField):global group_dictif groupField notin group_dict: group_dict[groupField]=0 group_dict[groupField]+=1return group_dict[groupField]#表达式(按行政区分组编号):groupNo(!XZQDM!)
#代码块defsiZhi(d,n,x,b): lst =[]if d:lst.append("东:"+d)if n:lst.append("南:"+n)if x:lst.append("西:"+x)if b:lst.append("北:"+b)return"、".join(lst)if lst else"无"#表达式:siZhi(!D!,!N!,!X!,!B!)
# 18位身份证取第7-14位生日!SFZ![6:14]
"空"if(!NAME! isNoneor !NAME! =="")else"有值"
#代码块defcleanStr(s):if s isNone:return"" symbol =[",","。","、","!","?","#","@"]for sym in symbol: s = s.replace(sym,"")return s.strip()#表达式:cleanStr(!DZ!)
:字段存在空值,必须用 def 函数做空值判断数字无法拼接字符串:数字先用 str () 转换切片索引越界:封装函数判断字符串长度再截取面积数值极小:图层是地理坐标系,投影转 CGCS2000 3 度带zfill 补零失效:先转字符串再 zfill中文乱码:ArcGIS 字段计算器默认 UTF-8,不要使用中文引号
⚠️重要提醒
- 领到工具的朋友欢迎在评论区留言打卡,说说你最需要哪个功能;
📥领取方式
后台 / 评论区留言回复:【002】即可自动获取pdf/word文档下载链接点点点,赞和在看都在这儿!
【关注GIS技术杂货铺,获取GIS干货】