ArcGIS Desktop

  • ドキュメント
  • サポート

  • My Profile
  • ヘルプ
  • Sign Out
ArcGIS Desktop

ArcGIS Online

組織のマッピング プラットフォーム

ArcGIS Desktop

完全なプロ仕様の GIS

ArcGIS Enterprise

エンタープライズ GIS

ArcGIS for Developers

位置情報利用アプリの開発ツール

ArcGIS Solutions

各種業界向けの無料のテンプレート マップおよびテンプレート アプリケーション

ArcGIS Marketplace

組織で使えるアプリとデータを取得

  • ドキュメント
  • サポート
Esri
  • サイン イン
user
  • マイ プロフィール
  • サイン アウト

ArcMap

  • ホーム
  • はじめに
  • マップ
  • 解析
  • データ管理
  • ツール
  • エクステンション

フィールド演算の例

  • 簡単な演算
  • 組み込み Python 関数
  • コード ブロックの使用
  • サンプル コード - 数学
  • Python での論理を使用したフィールド演算
  • VBScript での論理を使用したフィールド演算
  • サンプル コード - ジオメトリ
  • ジオメトリ単位の変換
  • サンプル コード - 日付
  • サンプル コード - 文字列
  • 累積計算と連続計算
  • ランダム値
  • NULL 値の計算

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

式:
round(!area!, 2)
式のタイプ:
PYTHON_9.3

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

式:
MetersToFeet((float(!shape.area!)))
式のタイプ:
PYTHON_9.3
コード ブロック:
import math
def MetersToFeet(area):
    return math.pow(3.2808, 2) * area

Python での論理を使用したフィールド演算

フィールドの値に基づいて分類します。

式:
Reclass(!WELL_YIELD!)
式のタイプ:
PYTHON_9.3
コード ブロック:
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 での論理を使用したフィールド演算

式の値に応じて、ステートメントのグループを条件付きで実行します。

式:
density
式のタイプ:
VB
コード ブロック:
Dim density
If [POP90_SQMI] < 100 Then
density = "low"
elseif [POP90_SQMI] < 300 Then
density = "medium"
else
density = "high"
end if

サンプル コード - ジオメトリ

注意:

ジオメトリ単位の変換の詳細については、この後の「ジオメトリ単位の変換」のセクションをご参照ください。

フィーチャの面積を計算します。

式:
!shape.area!
式のタイプ:
PYTHON_9.3

フィーチャの最大 X 座標を計算します。

式:
!shape.extent.XMax!
式のタイプ:
PYTHON_9.3

フィーチャの頂点数を計算します。

式:
MySub(!shape!)
式のタイプ:
PYTHON_9.3
コード ブロック:
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 だけシフトします。

式:
shiftXCoordinate(!SHAPE!)
式のタイプ:
PYTHON_9.3
コード ブロック:
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 進) が一定でないため、正確な結果となりません。

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

式:
!shape.length@yards!
式のタイプ:
PYTHON_9.3

フィーチャの面積をエーカー単位で計算します。

式:
!shape.area@acres!
式のタイプ:
PYTHON_9.3

@ の後に測定単位のキーワードが続く、geodesicArea および geodesicLength プロパティを使用して、測地線に基づく面積や長さも計算できます。

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

式:
!shape.geodesicLength@yards!
式のタイプ:
PYTHON_9.3

フィーチャの測地線の面積をエーカー単位で計算します。

式:
!shape.geodesicArea@acres!
式のタイプ:
PYTHON_9.3

サンプル コード - 日付

現在の日付を計算します。

式:
time.strftime("%d/%m/%Y")
式のタイプ:
PYTHON_9.3

現在の日付と時刻を計算します。

式:
datetime.datetime.now()
式のタイプ:
PYTHON_9.3

2000 年 12 月 31日になるように日付を計算します。

式:
datetime.datetime(2000, 12, 31)
式のタイプ:
PYTHON_9.3

現在の日付とフィールド内の値との間の日数を計算します。

式:
(datetime.datetime.now() - arcpy.time.ParseDateTimeString(!field1!)).days
式のタイプ:
PYTHON_9.3

フィールド内の日付の値に 100 日を加算して、日付を計算します。

式:
arcpy.time.ParseDateTimeString(!field1!) + datetime.timedelta(days=100)
式のタイプ:
PYTHON_9.3

フィールド内の日付の値の曜日 (Sunday (日曜) など) を計算します。

式:
arcpy.time.ParseDateTimeString(!field1!).strftime('%A')
式のタイプ:
PYTHON_9.3

サンプル コード - 文字列

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

式:
!SUB_REGION![-3:]
式のタイプ:
PYTHON_9.3

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

式:
!STATE_NAME!.replace("P","p")
式のタイプ:
PYTHON_9.3

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

式:
!SUB_REGION! + " " + !STATE_ABBR!
式のタイプ:
PYTHON_9.3

適切な大文字と小文字への変換

次の例は、すべての単語の最初の文字が大文字に、それ以外の文字が小文字になるように単語を変換するための異なる方法を示しています。

式:
' '.join([i.capitalize() for i in !STATE_NAME!.split(' ')])
式のタイプ:
PYTHON_9.3

式:
!STATE_NAME!.title()
式のタイプ:
PYTHON_9.3

正規表現

Python の re モジュールには正規表現のマッチング演算が用意されており、これを使用すると、文字列に対して複雑なパターン マッチングと置換ルールを実行できます。

文字列の末尾にある St または St. という単語を、Street という単語で置換します。

式:
update_street(!ADDRESS!)
式のタイプ:
PYTHON_9.3
コード ブロック:
import re
def update_street(street_name):
    return re.sub(r"""\b(St|St.)\Z""",  
                  'Street',
                  street_name)

累積計算と連続計算

特定の間隔に基づいて連続する ID または数値を計算します。

式:
autoIncrement()
式のタイプ:
PYTHON_9.3
コード ブロック:
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

数値フィールドの累積値を計算します。

式:
accumulate(!FieldA!)
式のタイプ:
PYTHON_9.3
コード ブロック:
total = 0
def accumulate(increment):
    global total
    if total:
        total += increment
    else:
        total = increment
    return total

数値フィールドのパーセントの増分を計算します。

式:
percentIncrease(float(!FieldA!))
式のタイプ:
PYTHON_9.3
コード ブロック:
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 の間のランダムな浮動小数の値を計算します。

式:
getRandomValue()
式のタイプ:
PYTHON_9.3
コード ブロック:
import numpy
def getRandomValue():
    return numpy.random.random()

NULL 値の計算

Python 式では、Python None を使用して NULL 値を計算できます。

注意:

次の計算は、フィールドに NULL 値が許可されている場合のみ機能します。

Python None を使用した NULL 値の計算

式:
"None"
式のタイプ:
PYTHON_9.3

ArcGIS Desktop

  • ホーム
  • ドキュメント
  • サポート

ArcGIS プラットフォーム

  • ArcGIS Online
  • ArcGIS Desktop
  • ArcGIS Enterprise
  • ArcGIS for Developers
  • ArcGIS Solutions
  • ArcGIS Marketplace

Esri について

  • 会社概要
  • 採用情報
  • スタッフ ブログ
  • ユーザ カンファレンス
  • デベロッパ サミット
Esri
ご意見・ご感想をお寄せください。
© Copyright 2016 Environmental Systems Research Institute, Inc. | プライバシー | リーガル