arcmap中的vba之fieldcalculate

上传人:xiao****1972 文档编号:84143501 上传时间:2019-03-02 格式:DOC 页数:8 大小:186.14KB
返回 下载 相关 举报
arcmap中的vba之fieldcalculate_第1页
第1页 / 共8页
arcmap中的vba之fieldcalculate_第2页
第2页 / 共8页
arcmap中的vba之fieldcalculate_第3页
第3页 / 共8页
arcmap中的vba之fieldcalculate_第4页
第4页 / 共8页
arcmap中的vba之fieldcalculate_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《arcmap中的vba之fieldcalculate》由会员分享,可在线阅读,更多相关《arcmap中的vba之fieldcalculate(8页珍藏版)》请在金锄头文库上搜索。

1、FOR U I ONLY 文章仅供参考ArcMap中的VBA 之 field CalculateAuthor:Tsonghua- - - - - - - - - - - -更多讨论参见 http:/bbs.esrichina- ArcMap中,无论是在属性框中右击字段打开的field Calculate还是在ArctoolboxData Management ToolsField 工具箱中的Calculate field ,都支持vba表达式。字段计算器,用以计算字段值。这些字段值,可以是属性表里相关字段的综合,比如百分比,分解字段等;可以是和图形有关的值,比如点的xy坐标,面的中心点坐标,线

2、的长度等等;也可以是为了满足某种特定需求而创造出来的值。比如如下问题:1.要找出图层某字段A里的重复值,并标上记号;2.图层某字段B,现在要将字段B中的 最大值 + 最小值 + 该行值 写入一个新字段C中;3.字段D需要进行编号,号码格式为000001,000002,000003,000004.,000202.;4.将点层的xy坐标按 x , y 的格式输出到 E 字段1.重复记录标上记号要找出图层某字段的重复记录,对于存储在Personal Geodatabase中feature而言,可以通过select by attribute找出重复值的记录:Sql: select * from lay

3、er where:A in (select A from 层名 group by A having count(A) 1)这样执行下来的结果,就是该图层中,A字段值重复数大于等于2的所有记录,而对于不支持子查询的比如shapefile格式文件,可以怎么办呢?在属性表中新建一个字段,取名test,类型设置为 long integer,然后右击该字段,选择field Calculate,勾选 advanced,写入以下代码: - ESRI Support Home Knowledge Base Technical Articles Article Detail 代码参见 HowTo: Identi

