ImageVerifierCode 换一换
格式:DOCX , 页数:65 ,大小:3.03MB ,
资源ID:21568893      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/21568893.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(ESRI中国社区学习心得之Field CalculatorWord文档格式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

ESRI中国社区学习心得之Field CalculatorWord文档格式.docx

1、2.在Field Calculator中再次使用遍历(同VBA中写法) 503.加标志使得Field Calculator中不做不必要的多次执行 51ARCGIS学习心得之Field Calculator为什么要把Field Calculator专门作为一章呢,是因为Field Calculator着实很强大,利用Field Calculator总能达到事半功倍的效果,具体有多厉害,我们下面来一一介绍。 学习笔记ArcMap中的VBA之Field Calculatorhttp:/bbs.esrichina- - - - - - - - - - -ArcMap中,无论是在属性框中右击字段打开的F

2、ield Calculator还是在ArctoolboxData Management ToolsField 工具箱中的Calculate field ,都支持vba表达式。字段计算器,用以计算字段值。这些字段值,可以是属性表里相关字段的综合,比如百分比,分解字段等;可以是和图形有关的值,比如点的xy坐标,面的中心点坐标,线的长度等等;也可以是为了满足某种特定需求而创造出来的值。比如如下问题:1.要找出图层某字段A里的重复值,并标上记号;2.图层某字段B,现在要将字段B中的 最大值+最小值+该行值 写入一个新字段C中;3.字段D需要进行编号,号码格式为000001,00000200000300

3、0004.,000202;4.将点层的xy坐标按 x , y 的格式输出到 E 字段1.重复记录标上记号要找出图层某字段的重复记录,对于存储在Personal Geodatabase中feature而言,可以通过select by attribute找出重复值的记录: 1. Sql: select * from layer where:2. A in (select A from 层名 group by A having count(A) 1)这样执行下来的结果,就是该图层中,A字段值重复数大于等于2的所有记录,而对于不支持子查询的比如shapefile格式文件,可以怎么办呢?在属性表中新建一

4、个字段,取名test,类型设置为 long integer,然后右击该字段,选择Field Calculator,勾选 advanced,写入以下代码:1. -2. ESRI Support Home Knowledge Base Technical Articles Article Detail 3. 代码参见 HowTo:Identify duplicate field values4. Tsonghua 0909245. 6. Static d As Object 7. Static i As Long 8. Dim iDup As Integer 9. Dim sField 10. 1

5、1. 这里填写需要检查的字段名12. sField = A 13. 14. If (i = 0) Then 15. Set d = CreateObject(Scripting.Dictionary) 16. End If 17. If (d.Exists(CStr(sField) Then 18. iDup = 1 19. Else 20. d.Add CStr(sField), 1 21. iDup = 0 22. End If 23. i = i + 1在Pre_Logic VBA Script Code下方的 A= 窗口中填iDup这是一段在ESRI Support()上找到的代码,功

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

7、s IMxDocument7. Dim pFLayer As IFeatureLayer8. Dim pData As IDataStatistics9. Dim pCursor As ICursor10. Dim pStatResults As IStatisticsResults11. Static lngFlag as long12. Dim lngLayerIndex as long13. Dim strFieldName as string14. 因为不清楚你的字段类型,所以这里设置三个变量类型为 Variant15. Static varZMax as Variant16. Sta

8、tic varZMin as Variant17. Dim varVal as Variant18. if lngFlag = 0 then19. 1.注:这里填你需要取最大最小值的字段名20. strFieldName = B21. 2.这里设置你需要计算字段值的图层所在图层索引号22. TOC中,从上至下,第一层 LayerIndex=0,第二层 为 1,以此类推.23. 这里 LayerIndex值是第二个需要设置的地方 24. lngLayerIndex = 025. Set pMxDoc = ThisDocument26. Set pFLayer = pMxDoc.FocusMap.

9、Layer(lngLayerIndex)27. Set pCursor = pFLayer.Search(Nothing, False)28. Set pData = New DataStatistics29. pData.Field = strFieldName30. Set pData.Cursor = pCursor31. Set pStatResults = pData.Statistics32. varZMax = pStatResults.Maximum 33. varZMin = pStatResults.Minimum34. lngFlag = 135. End If36. 3

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

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

12、im声明的参数 i在Field Calculator逐行运行的过程中,没有把参数值传递下去。回过头来分析一下这段重新分析字段,获取最大值,最小值来组成新字段值的问题 1. if lngFlag = 0 then2. 3. 自定义的字段名4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. End If这段是解决问题的关键所在,它在Field Calculator对第一行记录赋值的时候,已经对整层进行统计并获取了最大值pStatResults.Maximum 储存在参数 varZMax中,同时把获取的最小值pStatResults.Minim

13、um 存在参数 varZMin中。因为对整层该字段的赋值过程中,只需要获取一次最大值最小值即可,因此这里做了个标志- - -lngFlag。一旦最大最小值获取完成,就让 lngFlag值为 1,以后的逐行赋值中,不再进行统计,而直接使用参数 varZMax,varZMin的值。最后一行 varVal= varZMax + varZMin + 待计算字段名这就很简单了,直接进行加减运算。3.按照需求对字段D编号 有了上面两则例子的提示,这里不难分析,其实只需要先按要求生成 1,2,3,4 然后对其格式标准化(也就是让字段长度一致,不足的补零)。参照如下代码:为了有更大的延展性,这段优秀的代码里将

14、起始值、步长(就是编号每次增加的值)、字段规范长度等都设置为可以改变的参数,分别为:lStart, lInterval ,iStringLength自然地,可以有其他思路来解决问题:简单地生成1,2,3,。,然后规范一下格式为0000000 这种。如下参考代码:-rec_Number_ConstantLengthString2.calAuthor: Ianko Tchoukanski/www.ian- Tsonghua6. 7. Dim sID As String8. Dim sFormatString As String9. sFormatString = 00000000010. sID=

15、 Format( FID, sFormatString)11. _esri_field_calculator_splitter_12. sID这段代码,同样地,也是我为了寻求某GIS交流群里群友问题答案的时候再ESRI支持中心上找到的,网址是http:/www.ian-,他们写了一批优秀的表达式,打包为EasyCalculate50.zip ,免费提供下载使用。同时还有个工具ETGeoWizards99_92.exe,一样地很优秀,作为ArcGIS的插件,有很多实用的功能,只是这个插件只有些基本的处理是共享,其他更高级一些处理过程还有搭建的模块就是需要注册了。要研究Field Calculat

16、or中的vba,认真学习ian-提供的免费的EasyCalculate50,是个不错的选择。4.将点 x y坐标值写入字段E前面提到的几个例子,都是纯粹的属性字段的操作,Field Calculator里提供使用vba对图形的某些属性性质进行获取或者修改的方法。本例中,需要获取点层数据个点的坐标值,示例代码如下: Tsonghua0909244. Dim Output As string5. Dim pPoint As IPoint6. Set pPoint = Shape7. Output = pPoint.X & & pPoint.Y8. _esri_field_calculator_sp

17、litter_9. Output这一段的绝大部分是拷贝自Field Calculator的Help文档下载 (293.09 KB)2010-6-23 12:185.对图形的操作 求距离小于指定值的任意两点连线的长度和角度1、先用add xy coordinate将点的座标加入属性表,下图是加入点座标后的属性表下载 (89.97 KB)2009-9-7 22:172、用point distance求出指定距离内任意两点的距离,下图指定距离为1500米下载 (44.28 KB)注意search radius为1500求出的结果,为一dbf文件:下载 (57.42 KB)3、将上步结果中distan

18、ce为0的记录删掉(arcgis9.3这步不需要做,因它不会求点和自身的距离),增加angle、fx、fy、tx、ty几个double类型字段,用以存放角度,起点x、y座标和终点x、y座标下载 (114.78 KB)4、用上表中input_fid字段将上表和第一步中加了点座标的属性表连接,连接字段为属性表中的fid,并将属性表中的point_x、point_y分别赋给fx和fy。下载 (52.87 KB)5、去掉连接,然后按上步的方法再用near_fid连接属性表,给tx、ty赋值。连接后的结果:下载 (201.26 KB)6、计算角度在angle字段名上点右键,选field calculat

19、or,选中advanced,在Pre-logid VBA Script Code窗口内输入下列内容:if tx-fx0 and ty-fy0 then a=atn(ty-fy)/(tx-fx)*180/4/atn(1)elseif tx-fx0 and ty-fya=90elseif tx-fx=0 and ty-fya=2700 and ty-fy=0 then a=0end if在angle下面的窗口内输入a至此距离小于指定值的任意两点连线的长度和角度都已求出。前面的部分的结果是个dbf文件,将这个dbf文件按(fx,fy)展成点文件后即可利用http:dLength = NEAR_DIS

20、TdAngle = NEAR_ANGLE修改为:dLength = DISTANCEdAngle = ANGLE6.距离小于一定数值的点之间连线近日偶得一个距离小于一定数值的点之间连线方法,写出来与大家同享。假设要将点文件or_point中距离小于1000的点之间连线,下面是具体步骤:1、首先用near工具找出距离小于1000的点:文件原属性表:下载 (27.02 KB)2009-9-6 21:50使用下面的工具:下载 (14.24 KB)参数设置:下载 (45.5 KB)input features和near features均填你的点文件,search radius填1000,angle选

21、项选中。运行工具后的点文件属性表:下载 (52.95 KB)然后按属性选出距离大于0的点导出到另一文件(比如new_point.shp),并在新文件中建一整型字段,比如dummy。下载 (44.98 KB)2、新建一线文件(比如p2l.shp),和new_point一起加入arcmap,并使线文件为最上一层:下载 (16.65 KB)打开new_point的属性表,在dummy上点右键,选field calculator,在弹出的窗口内点advanced,在Pre-logid VBA Script Code窗口内输入下列代码:Dim pMxDoc As IMxDocumentDim pMap

22、As IMapDim pPoint As IPointDim pEndPoint As IPointDim pLine As esriGeometry.ILineDim pTransform As ITransform2DDim dLength As DoubleDim dAngle As DoubleDim pSegColl As ISegmentCollectionDim Pi As DoubleDim pFeatcls As IFeatureClassDim pFeatLayer As IFeatureLayerDim iLayerOrder As IntegerDim pFCursor As IFeatureCursorDim pFBuffer As IFeatureBufferPi = 4 * Atn(1)Set pMxDoc = ThisDocumentSet pMap = pMxDoc.FocusMapSet pFeatLayer = pMap.Layer(iLayerOrder)Set pFeatcls = pFeatLayer.FeatureClassSe

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1