フィールド演算の例
キーボードで値を入力する以外の方法でも、テーブル内の値を編集することができます。単一レコードまたはすべてのレコードのフィールド値を設定するために、数学的な計算を実行したいことがあります。すべてのレコードまたは選択したレコードについて、単純なものから高度なものまでさまざまな計算を実行することができます。さらに、属性テーブルのフィールドで、面積、長さ、周長、およびその他のジオメトリ プロパティを計算することもできます。以下の各セクションでは、フィールド演算を使用する例を示しています。演算は、Python または VBScript のどちらかを使用して実行できます。
Python は ArcGIS に推奨されるスクリプト言語です。フィーチャ ジオメトリをはじめとするジオプロセシング機能にアクセスする場合は Python を使用してください。ArcGIS のスクリプト言語に Python を採用することにより、多くの機会で計算を実行できるようになります。
VBA または VBScript を使用した経験があり、スクリプト構文を十分に理解している場合は、VBScript を使用してください。以前のバージョンの ArcGIS で保存された *.cal ファイルを利用できるか、または最小限の修正で利用できるようになる可能性があります。ArcObjects を使用する以前のリリースの VBA コードがある場合は、計算を修正する必要があります。
- Python では、インデントが構文の一部として実行されます。それぞれの論理レベルの定義には、2 つまたは 4 つのスペースを使用します。ステートメント ブロックの開始位置と終了位置を揃え、一貫性を保ってください。
- Python の計算式フィールドは感嘆符(!!)で囲みます。
- 変数に名前を付けるときは、Python では大文字と小文字が区別されることに注意してください。つまり、「yield」と「Yield」は同じではありません。
- VBScript では、どのデータ タイプも明示的に宣言することができません。すべての変数は暗黙的に Variant になります。「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] |
最後から 2 つ目の文字 |
"e" |
!fieldname![1:4] |
2 つ目、3 つ目、4 つ目の文字 |
"bcd" |
Python では、str.format() メソッドを使用した文字列の書式設定もサポートされています。
FieldA と FieldB をコロンで区切って結合します。
"{}:{}".format(!FieldA!, !FieldB!)
VBScript の文字列関数
文字列は、VBScript の一連の文字列関数でサポートされています。これには、Left、InStr、Chr などがあります。次に、フィールド演算でよく使用される文字列関数を使用した 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 の数学規則が適用されます。たとえば、2 つの整数値を除算すると、必ず整数の出力が生成されます(3 / 2 = 1)。小数値を出力するには、次のようにします。
- 演算中の数字の 1 つを小数値にします。 3.0/2 = 1.5.
- 値を小数に明示的に変換するには、float 関数を使用します。
float(3)/2 = 1.5
float(!Population!) / !Area!
組み込み Python 関数
Python では、max、min、round、sum など、多数の組み込み関数を使用できます。
フィールドのリストの各レコードに対する最大値を計算します。
max([!field1!, !field2!, !field3!])
フィールドのリストの各レコードに対する最大値を計算します。
sum([!field1!, !field2!, !field3!])
コード ブロックの使用
Python の条件式とコード ブロック パラメータを使用すると、次のことが可能になります。
- 任意の Python 関数の条件式での使用
- ジオプロセシング機能およびオブジェクトへのアクセス
- フィーチャ ジオメトリのプロパティへのアクセス
- 新しいランダム値演算子へのアクセス
- If...Then...Else 論理を使用した値の再分類
- その他のジオプロセシング ツールの使用
コード ブロックの使用方法は、条件式の種類によって決まります。[フィールド演算(Calculate Field)] ツールでは、PYTHON、PYTHON_9.3、VB が条件式の種類としてサポートされます。
条件式の種類 |
コード ブロック |
---|---|
PYTHON_9.3 |
Python の機能がサポートされます。コード ブロックは、Python 関数(def)を使用して表現されます。ジオメトリ プロパティは、必要に応じてポイント オブジェクトなどのジオプロセシング オブジェクトを使用して表現されます。 |
PYTHON |
PYTHON_9.3 と同じですが、ジオメトリ オブジェクトではなく文字列が返されます。 |
VB |
計算は VBScript を使用して実行されます。 |
Python 関数は、キーワード def の後に関数の名前と関数の入力引数を付けて定義します。Python 関数は、任意の数の入力引数(引数がない場合も含む)を使って記述できます。値は、return ステートメントを使用して各関数から返されます。関数名は自由に作成できます(スペースや、名前の最初に数字を使用することはできません)。
Python では、インデントが構文の一部として実行されることを忘れないでください。それぞれの論理レベルの定義には、2 つまたは 4 つのスペースを使用します。ステートメント ブロックの開始位置と終了位置を揃え、一貫性を保ってください。
サンプル コード - 数学
フィールドの値を小数点以下第 2 位に四捨五入します。
Expression:
round(!area!, 2)
Expression Type:
PYTHON_9.3
数学モジュールを使用して、メートルをフィートに変換します。変換した値を 2 乗し、さらに面積で乗算します。
Expression:
MetersToFeet((float(!shape.area!)))
Expression Type:
PYTHON_9.3
Code Block:
import math
def MetersToFeet(area):
return math.pow(3.2808, 2) * area
Python での論理を使用したフィールド演算
フィールドの値に基づいて分類します。
Expression:
Reclass(!WELL_YIELD!)
Expression Type:
PYTHON_9.3
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 での論理を使用したフィールド演算
式の値に応じて、ステートメントのグループを条件付きで実行します。
Expression:
density
Expression Type:
VB
Code Block:
Dim density
If [POP90_SQMI] < 100 Then
density = "low"
elseif [POP90_SQMI] < 300 Then
density = "medium"
else
density = "high"
end if
サンプル コード - ジオメトリ
ジオメトリ単位の変換の詳細については、この後の「ジオメトリ単位の変換」のセクションをご参照ください。
フィーチャの面積を計算します。
Expression:
!shape.area!
Expression Type:
PYTHON_9.3
フィーチャの最大 X 座標を計算します。
Expression:
!shape.extent.XMax!
Expression Type:
PYTHON_9.3
フィーチャの頂点数を計算します。
Expression:
MySub(!shape!)
Expression Type:
PYTHON_9.3
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 だけシフトします。
Expression:
shiftXCoordinate(!SHAPE!)
Expression Type:
PYTHON_9.3
Code Block:
def shiftXCoordinate(shape):
shiftValue = 100
point = shape.getPart(0)
point.X += shiftValue
return point
ジオメトリ単位の変換
ジオメトリ フィールドの面積および長さのプロパティは、@ 記号を付けて表現した単位の種類を使用して変更することができます。
- 面積計測単位のキーワード:
- ACRES | ARES | HECTARES | SQUARECENTIMETERS | SQUAREDECIMETERS | SQUAREINCHES | SQUAREFEET | SQUAREKILOMETERS | SQUAREMETERS | SQUAREMILES | SQUAREMILLIMETERS | SQUAREYARDS | SQUAREMAPUNITS | UNKNOWN
- 長さ計測単位のキーワード:
- CENTIMETERS | DECIMALDEGREES | DECIMETERS | FEET | INCHES | KILOMETERS | METERS | MILES | MILLIMETERS | NAUTICALMILES | POINTS | UNKNOWN | YARDS
データが地理座標系で格納され、距離単位(たとえば、フィート)が指定されている場合、長さの計算は測地線アルゴリズムを使用して変換されます。
地理座標系で表されるデータで面積単位を変換すると、グローブ全体で度(10 進)が一定でないため、正確な結果となりません。
フィーチャの長さをヤード単位で計算します。
Expression:
!shape.length@yards!
Expression Type:
PYTHON_9.3
フィーチャの面積をエーカー単位で計算します。
Expression:
!shape.area@acres!
Expression Type:
PYTHON_9.3
@ の後に測定単位のキーワードが続く、geodesicArea および geodesicLength プロパティを使用して、測地線に基づく面積や長さも計算できます。
フィーチャの測地線の長さをヤード単位で計算します。
Expression:
!shape.geodesicLength@yards!
Expression Type:
PYTHON_9.3
フィーチャの測地線の面積をエーカー単位で計算します。
Expression:
!shape.geodesicArea@acres!
Expression Type:
PYTHON_9.3
サンプル コード - 日付
現在の日付を計算します。
Expression:
time.strftime("%d/%m/%Y")
Expression Type:
PYTHON_9.3
現在の日付と時刻を計算します。
Expression:
time.strftime("%d/%m/%Y %H:%M")
Expression Type:
PYTHON_9.3
サンプル コード - 文字列
右端から 3 つ目の文字を返します。
Expression:
!SUB_REGION![-3:]
Expression Type:
PYTHON_9.3
大文字の「P」をすべて小文字の「p」で置き換えます。
Expression:
!STATE_NAME!.replace("P","p")
Expression Type:
PYTHON_9.3
2 つのフィールドを、スペースを区切り文字に使用して連結します。
Expression:
!SUB_REGION! + " " + !STATE_ABBR!
Expression Type:
PYTHON_9.3
適切な大文字と小文字への変換
次の例は、すべての単語の最初の文字が大文字に、それ以外の文字が小文字になるように単語を変換するための異なる方法を示しています。
Expression:
' '.join([i.capitalize() for i in !STATE_NAME!.split(' ')])
Expression Type:
PYTHON_9.3
Expression:
!STATE_NAME!.title()
Expression Type:
PYTHON_9.3
正規表現
Python の re モジュールには正規表現のマッチング演算が用意されており、これを使用すると、文字列に対して複雑なパターン マッチングと置換ルールを実行できます。
文字列の末尾にある St または St. という単語を、Street という単語で置換します。
Expression:
update_street(!ADDRESS!)
Expression Type:
PYTHON_9.3
Code Block:
import re
def update_street(street_name):
return re.sub(r"""\b(St|St.)\Z""",
'Street',
street_name)
累積計算と連続計算
特定の間隔に基づいて連続する ID または数値を計算します。
Expression:
autoIncrement()
Expression Type:
PYTHON_9.3
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
数値フィールドの累積値を計算します。
Expression:
accumulate(!FieldA!)
Expression Type:
PYTHON_9.3
Code Block:
total = 0
def accumulate(increment):
global total
if total:
total += increment
else:
total = increment
return total
数値フィールドのパーセントの増分を計算します。
Expression:
percentIncrease(float(!FieldA!))
Expression Type:
PYTHON_9.3
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 の間のランダムな浮動小数の値を計算します。
Expression:
getRandomValue()
Expression Type:
PYTHON_9.3
Code Block:
import numpy
def getRandomValue():
return numpy.random.random()
NULL 値の計算
Python 式では、Python None を使用して NULL 値を計算できます。
次の計算は、フィールドに NULL 値が許可されている場合のみ機能します。
Python None を使用した NULL 値の計算
Expression:
"None"
Expression Type:
PYTHON_9.3