フィールド演算の例

キーボードで値を入力する以外の方法でも、テーブル内の値を編集することができます。単一レコードまたはすべてのレコードのフィールド値を設定するために、数学的な計算を実行したいことがあります。すべてのレコードまたは選択したレコードについて、単純なものから高度なものまでさまざまな計算を実行することができます。さらに、属性テーブルのフィールドで、面積、長さ、周長、およびその他のジオメトリ プロパティを計算することもできます。以下の各セクションでは、フィールド演算を使用する例を示しています。演算は、Python または VBScript のどちらかを使用して実行できます。

Python は ArcGIS に推奨されるスクリプト言語です。フィーチャ ジオメトリをはじめとするジオプロセシング機能にアクセスする場合は Python を使用してください。ArcGIS 10.0 のスクリプト言語に Python を採用することにより、多くの機会で計算を実行できるようになります。

VBA または VBScript を使用した経験があり、スクリプト構文を十分に理解している場合は、VBScript を使用してください。以前のバージョンの ArcGIS で保存された *.cal ファイルを利用できるか、または最小限の修正で利用できるようになる可能性があります。ArcObjects を使用する以前のリリースの VBA コードがある場合は、10.0 で利用できるようにするために計算を修正する必要があります。

注意注意:
  • Python では、インデントが構文の一部として実行されます。それぞれの論理レベルの定義には、2 つまたは 4 つのスペースを使用します。ステートメント ブロックの開始位置と終了位置を揃え、一貫性を保ってください。
  • Python の計算式フィールドは感嘆符(!!)で囲みます。
  • 変数に名前を付けるときは、Python では大文字と小文字が区別されることに注意してください。つまり、「yield」と「Yield」は同じではありません。
  • VBScript では、どのデータ タイプも明示的に宣言することができません。すべての変数は暗黙的に Variant になります。「Dim x as String」のようなステートメントは削除するか、「Dim x」のように単純化する必要があります。
  • ステートメントを入力した後でファイルに書き込むには、[保存] をクリックします。[読み込み] ボタンをクリックすると、既存の計算ファイルを検索して選択するためのプロンプトが表示されます。

簡単な計算

単純な文字列の例

文字列は、Python の一連の文字列関数(capitalizerstripreplace など)でサポートされます。

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]

最後から 2 つ目の文字

"e"

!fieldname![1:4]

2 つ目、3 つ目、4 つ目、5 つ目の文字

"bcd"

Python では、% 演算子を使用した文字列の書式設定もサポートされます。

FieldA と FieldB をコロンで区切って結合します。

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

VBScript の文字列関数

文字列は、VBScript の一連の文字列関数(LeftInStrChrt など)でサポートされます。次に、フィールド演算でよく使用される文字列関数を使用した VBScript の例をいくつか示します。

Left 関数:文字列の左から順に、指定された数の文字を含む Variant(String)を返します。

MyStr = Left([MyField], 1)

Right 関数:文字列の右から順に、指定された数の文字を含む Variant(String)を返します。

MyStr = Right([MyField], 1)

Mid 関数:文字列から指定された数の文字を含む Variant(String)を返します。

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 関数:ある文字列が別の文字列に最初に出現した位置を指定する Variant(Long)を返します。

MyPosition = InStr([address], " ")

Replace 関数:指定されたサブ文字列を指定された回数だけ別のサブ文字列で置換した文字列を返します。

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

Chr 関数:指定された文字コードに関連付けられている文字を含む String を返します。

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

& 演算子:2 つの式の文字列連結を強制的に実行する場合に使用します。

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

簡単な数学の例

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 パーサと VB Script パーサがサポートされます。

パーサ

コード ブロック

Python

Python の機能がサポートされます。コード ブロックは Python 関数(def)を使用して表現されます。ジオメトリ プロパティは、必要に応じてポイント オブジェクトなどのジオプロセシング オブジェクトを使用して表現されます。

VB Script

計算は VBScript を使用して実行されます。

Python 関数は、キーワード def の後に関数の名前と関数の入力パラメータを付けて定義します。値は、return ステートメントを使用して各関数から返されます。関数名は自由に作成できます(スペースや、名前の最初に数字を使用することはできません)。

フィールド演算の使用
注意注意:

Python では、インデントが構文の一部として実行されることを忘れないでください。それぞれの論理レベルの定義には、2 つまたは 4 つのスペースを使用します。ステートメント ブロックの開始位置と終了位置を揃え、一貫性を保ってください。

サンプル コード - 数学

フィールドの値を小数点以下第 2 位に四捨五入します。

Expression:
round(!area!,2)

Parser:
Python

数学モジュールを使用して、メートルをフィートに変換します。変換した値を 2 乗し、さらに面積で乗算します。

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

ジオメトリ単位の変換

ジオメトリ フィールドの形状および長さのプロパティは、@ 記号を付けて表現した単位の種類を使用して変更することができます。

注意注意:

データが地理座標系で格納され、距離単位(たとえば、フィート)が指定されている場合、長さの計算は測地線アルゴリズムを使用して変換されます。

注意注意:

地理座標系で表されるデータで面積単位を変換すると、グローブ全体で度(10 進)が一定でないため、正確な結果となりません。

フィーチャの長さをヤード単位で計算します。

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")

サンプル コード - 文字列

右端から 3 つ分の文字を返します。

Parser:
Python

Expression:
!SUB_REGION![-3:]

大文字の「P」をすべて小文字の「p」で置き換えます。

Parser:
Python

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

2 つのフィールドを、スペースを区切り文字に使用して連結します。

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()

関連項目


7/10/2012