4、fy duplicate field values Tsonghua 090924 -Static d As Object Static i As Long Dim iDup As Integer Dim sField -这里填写需要检查的字段名sField = A -If (i = 0) Then Set d = CreateObject(Scripting.Dictionary) End If If (d.Exists(CStr(sField) Then iDup = 1 Else d.Add CStr(sField), 1 iDup = 0 End If i = i + 1在Pre_Lo

5、gic VBA Script Code下方的 A= 窗口中填iDup这是一段在ESRI Support()上找到的代码,功能就是可以讲重复值做上记号,属于重复值的记录,test字段值计算结果为 1 ,否则为 0 。就是说,如果有三条记录A字段值分别为aa,aa,aa,那么有一条被标上 0 ,剩余2条被标上 1 。对重复记录做了记号,如何处理,就可以随心所欲啦。这算是一个为了满足某种需求,而重新新建字段,并计算其值的例子2.计算 B.max + B.min + B这个问题,就是根据属性表里其他字段来重新提取所需要的信息进行组合。这个例子,是在论坛上看到有人问的问题。同样,去ESRI的支持中心去搜

6、了一下,找到了如下代码: - ESRI Support Author Christian Degrassig Tsonghua 090924 -Dim pMxDoc As IMxDocumentDim pFLayer As IFeatureLayerDim pData As IDataStatisticsDim pCursor As ICursorDim pStatResults As IStatisticsResultsStatic lngFlag as longDim lngLayerIndex as longDim strFieldName as string因为不清楚你的字段类型,所以

7、这里设置三个变量类型为 VariantStatic varZMax as VariantStatic varZMin as VariantDim varVal as Variantif lngFlag = 0 then1.注:这里填你需要取最大最小值的字段名strFieldName = B 2.这里设置你需要计算字段值的图层所在图层索引号TOC中,从上至下,第一层 LayerIndex=0,第二层 为 1,以此类推.这里 LayerIndex值是第二个需要设置的地方 lngLayerIndex = 0Set pMxDoc = ThisDocumentSet pFLayer = pMxDoc.F

8、ocusMap.Layer(lngLayerIndex)Set pCursor = pFLayer.Search(Nothing, False)Set pData = New DataStatisticspData.Field = strFieldNameSet pData.Cursor = pCursorSet pStatResults = pData.StatisticsvarZMax = pStatResults.Maximum varZMin = pStatResults.MinimumlngFlag = 1End If3.这里,第三个数请双击上面fields框中的对应字段varVal

9、= varZMax + varZMin + B同样,在 C = 的框框中填入 varVal字段计算器里,不管是一般的赋值表达式抑或是advanced里写的较复杂的表达式,其实都是在每一行运行一次,对该记录进行赋值运算。因此,如果需要将某参数值传递下去的话,可以用 static 参数 as 类型 这样的参数声明方式,Dim 参数 as 类型的声明方式,只是在进行某条记录赋值的时候有效,一旦结束,参数值被清空。例如,如果想对某字段赋值为 1,2,3,4 可以用如下赋值表达式:Static i as longDim a as stringa=i+1i=i+1_esri_field_calculato

10、r_splitter_a注:_esri_field_calculator_splitter_ 是分割标志,具体的可以在field Calculate中写一个表达式,然后点击 save ,保存的文件是 .cal格式,可以用记事本打开编辑。对于一个经常用的表达式,可以写好之后保存(save)起来,下次使用的时候,只需要点Load加载过来即可对比,dim i as longDim a as stringa=i+1i=i+1_esri_field_calculator_splitter_a对比发现,用 static 方式声明的结果是 1,2,3,4 而用 dim方式声明的结果是 1,1,1,1,也就是

11、说,dim声明的参数 i在field Calculate逐行运行的过程中,没有把参数值传递下去。回过头来分析一下这段重新分析字段,获取最大值,最小值来组成新字段值的问题if lngFlag = 0 then1.注:这里填你需要取最大最小值的字段名strFieldName = 自定义的字段名 2.这里设置你需要计算字段值的图层所在图层索引号TOC中,从上至下,第一层 LayerIndex=0,第二层 为 1,以此类推.这里 LayerIndex值是第二个需要设置的地方 lngLayerIndex = 0Set pMxDoc = ThisDocumentSet pFLayer = pMxDoc.F

12、ocusMap.Layer(lngLayerIndex)Set pCursor = pFLayer.Search(Nothing, False)Set pData = New DataStatisticspData.Field = strFieldNameSet pData.Cursor = pCursorSet pStatResults = pData.StatisticsvarZMax = pStatResults.Maximum varZMin = pStatResults.MinimumlngFlag = 1End If这段是解决问题的关键所在,它在field Calculate对第一

13、行记录赋值的时候,已经对整层进行统计并获取了最大值pStatResults.Maximum 储存在参数 varZMax中,同时把获取的最小值pStatResults.Minimum 存在参数 varZMin中。因为对整层该字段的赋值过程中,只需要获取一次最大值最小值即可,因此这里做了个标志- - -lngFlag。一旦最大最小值获取完成,就让 lngFlag值为 1,以后的逐行赋值中,不再进行统计,而直接使用参数 varZMax,varZMin的值。最后一行 varVal= varZMax + varZMin + 待计算字段名这就很简单了,直接进行加减运算。3.按照需求对字段D编号有了上面两则例子的提示,这里不难分析,其实只需要先按要求生成 1,2,3,4 然后对其格式标准化(也就是让字段长度一致,不足的补零)。参照如下代码: -rec_Number_ConstantLengthString.calAuthor: Ianko Tchoukanskihttp:/www.ian- Tsonghua 090924 -Static rec As LongStatic j As LongDim lStar

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号