ジオメトリの読み取り
フィーチャクラス内の各フィーチャには、ポリゴンまたはラインの頂点を定義するポイントのセットか、ポイント フィーチャを定義する単一の座標が含まれています。これらのポイントにアクセスするには、ジオメトリ オブジェクト(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@X | フィーチャの X 座標の 2 倍 |
SHAPE@Y | フィーチャの Y 座標の 2 倍 |
SHAPE@Z | フィーチャの Z 座標の 2 倍 |
SHAPE@M | フィーチャの M 値の 2 倍 |
SHAPE@JSON | ジオメトリを表す esri JSON 文字列 |
SHAPE@WKB | OGC ジオメトリの WKB(Well-Known Binary)表現。ジオメトリ値の汎用的な表現が、連続的なバイト ストリームとして提供されます。 |
SHAPE@WKT | OGC ジオメトリの WKT(Well-Known Text)表現。ジオメトリ値の汎用的な表現が、テキスト文字列として提供されます。 |
SHAPE@AREA | フィーチャの面積の 2 倍 |
SHAPE@LENGTH | フィーチャの長さの 2 倍 |
ポイント ジオメトリの読み取り
次に示す例では、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("{0}, {1}".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 {0}:".format(row[0]))
# For each point in the multipoint feature,
# print the x,y coordinates
for pnt in row[1]:
print("{0}, {1}".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 multipoint's ID
#
print("Feature {0}:".format(row[0]))
partnum = 0
# Step through each part of the feature
#
for part in row[1]:
# Print the part number
#
print("Part {0}:".format(partnum))
# Step through each vertex in the feature
#
for pnt in part:
if pnt:
# Print x,y coordinates of current point
#
print("{0}, {1}".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