フィールド演算の例
キーボードで値を入力する以外の方法でも、テーブル内の値を編集することができます。単一レコードまたはすべてのレコードのフィールド値を設定するために、数学的な計算を実行したいことがあります。すべてのレコードまたは選択したレコードについて、単純なものから高度なものまでさまざまな計算を実行することができます。さらに、属性テーブルのフィールドで、面積、長さ、周長、およびその他のジオメトリ プロパティを計算することもできます。以下の各セクションでは、フィールド演算を使用する例を示しています。演算は、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 つめ、5 つめの文字 |
"bcd" |
Python では、% 演算子を使用した文字列の書式設定もサポートされます。
FieldA と FieldB をコロンで区切って結合します。
"%s:%s" % (!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 論理を使用した値の再分類
- その他のジオプロセシング ツールの使用
コード ブロックの使用方法は、使用するパーサによって決まります。フィールド演算では Python パーサと VB Script パーサがサポートされます。
パーサ |
コード ブロック |
---|---|
Python |
Python の機能がサポートされます。コード ブロックは Python 関数(def)を使用して表現されます。ジオメトリ プロパティは、必要に応じてポイント オブジェクトなどのジオプロセシング オブジェクトを使用して表現されます。 |
VB Script |
計算は VBScript を使用して実行されます。 |
Python 関数は、キーワード def の後に関数の名前と関数の入力引数を付けて定義します。Python 関数は、任意の数の入力引数(引数がない場合も含む)を使って記述できます。値は、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:
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
ジオメトリ単位の変換
ジオメトリ フィールドの形状および長さのプロパティは、@ 記号を付けて表現した単位の種類を使用して変更することができます。
- 面積計測単位のキーワード:
- 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 進)が一定でないため、正確な結果となりません。
フィーチャの長さをヤード単位で計算します。
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!, ' ')
Code Block:
import string
Parser:
Python
Expression:
MySub(!STATE_NAME!)
Code Block:
def MySub(myfieldname):
import string
return string.capwords(myfieldname, ' ')
正規表現
Python の re モジュールでは、正規表現のマッチング演算を使用できます。これを利用して、文字列に対して複雑なパターン マッチングと置換ルールを実行できます。
文字列の末尾にある St または St. という単語を、Street という単語で置換します。
Parser:
Python
Expression:
update_street(!ADDRESS!)
Code Block:
import re
def update_street(street_name):
return re.sub(r"""\b(St|St.)\Z""",
'Street',
street_name)
累積計算と連続計算
特定の間隔に基づいて連続する 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()
NULL 値の計算
Python 式では、Python None を使用して NULL 値を計算できます。
次の計算は、フィールドに NULL 値が許可されている場合のみ機能します。
Python None を使用した NULL 値の計算
Parser:
Python
Expression:
None