フィーチャクラス内の各フィーチャには、ポリゴンまたはラインの頂点を定義するポイントのセットか、ポイント フィーチャを定義する単一の座標が含まれています。これらのポイントにアクセスするには、ジオメトリ オブジェクト (Polygon、Polyline、PointGeometry、または MultiPoint) を使用します。このオブジェクトは、Point オブジェクトの配列にこれらのポイントを返します。
フィーチャは複数のパートで構成されます。ジオメトリ オブジェクトの partCount プロパティは、フィーチャのパートの数を返します。getPart メソッドは、インデックスが指定されている場合には、ジオメトリの特定のパートに対応するポイント オブジェクトの配列を返します。インデックスが指定されていない場合は、それぞれのジオメトリ パートに対応するポイント オブジェクトの配列を含む配列が返されます。
PointGeometry フィーチャの場合は、ポイント オブジェクトの配列の代わりに単一の Point オブジェクトが返されます。その他すべてのフィーチャ タイプ、つまりポリゴン、ポリライン、およびマルチポイントの場合は、ポイント オブジェクトの配列が 1 つ返されるか、またはポイント オブジェクトの複数の配列を含む配列が返されます (フィーチャが複数のパートから構成される場合)。
ポリゴンに穴がある場合、ポリゴンはいくつかのリングで構成されます。ポリゴンに対して返されるポイント オブジェクトの配列には、外側のリングと内側のリングすべてに対応するポイントが格納されます。外側のリングは常に最初に返され、続いて内側のリングが返されます。リング間の区切りには NULL ポイント オブジェクトが使用されます。ジオデータベースまたはシェープファイル内のポリゴンの座標をスクリプトが読み取るときに、内側のリングの情報をスクリプトが必要としている場合は、内側のリングを処理するためのロジックがスクリプトに組み込まれている必要があります。そうでなければ、外側のリングのみが読み取られます。
マルチパート フィーチャは、複数の物理的なパートで構成されますが、データベース内の 1 つの属性セットのみを参照します。たとえば、州のレイヤーでは、ハワイ州をマルチパート フィーチャと考えることができます。ハワイ州は多数の島で構成されますが、データベースには 1 つのフィーチャとして記録されます。
リングは、2 次元のエリアを定義する閉じたパスです。有効なリングは、有効なパスで構成されます。有効なパスとは、リングの始点と終点の x,y 座標が同じであるものです。時計回りのリングは外側のリング、反時計回りのリングは内側のリングを定義します。
ジオメトリ トークンの使用
すべてのジオメトリ オブジェクトにアクセスする代わりに、ジオメトリ トークンをショートカットとして使用することもできます。その他のジオメトリ トークンを使用して、特定のジオメトリ情報にアクセスできます。完全なジオメトリにアクセスするのはかなり時間がかかります。ジオメトリの特定のプロパティのみが必要な場合は、ショートカットとなるトークンを使用してジオメトリのプロパティにアクセスしてください。たとえば、SHAPE@XY は、フィーチャの重心を表す X 座標と Y 座標の組み合わせを返します。
トークン | 説明 |
---|---|
SHAPE@ | フィーチャのジオメトリ オブジェクト |
SHAPE@XY | フィーチャの重心を表す X 座標と Y 座標の組み合わせ |
SHAPE@TRUECENTROID | フィーチャの重心を表す X 座標と Y 座標の組み合わせ SHAPE@XY と同じ値が返されます。 |
SHAPE@X | フィーチャの X 座標 (Double) |
SHAPE@Y | フィーチャの Y 座標 (Double) |
SHAPE@Z | フィーチャの Z 座標 (Double) |
SHAPE@M | フィーチャの M 値 (Double) |
SHAPE@JSON | ジオメトリを表す Esri JSON 文字列 |
SHAPE@WKB | OGC ジオメトリの WKB (Well-Known Binary) 表現。ジオメトリ値の汎用的な表現が、連続的なバイト ストリームとして提供されます。 |
SHAPE@WKT | OGC ジオメトリの WKT (Well-Known Text) 表現。ジオメトリ値の汎用的な表現が、テキスト文字列として提供されます。 |
SHAPE@AREA | フィーチャの面積 (Double) |
SHAPE@LENGTH | フィーチャの長さ (Double) |
ポイント ジオメトリの読み取り
次に示す例では、SearchCursor を使用して、すべてのフィーチャの座標を出力します。
import arcpy
infc = arcpy.GetParameterAsText(0)
# Enter for loop for each feature
for row in arcpy.da.SearchCursor(infc, ["SHAPE@XY"]):
# Print x,y coordinates of each point feature
x, y = row[0]
print("{}, {}".format(x, y))
前記のフィーチャクラスに対して、このスクリプトは次の情報を返します。
2.0 4.0
8.0 10.0
7.0 5.0
マルチポイント ジオメトリの読み取り
import arcpy
infc = arcpy.GetParameterAsText(0)
# Enter for loop for each feature
for row in arcpy.da.SearchCursor(infc, ["OID@", "SHAPE@"]):
# Print the current multipoint's ID
print("Feature {}:".format(row[0]))
# For each point in the multipoint feature,
# print the x,y coordinates
for pnt in row[1]:
print("{}, {}".format(pnt.X, pnt.Y))
前記のフィーチャクラスに対して、このスクリプトは次の情報を返します。
Feature 0:
3.0 8.0
4.0 4.0
6.0 6.0
Feature 1:
5.0 9.0
8.0 10.0
Feature 2:
9.0 5.0
ポリラインまたはポリゴン ジオメトリの読み取り
import arcpy
infc = arcpy.GetParameterAsText(0)
# Enter for loop for each feature
for row in arcpy.da.SearchCursor(infc, ["OID@", "SHAPE@"]):
# Print the current polygon or polyline's ID
print("Feature {}:".format(row[0]))
partnum = 0
# Step through each part of the feature
for part in row[1]:
# Print the part number
print("Part {}:".format(partnum))
# Step through each vertex in the feature
for pnt in part:
if pnt:
# Print x,y coordinates of current point
print("{}, {}".format(pnt.X, pnt.Y))
else:
# If pnt is None, this represents an interior ring
print("Interior Ring:")
partnum += 1
前記のフィーチャクラスに対して、このスクリプトは次の情報を返します。フィーチャ 0 は単一のパートからなるポリゴン、フィーチャ 1 は 2 つのパートからなるポリゴン、フィーチャ 2 は内側のリングを含む単一のパートからなるポリゴンです。
Feature 0:
Part 0:
3.0 8.0
1.0 8.0
2.0 10.0
3.0 8.0
Feature 1:
Part 0:
5.0 3.0
3.0 3.0
3.0 5.0
5.0 3.0
Part 1:
7.0 5.0
5.0 5.0
5.0 7.0
7.0 5.0
Feature 2:
Part 0:
9.0 11.0
9.0 8.0
6.0 8.0
6.0 11.0
9.0 11.0
Interior Ring:
7.0 10.0
7.0 9.0
8.0 9.0
8.0 10.0
7.0 10.0