ジオメトリの作成

Insert カーソルと Update カーソルを使用して、スクリプトからフィーチャクラスにフィーチャを作成したり、既存のフィーチャを更新したりすることができます。 スクリプトでフィーチャを定義するには、Point オブジェクトを作成して、そのプロパティを設定し、Array に追加します。 さらに、その配列と PolygonPolylinePointGeometryMultipoint ジオメトリ クラスを使用して、フィーチャのジオメトリを設定できます。

import arcpy
fc = "c:/data/gdb.gdb/roads"
cursor = arcpy.da.InsertCursor(fc, ["SHAPE@"])
array = arcpy.Array([arcpy.Point(-77.4349451, 37.5408265),
                     arcpy.Point(-78.6384349, 35.7780943)])
spatial_reference = arcpy.SpatialReference(4326)
polyline = arcpy.Polyline(array, spatial_reference)

cursor.insertRow([polyline])

上記のように、単一のジオメトリ パートはポイントの配列によって定義されます。 同様に、同じカーソルを使用して、ポイントの配列からマルチパート フィーチャを作成できます。

first_part = arcpy.Array([arcpy.Point(-77.4349451, 37.5408265),
                          arcpy.Point(-78.6384349, 35.7780943)])
second_part = arcpy.Array([arcpy.Point(-79.7910143, 36.0786785),
                           arcpy.Point(-80.8546435, 35.2315402)])

array = arcpy.Array([first_part, second_part])
spatial_reference = arcpy.SpatialReference(4326)
multipart_feature = arcpy.Polyline(array, spatial_reference)

cursor.insertRow([multipart_feature])

ポイント フィーチャを作成する場合、単一のポイント オブジェクトを使用してポイント フィーチャのジオメトリを設定します。 SHAPE@XY トークン (必要に応じて SHAPE@M トークンと SHAPE@Z トークン) を使用すると、ポイントをより簡単 (かつ効率的) に作成できます。

import arcpy

# fc is a point feature class
fc = "c:/data/gdb.gdb/stops"
cursor = arcpy.da.InsertCursor(fc, ["SHAPE@XY"])
xy = (5997594.4753, 2069901.75682)

cursor.insertRow([xy])

すべてのジオメトリは、フィーチャクラスに作成される前に整合チェックされます。 ジオメトリが挿入前に単純化される際に、リングの方向の誤り、自身と交差するポリゴンなどの問題が修正されます。

次の例は、(coords_list で定義された) 一連の線形座標を含む座標セットを読み取り、それらを使用してフィーチャクラスを作成します。

# Create a new line feature class using a text file of coordinates.
#   Each coordinate entry is semicolon delimited in the format of ID;X;Y
import arcpy
import os

# List of coordinates (ID, X, Y)
coords_list = [[1, -61845879.0968, 45047635.4861], 
               [1, -3976119.96791, 46073695.0451],
               [1, 1154177.8272, -25134838.3511],
               [1, -62051091.0086, -26160897.9101],
               [2, 17365918.8598, 44431999.7507],
               [2, 39939229.1582, 45252847.3979],
               [2, 41170500.6291, 27194199.1591],
               [2, 17981554.5952, 27809834.8945],
               [3, 15519011.6535, 11598093.8619],
               [3, 52046731.9547, 13034577.2446],
               [3, 52867579.6019, -16105514.2317],
               [3, 17160706.948, -16515938.0553]]

# The output feature class to be created
outFC = arcpy.GetParameterAsText(0)

# Get the template feature class
template = arcpy.GetParameterAsText(1)

cur = None
try:
    # Create the output feature class
    arcpy.CreateFeatureclass_management(os.path.dirname(outFC),
                                        os.path.basename(outFC), 
                                        "POLYLINE", template)

    # Access spatial reference of template to define spatial
    # reference of geometries
    spatial_reference = arcpy.Describe(template).spatialReference

    # Open an insert cursor for the new feature class
    cur = arcpy.da.InsertCursor(outFC, ["SHAPE@"])

    # Create an array object needed to create features
    array = arcpy.Array()

    # Initialize a variable for keeping track of a feature's ID.
    ID = -1
    for coords in coords_list: 
        if ID == -1:
            ID = coords[0]

        # Add the point to the feature's array of points
        #   If the ID has changed, create a new feature
        if ID != coords[0]:
            cur.insertRow([arcpy.Polyline(array)])
            array.removeAll()
        array.add(arcpy.Point(coords[1], coords[2], ID=coords[0]))
        ID = coords[0]

    # Add the last feature
    polyline = arcpy.Polyline(array, spatial_reference)
    cur.insertRow([polyline])


except Exception as e:
    print(e)
finally:
    # Clean up the cursor if necessary
    if cur:
        del cur

マルチパート ポリゴン、ポリライン フィーチャ、内部リングを含むポリゴン フィーチャを作成するには、はじめに配列の配列を作成します。 次に、これを Polygon クラスと Polyline クラスに渡します。

座標のリストからのジオメトリの作成

座標のリストからジオメトリを作成することもできます。 この方法では、ジオメトリ オブジェクト作成のオーバーヘッドが削減されるため、パフォーマンスが向上します。 ただし、これはシングルパート フィーチャ、およびポリゴンの場合は内部リングを含まないものに限られます。 すべての座標は、フィーチャクラスの空間参照の単位である必要があります。

以下の例では、x,y ペアのリストから 1 つのポリライン フィーチャが作成されます。

import arcpy

coordinates = [(-117.2000424, 34.0555514), 
               (-117.2000788, 34.0592066), 
               (-117.1957315, 34.0592309), 
               (-117.1956951, 34.0556001)]

# Create a feature class with a spatial reference of GCS WGS 1984
result = arcpy.management.CreateFeatureclass(
    arcpy.env.scratchGDB, "esri_square", "POLYLINE", spatial_reference=4326)
feature_class = result[0]

# Write feature to new feature class
with arcpy.da.InsertCursor(feature_class, ['SHAPE@']) as cursor:
    cursor.insertRow([coordinates])

同様に、以下の例では、x,y,z 座標のリストから 1 つの 3D ポリライン フィーチャが作成されます。

import arcpy

coordinates = [(-117.2000424, 34.0555514, 1), 
               (-117.2000788, 34.0592066, 2), 
               (-117.1957315, 34.0592309, 5), 
               (-117.1956951, 34.0556001, 2)]

# Create a feature class with a spatial reference of GCS WGS 1984
result = arcpy.management.CreateFeatureclass(
    arcpy.env.scratchGDB, "esri_square_z", "POLYLINE", has_z="ENABLED", 
    spatial_reference=4326)
feature_class = result[0]

# Write feature to new feature class
with arcpy.da.InsertCursor(feature_class, ['SHAPE@']) as cursor:
    cursor.insertRow([coordinates])