ArcGis 字段计算器表达式(Field calculator expression).cal文件与标注表达式(label expression).lxp的实质及其编码方式、解析方法
ArcGis 字段计算器表达式可以保存为一个扩展名为.cal的文件,该文件的实质是一个文本文件,编码方式为 UTF-16-LE。
官方的说明是“ArcGIS 应用程序使用 UTF-16-LE 编码读写 .cal 文件。只要输出使用 UTF-16-LE 编码编写,其他应用程序(如记事本)可用于创建或修改 .cal 文件。使用任何其他编码将导致文件无法加载到代码段中。”
在记事本编辑后保存时编码方式应选用Unicode。
在.net中读写应使用Encoding.Unicode。
例:
1 string saveFilePath = Utils.PathUtil.ShowSaveFileDialog("ArcGis字段计算器表达式|*.cal|所有文件|*.*", ".cal"); 2 if (saveFilePath != string.Empty) 3 { 4 StringBuilder stringBuilder = new StringBuilder(); 5 stringBuilder.Append(this.rtxtCode.Text); 6 stringBuilder.AppendLine(); 7 stringBuilder.Append("__esri_field_calculator_splitter__"); 8 stringBuilder.AppendLine(); 9 stringBuilder.Append(this.rtxtFunctionName.Text); 10 System.IO.FileStream fileStream = new System.IO.FileStream(saveFilePath, FileMode.Create); 11 StreamWriter streamWriter = new StreamWriter(fileStream,Encoding.Unicode); 12 streamWriter.Write(stringBuilder); 13 streamWriter.Flush(); 14 streamWriter.Close(); 15 streamWriter.Dispose(); 16 fileStream.Close(); 17 }
在python下应使用“UTF-16-LE”
例:
cal=arcpy.GetParameterAsText(3) cal_cntent=codecs.open(cal,'r','utf-16-LE') code='' exp='' line=cal_cntent.readline() while line: if '__esri_field_calculator_splitter__' not in line: if line !=' ': code+=line else: line=cal_cntent.readline() break line=cal_cntent.readline() while line: if line !=' ': exp+=line line=cal_cntent.readline()
编码方式自官方说明得之,链接附此:
https://pro.arcgis.com/zh-cn/pro-app/tool-reference/data-management/calculate-field.htm
.lxp与.cal同原理,不赘述。