キーボードで値を入力する以外の方法でも、テーブル内の値を編集することができます。単一レコードまたはすべてのレコードのフィールド値を設定するために、数学的な計算を実行したい場合があります。すべてのレコードまたは選択したレコードについて、単純なものから高度なものまでさまざまな計算を実行することができます。さらに、属性テーブルのフィールドで、面積、長さ、周長、およびその他のジオメトリ プロパティを計算することもできます。以下の各セクションでは、フィールド演算を使用する例を示しています。演算は、Python または VBScript のどちらかを使用して実行できます。
Python は ArcGIS に推奨されるスクリプト言語です。フィーチャ ジオメトリをはじめとするジオプロセシング機能にアクセスする場合は Python を使用してください。ArcGIS のスクリプト言語に Python を採用することにより、多くの機会で計算を実行できるようになります。
VBA または VBScript を使用した経験があり、スクリプト構文を十分に理解している場合は、VBScript を使用してください。以前のバージョンの ArcGIS で保存された *.cal ファイルをそのまま、または最小限の修正を加えて使用できます。ArcObjects を使用する以前のリリースの VBA コードがある場合は、計算を修正する必要があります。
簡単な演算
単純な文字列の例
文字列は、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! は値が "abcde" の文字列フィールドであるとします。
例 | 説明 | 結果 |
---|---|---|
!fieldname![0] | 最初の文字 | "a" |
!fieldname![-2] | 最後から 2 つ目の文字 | "d" |
!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 パーサーと VBScript パーサーがサポートされます。
パーサー | コード ブロック |
---|---|
Python | Python の機能がサポートされます。コード ブロックは、Python 関数 (def) を使用して表現されます。ジオメトリ プロパティは、必要に応じてポイント オブジェクトなどのジオプロセシング オブジェクトを使用して表現されます。 |
VBScript | 演算は VBScript を使用して実行されます。 |
Python 関数は、キーワード def の後に関数の名前と関数の入力引数を付けて定義します。Python 関数は、任意の数の入力引数 (引数がない場合も含む) を使って記述できます。値は、return ステートメントを使用して各関数から返されます。関数名は自由に作成できます (スペースや、名前の最初に数字を使用することはできません)。
サンプル コード - 数学
フィールドの値を小数点以下第 2 位に四捨五入します。
条件式:
round(!area!, 2)
形式 (P):
Python
数学モジュールを使用して、メートルをフィートに変換します。変換した値を 2 乗し、さらに面積で乗算します。
形式 (P):
Python
条件式:
MetersToFeet((float(!shape.area!)))
コード ブロック:
def MetersToFeet(area):
return math.pow(3.2808, 2) * area
Python での論理を使用したフィールド演算
フィールドの値に基づいて分類します。
形式 (P):
Python
条件式:
Reclass(!WELL_YIELD!)
コード ブロック:
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 での論理を使用したフィールド演算
式の値に応じて、ステートメントのグループを条件付きで実行します。
形式 (P):
VB Script
条件式:
density
コード ブロック:
Dim density
If [POP90_SQMI] < 100 Then
density = "low"
elseif [POP90_SQMI] < 300 Then
density = "medium"
else
density = "high"
end if
サンプル コード - ジオメトリ
フィーチャの面積を計算します。
形式 (P):
Python
条件式:
!shape.area!
フィーチャの最大 X 座標を計算します。
形式 (P):
Python
条件式:
!shape.extent.XMax!
フィーチャの頂点数を計算します。
形式 (P):
Python
条件式:
MySub(!shape!)
コード ブロック:
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 だけシフトします。
形式 (P):
Python
条件式:
shiftXCoordinate(!SHAPE!)
コード ブロック:
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
フィーチャの長さをヤード単位で計算します。
形式 (P):
Python
条件式:
!shape.length@yards!
フィーチャの面積をエーカー単位で計算します。
形式 (P):
Python
条件式:
!shape.area@acres!
geodesicArea の後に測定単位のキーワードが続く、geodesicLength および @ プロパティを使用して、測地線に基づく面積や長さも計算できます。
フィーチャの測地線の長さをヤード単位で計算します。
形式 (P):
Python
条件式:
!shape.geodesicLength@yards!
フィーチャの測地線の面積をエーカー単位で計算します。
形式 (P):
Python
条件式:
!shape.geodesicArea@acres!
サンプル コード - 日付
現在の日付を計算します。
形式 (P):
Python
条件式:
time.strftime("%d/%m/%Y")
現在の日付と時刻を計算します。
形式 (P):
Python
条件式:
datetime.datetime.now()
2000 年 12 月 31 になるように日付を計算します。
形式 (P):
Python
条件式:
datetime.datetime(2000, 12, 31)
現在の日付とフィールド内の値との間の日数を計算します。
形式 (P):
Python
条件式:
(datetime.datetime.now() - arcpy.time.ParseDateTimeString(!field1!)).days
フィールド内の日付の値に 100 日を加算して、日付を計算します。
形式 (P):
Python
条件式:
arcpy.time.ParseDateTimeString(!field1!) + datetime.timedelta(days=100)
フィールド内の日付の値の曜日 (Sunday (日曜) など) を計算します。
形式 (P):
Python
条件式:
arcpy.time.ParseDateTimeString(!field1!).strftime('%A')
サンプル コード - 文字列
右端から 3 つ目の文字を返します。
形式 (P):
Python
条件式:
!SUB_REGION![-3:]
大文字の「P」をすべて小文字の「p」で置き換えます。
形式 (P):
Python
条件式:
!STATE_NAME!.replace("P","p")
2 つのフィールドを、スペースを区切り文字に使用して連結します。
形式 (P):
Python
条件式:
!SUB_REGION! + " " + !STATE_ABBR!
適切な大文字と小文字への変換
次の例は、すべての単語の最初の文字が大文字に、それ以外の文字が小文字になるように単語を変換するための異なる方法を示しています。
形式 (P):
Python
条件式:
' '.join([i.capitalize() for i in !STATE_NAME!.split(' ')])
形式 (P):
Python
条件式:
!STATE_NAME!.title()
正規表現
Python の re モジュールには正規表現のマッチング演算が用意されており、これを使用すると、文字列に対して複雑なパターン マッチングと置換ルールを実行できます。
文字列の末尾にある St または St. という単語を、Street という単語で置換します。
形式 (P):
Python
条件式:
update_street(!ADDRESS!)
コード ブロック:
import re
def update_street(street_name):
return re.sub(r"""\b(St|St.)\Z""",
'Street',
street_name)
累積計算と連続計算
特定の間隔に基づいて連続する ID または数値を計算します。
形式 (P):
Python
条件式:
autoIncrement()
コード ブロック:
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
数値フィールドの累積値を計算します。
形式 (P):
Python
条件式:
accumulate(!FieldA!)
コード ブロック:
total = 0
def accumulate(increment):
global total
if total:
total += increment
else:
total = increment
return total
数値フィールドのパーセントの増分を計算します。
形式 (P):
Python
条件式:
percentIncrease(float(!FieldA!))
コード ブロック:
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 の間のランダムな浮動小数の値を計算します。
形式 (P):
Python
条件式:
getRandomValue()
コード ブロック:
import numpy
def getRandomValue():
return numpy.random.random()
NULL 値の計算
Python 式では、Python None を使用して NULL 値を計算できます。
Python None を使用した NULL 値の計算
形式 (P):
Python
条件式:
None