Answers:
此代码应使用ArcGIS 10.1中arcpy.da.UpdateCursor随附的SHAPE @ XY令牌进行此操作。
import arcpy
# Set some variables
fc = r"C:\temp\test.gdb\testFC"
fc2 = r"C:\temp\test.gdb\testFCcopy"
xOffset = 0.001
yOffset = 0.001
# Code to make a copy which will have its coordinates moved (and can be compared with original)
if arcpy.Exists(fc2):
arcpy.Delete_management(fc2)
arcpy.Copy_management(fc,fc2)
# Perform the move
with arcpy.da.UpdateCursor(fc2, ["SHAPE@XY"]) as cursor:
for row in cursor:
cursor.updateRow([[row[0][0] + xOffset,row[0][1] + yOffset]])
这里使用的编码模式来自ArcPyCafé。
我赞扬@ artwork21带领我找到了最终解决方案。实际上,我在ArcGIS 10.0联机帮助文章中找到了一个几乎完整的脚本,称为“ 计算字段示例 ”,该子类别在“ 代码示例-几何 ”和“ 对于点要素类,将每个点的x坐标偏移100 ”下列出
我在ModelBuilder“计算字段”工具中使用的最终脚本是:
表达:
shiftXYCoordinates(!SHAPE!,%ShiftX%,%ShiftY%)
其中ShiftX和ShiftY是在ModelBuilder画布上定义的变量(作为参数)。
表达式类型:
PYTHON_9.3
代码块:
def shiftXYCoordinates(shape,x_shift,y_shift):
point = shape.getPart(0)
point.X += float(x_shift)
point.Y += float(y_shift)
return point
由于所有模型都在选定的集合上工作,因此您还应该能够将其创建为可与其他模型构建器会话中的其他模型/工具结合使用的通用工具。我创建的非常简单的模型(作为“插入”其他模型以移动坐标值)看起来像这样。这样,我可以在每个选择集的基础上控制移位(在其他模型中定义):
它像一种魅力一样工作,谢谢大家的投入!
您也可以使用此字段计算器脚本来移动要素位置:
def XYsetVALUE( shape, X_value, Y_value):
myMoveX = 0.001
myMoveY = 0.001
point = shape.getPart(0)
point.X = X_value + myMoveX
point.Y = Y_value + myMoveY
return point
XYsetVALUE(!SHAPE !,!X_COORD !,!Y_COORD!)
您可以使用上面的函数在模型中包括一个额外的“计算字段”方法。
我调整了解决方案以将点移动/移位到特定方向(角度)和给定距离。
好像:
def shiftXYCoordinates(shape,angle,distance):
point = shape.getPart(0)
point.Y += distance * math.cos(math.radians(angle))
point.X += distance * math.sin(math.radians(angle))
return point
如果您的点要素具有字段“角度”(或者当然具有常数),则将其命名为shiftXYCoordinates(!SHAPE !,!Angle!,5000)。角度应以十进制度数给出。0将“上移”,90上“右”等。在创建带状图索引要素并将其转换为点后,我得到了它们。
还要确保在运行前选择字段名称“ Shape” :)
(解决方案已在ArcMap 10.0 SP5中测试)
如您所见,当您访问游标令牌时,在10.1中要容易得多。
import arcpy
# Code to move features in copy of same dataset
fc = r"C:\temp\test.gdb\testFC"
fc2 = r"C:\temp\test.gdb\testFCcopy"
xOffset = 0.001
yOffset = 0.001
if arcpy.Exists(fc2):
arcpy.Delete_management(fc2)
arcpy.Copy_management(fc, fc2)
shape = arcpy.Describe(fc2).ShapeFieldName
cursor = arcpy.UpdateCursor(fc2)
for row in cursor:
point = row.getValue(shape).getPart()
row.setValue(shape, arcpy.Point(point.X + xOffset, point.Y + yOffset))
cursor.updateRow(row)
del point, row, cursor
这适用于10.0:
# Featureclass here
FC = r'featureclass'
fcount = 0
shapefield = arcpy.Describe(FC).shapeFieldName
featureUpdate = arcpy.UpdateCursor(FC)
for f in featureUpdate:
# Hard coded shifts but easy enough to set up a lookup function if needed
sLon = 0.001
sLat = 0.001
# Optional but I like to count to see where it is at in the process
if fcount % 1000 == 0:
print('Updating feature %s...' %(fcount))
# Get the original value
cF = f.getValue(shapefield)
cPNT = cF.getPart()
# Create a new point with the shifted value
sPNT = arcpy.Point(cPNT.X - sLon, cPNT.Y - sLAT)
# Set the shapefield to the new point and update feature
f.setValue(shapefield, sPNT)
featureUpdate.updateRow(f)
fcount += 1
del featureUpdate