残念ながら、フィーチャの既存のジオメトリに新しい値を直接割り当てることはできません。新しいジオメトリオブジェクトを作成し、その新しいオブジェクトでフィーチャのシェイプフィールドを更新する必要があります。幸い、配列オブジェクトにはreplace
メソッドがあります。したがって、配列内のポイントのX座標を直接変更するのではなく、次のことを行う必要があります。
arcpy.Point
正しい座標で新しいオブジェクトを作成します(すでにこれを行っているようです)
- 行のShapeフィールドに格納されている配列オブジェクトのコピーを取得します
replace
メソッドを使用して、変更した点で配列内の目的の点を設定します
- その配列で新しいポリラインオブジェクトを作成する
- 行オブジェクトの
setValue
メソッドを使用して、Shapeフィールドを新しい正しいポリラインで更新します。
- カーソルオブジェクトの
updateRow
メソッドを使用して、変更された行をデータセットに挿入します。
具体的には:
for r in cur:
ary = r.getValue("SHAPE").getPart(0)
ary.replace(0,correct_point_object) # first arg 0 replaces the first point in the line
newLine = arcpy.Polyline(ary)
r.setValue("SHAPE",newLine)
cur.updateRow(r)
このreplace
メソッドはインデックスと値を取ることに注意してください。残念ながら、それは配列の最後のポイントへのインデックスとして例えば-1を受け入れません。しかし、あなたは言うことができますmy_array[my_array.count]
。
X座標を別の場所で事前計算し、後で取得しているようです。これが事実である場合、私はおそらくあなたが全体を行き、正しい座標を計算している間に、各ラインの正しいポイントで新しいポリラインオブジェクトを作成するでしょう。これはおそらくより簡単でクリーンになります。そうすれば、コードはより
row_num = 0
for r in cur:
r.setValue(shapeField,correct_geometry_list[row_num])
cur.updateRow(r)
row_num += 1
少なくとも私にとっては、これはもう少し明確です...しかしそれは文体です!
追加して編集:
コメントにこれを収めることができませんでした。あなたのコードを見なければ、それがどこに転倒しているのかを知るのは難しい。これは私のために動作する完全にテストされたスクリプトです。参考にしてください。ここでは、2つのパスを実行するのではなく、古いジオメトリから直接新しいジオメトリを計算していることに注意してください。スナップ位置の計算方法によっては、これが可能である場合とできない場合があります。また、今回はreplace
、必要に応じて、メソッドを使用するのではなく、古い配列に基づいて新しい配列を構築しています。
import arcpy
def offsetPoint(old_point,X_distance,Y_distance):
"""Trivial function to offset a point - replace with what you're
actually doing."""
new_point = arcpy.Point(old_point.X+X_distance,
old_point.Y+Y_distance)
return new_point
def offsetFirstPointInLine(line_geom,X_distance,Y_distance):
"""Takes a Polyline geometry object and returns a new Polyline with
the first point of the first part offset by the distance given."""
array = line_geom.getPart(0)
first_point = array[0]
new_point = offsetPoint(first_point,X_distance,Y_distance)
# Build a new array with your new point in the 0th position, and
# the rest of the points from the old array.
new_array = arcpy.Array([new_point]+
[array.getObject(x) for x in range(1,array.count)])
# Then make a new Polyline object with that array.
new_line = arcpy.Polyline(new_array)
return new_line
fc = r"C:\Users\student\Documents\ArcGIS\Default.gdb\SomeStorms"
cur = arcpy.UpdateCursor(fc)
for r in cur:
geom = r.getValue("SHAPE")
r.setValue("SHAPE",offsetFirstPointInLine(geom,-45000,-5000))
cur.updateRow(r)
del r,cur
うまくいけば、それはそれをクリアするのに役立ちます。