zoukankan      html  css  js  c++  java
  • 计算字段示例

    计算字段示例

    ArcGIS 10

    使用键盘输入值并不是编辑表中值的唯一方式。在某些情况下,为了设置字段值,可能要对单条记录甚至是所有记录执行数学计算。您可以对所有记录或选中记录执行简单计算和高级计算。此外,还可以在属性表中的字段上计算面积、长度、周长和其他几何属性。以下各部分包括使用字段计算器的若干示例。计算可以通过 Python 或 VBScript 执行。

    Python 是 ArcGIS 建议使用的脚本语言。如果要访问地理处理功能(包括要素几何),请使用Python。采用 Python 作为 ArcGIS 10.0 的脚本语言为执行计算提供了许多便利。

    如果您具有使用 VBA 或 VBScript 的经验并且习惯脚本语法,则请使用 VBScript。使用 ArcGIS 先前版本保存的 .cal 文件可以直接使用或者只需进行少量修改。如果拥有 ArcObjects 的过去版本的 VBA 代码,则计算需经过修改后才能用于 10.0。

    注意注意:
    • Python 将强制要求缩进作为语法的一部分。请使用两个或四个空格来定义每个逻辑级别。将语句块的开头和结尾对齐并且保持一致。
    • Python 计算表达式字段将使用惊叹号 (!!) 括起。
    • 命名变量时请注意,Python 区分大小写,因此 yield 不同于 Yield。
    • VBScript 不允许显式声明任何数据类型,所有变量均属于隐式变量。形如 Dim x as String 的语句应该删除或简化为 Dim x。
    • 输入语句后,如果想将其写入文件,可单击保存。加载按钮将提示您查找和选择一个现有计算文件。

    简单计算

    简单字符串示例

    一系列 Python 字符串函数均支持使用字符串,包括 capitalize、rstrip 和 replace。

    将字段 CITY_NAME 中字符串的首字母大写。

    !CITY_NAME!.capitalize()

    去掉字段 CITY_NAME 中自字符串结尾起的所有空白区。

    !CITY_NAME!.rstrip()

    将字段 STATE_NAME 中出现的“california”全部替换为“California”。

    !STATE_NAME!.replace("california", "California")

    在 Python 中字符串字段中的字符可以通过索引和切片操作进行访问。索引操作将在索引位置提取字符,而切片操作则会提取一组字符。

    示例

    说明

    结果

    !fieldname![0]

    第一个字符。

    "a"

    !fieldname![-2]

    倒数第二个字符。

    "e"

    !fieldname![1:4]

    第二、三、四和五个字符。

    "bcd"

    Python 也支持使用 % 运算符的字符串格式。

    将合并后的 FieldA 和 FieldB 以冒号分隔开。

    "%s:%s" % (!FieldA!, !FieldB!)

    VBScript 字符串函数

    一系列 VBScript 字符串函数均支持使用字符串,包括 Left、InStr 和 Chrt。以下是“字段计算器”中常用字符串函数的若干 VBScript 示例。

    Left 函数:返回一个包含自字符串左侧起指定数量字符的变量(字符串型)。

    MyStr = Left([MyField], 1)

    Right 函数:返回一个包含自字符串右侧起指定数量字符的变量(字符串型)。

    MyStr = Right([MyField], 1)

    Mid 函数:返回一个包含字符串中指定数量字符的变量(字符串型)。

    MyString = "Mid Function Demo" 'Create text string
    FirstWord = Mid(MyString, 1, 3) ' Returns "Mid" 
    LastWord = Mid(MyString, 14, 4) 'Returns "Demo"
    MidWords = Mid(MyString, 5) 'Returns "Function Demo" 
    

    InStr 函数:返回指定了一个字符串在另一个字符串中首次出现的位置的变量(长整型)。

    MyPosition = InStr([address], " ")

    Replace 函数:返回一个字符串,在该字符串中,指定的子串已替换为另外一个子串若干次(次数已指定)。

    NewString = Replace([comments], "#", "!")

    Chr 函数:返回一个包含与指定字符代码关联的字符的字符串。

    ' Replace a carriage return character with an exclamation 
    NewString = Replace([comments], chr(13), "!") 
    

    & 运算符:对两个表达式强制执行字符串串联。

    MyStr = [MyField1] & " " & [MyField2]

    简单数学示例

    Python 提供了处理数字的工具。Python 也支持一些数字和数学函数,包括 math、cmath、decimal、random、itertools、functools 和 operator。

    运算符

    说明

    示例

    结果

    x + y

    x 加上 y

    1.5 + 2.5

    4.0

    x - y

    x 减去 y

    3.3 - 2.2

    1.1

    x * y

    x 乘以 y

    2.0 * 2.2

    4.4

    x / y

    x 除以 y

    4.0 / 1.25

    3.2

    x // y

    x 除以 y(向下取整除法

    4.0 / 1.25

    3.0

    x % y

    x 模 y

    8 % 3

    2

    -x

    x 的负数表达式

    x = 5

    -x

    -5

    +x

    x 不变

    x = 5

    +x

    5

    x ** y

    以 x 为底,以 y 为指数的幂

    2 ** 3

    8

    乘法

    !Rank! * 2

    根据给定的半径字段计算球体的体积。

    4 / 3 * math.pi * !Radius! ** 3

    使用代码块

    通过 Python 表达式和“代码块”参数可执行以下操作:

    • 在表达式中应用任意 Python 函数。
    • 访问地理处理函数和对象。
    • 访问要素几何的属性。
    • 访问新的随机值运算符。
    • 根据 if-then-else 逻辑对值进行重分类。
    • 使用其他地理处理工具。

    代码块的使用方式取决于所用的解析程序。“计算字段”支持 Python 和 VB Script 解析程序。

    解析程序

    代码块

    Python

    支持 Python 函数。代码块将使用 Python 函数 (def) 表示。在适当的情况下,几何属性将通过地理处理对象表示(如点对象)。

    VB 脚本

    计算将通过 VBScript 执行。

    各 Python 函数可通过 def 关键字定义,关键字后为函数的名称以及函数的输入参数。函数将通过 return 语句返回值。函数名称可由您自行选取(不得使用空格,也不得以数字开头)。

    使用字段计算器
    注意注意:

    请牢记,Python 强制要求将缩进作为语法的一部分。请使用两个或四个空格来定义每个逻辑级别。将语句块的开头和结尾对齐并且保持一致。

    代码实例 - math

    将字段的值四舍五入为保留两位小数。

    Expression: round(!area!,2)  Parser: Python 

    通过 math 模块将米转换成英尺。以转换值为底,以 2 为指数进行幂运算,然后再乘以 area

    Parser: Python  Expression: MetersToFeet((float!shape.area))  Code Block: def MetersToFeet(area):   return math.pow(3.2808,2) * area 

    通过 Python 逻辑计算字段

    按照字段值进行分类。

    Parser: Python  Expression: Reclass(!WELL_YIELD!)  Code Block: def Reclass(WellYield):   if (WellYield >= 0 and WellYield <= 10):     return 1   elif (WellYield > 10 and WellYield <= 20):     return 2   elif (WellYield > 20 and WellYield <= 30):     return 3   elif (WellYield > 30):     return 4 

    通过 VBScript 逻辑计算字段

    基于表达式的值附有条件地执行一组语句。

    Parser: VB Script  Expression: PopulationDensity = density  Code Block: Dim density If [POP90_SQMI] < 100 Then density = "low"  elseif [POP90_SQMI] < 300 Then density = "medium"  else density = "high" end if 

    代码实例 - 几何

    注意注意:

    有关转换几何单位的详细信息,请参阅以下“几何单位转换”一节。

    计算某要素的面积。

    Parser:
    Python
    
    Expression:
    !shape.area!
    

    计算某要素的最大 X 坐标。

    Parser:
    Python
    
    Expression:
    !shape.extent.XMax!
    
    

    计算某要素中的折点数。

    Parser:
    Python
    
    Expression:
    MySub(!shape!)
    
    Code Block:
    def MySub(feat):    
     partnum = 0
    
     # Count the number of points in the current multipart feature
     partcount = feat.partCount
     pntcount = 0
    
     # Enter while loop for each part in the feature (if a singlepart feature
     # this will occur only once)
     #
     while partnum < partcount:
      part = feat.getPart(partnum)
      pnt = part.next()
    
      # Enter while loop for each vertex
      #
      while pnt:
       pntcount += 1   
       pnt = part.next()
       
       # If pnt is null, either the part is finished or there is an 
       # interior ring
       #
       if not pnt: 
        pnt = part.next()
      partnum += 1
     return pntcount
    
    

    将点要素类中每个点的 x 坐标平移 100。

    Parser:
    Python
    
    Expression:
    shiftXCoordinate(!SHAPE!)
    
    Code Block:
    def shiftXCoordinate(shape):
       shiftValue = 100
       point = shape.getPart(0)
       point.X += shiftValue
       return point
    

    几何单位转换

    几何字段的形状和长度属性可通过表示为带有 @ 符号的单位类型进行修改。

    • 面积测量单位关键字:
      • 英亩 | 公亩 | 公顷 | 平方厘米 | 平方分米 | 平方英寸 | 平方英尺 | 平方千米 | 平方米 | 平方英里 | 平方毫米 | 平方码 | 平方地图单位 | 未知
    • 线性测量单位关键字:
      • 厘米 | 十进制度 | 分米 | 英尺 | 英寸 | 千米 | 米 | 英里 | 毫米 | 海里 | 磅 | 未知 | 码
    注意注意:

    如果数据存储在地理坐标系中且具有线性单位(例如英尺),则会通过测地线算法转换长度计算的结果。

    警告警告:

    转换地理坐标系中数据的面积单位会产生不正确的结果,这是由于沿 globe 的十进制度并不一致。

    计算某要素的长度(以码为单位)。

    Parser:
    Python
    
    Expression:
    !shape.length@yards!
    

    计算某要素的面积(以英亩为单位)。

    Parser:
    Python
    
    Expression:
    !shape.area@acres!
    

    代码实例 - 日期

    计算当前日期。

    Parser: Python  Expression: time.strftime("%d/%m/%Y") 

    计算当前日期和时间。

    Parser: Python  Expression: time.strftime("%d/%m/%Y %H:%M") 
    

    代码实例 - 字符串

    返回最右侧三个字符。

    Parser: Python  Expression: !SUB_REGION![-3:] 
    

    将任意一个大写“P”替换为小写“p”。

    Parser: Python  Expression: !STATE_NAME!.replace("P","p") 

    通过空格分隔符串连两个字段

    Parser: Python  Expression: !SUB_REGION! + " " + !STATE_ABBR! 

    转换为正确的大小写形式

    下列各例显示的是转换单词的不同方法,这些方法可使每个单词的首字母变为大写、其余字母变为小写。

     
    Parser: Python  Expression: ' '.join([i.capitalize() for i in !STATE_NAME!.split(' ')]) 
     
    Parser: Python  Expression: string.capwords(!STATE_NAME!, ' ')  Expression Type: import string 
     
    Parser: Python  Expression: MySub(!STATE_NAME!)  Code Block: def MySub(myfieldname):  import string   return string.capwords(myfieldname, ' ') 

    累加计算和顺序计算

    根据某间隔值计算顺序 ID 或数字。

    Parser: Python  Expression: autoIncrement()  Code Block: rec=0 def autoIncrement():  global rec  pStart = 1 #adjust start value, if req'd   pInterval = 1 #adjust interval value, if req'd  if (rec == 0):    rec = pStart   else:    rec = rec + pInterval   return rec 

    计算数值字段的累加值。

    Parser: Python  Expression: accumulate(!FieldA!)  Code Block: total = 0 def accumulate(increment):  global total  if total:   total += increment  else:   total = increment  return total 

    计算数值字段的百分比增量。

    Parser: Python  Expression: percentIncrease(float(!FieldA!))  Code Block: lastValue = 0 def percentIncrease(newValue):  global lastValue  if lastValue:   percentage = ((newValue - lastValue) / lastValue)  * 100  else:    percentage = 0  lastValue = newValue  return percentage 

    随机值

    通过 numpy 站点包来计算 0.0 和 1.0 之间的随机浮点值。

    Parser: Python  Expression: getRandomValue()  Code Block: import numpy.random as R  def getRandomValue():     return R.random() 

  • 相关阅读:
    UVA 11925 Generating Permutations 生成排列 (序列)
    UVA 1611 Crane 起重机 (子问题)
    UVA 11572 Unique snowflakes (滑窗)
    UVA 177 PaperFolding 折纸痕 (分形,递归)
    UVA 11491 Erasing and Winning 奖品的价值 (贪心)
    UVA1610 PartyGame 聚会游戏(细节题)
    UVA 1149 Bin Packing 装箱(贪心)
    topcpder SRM 664 div2 A,B,C BearCheats , BearPlays equalPiles , BearSorts (映射)
    UVA 1442 Cave 洞穴 (贪心+扫描)
    UVA 1609 Foul Play 不公平竞赛 (构(luan)造(gao)+递归)
  • 原文地址:https://www.cnblogs.com/gisoracle/p/4345693.html
Copyright © 2011-2022 走看看