ฉันไม่ทราบว่ามีอะไรใน arcpy API ที่จะทำการปรับขนาดให้คุณ แต่การเขียนฟังก์ชั่นให้ทำนั้นค่อนข้างง่าย
โค้ดด้านล่างทำการปรับขนาดสำหรับคุณสมบัติ 2D และไม่คำนึงถึงค่า M หรือ Z:
import arcpy
import math
def scale_geom(geom, scale, reference=None):
"""Returns geom scaled to scale %"""
if geom is None: return None
if reference is None:
# we'll use the centroid if no reference point is given
reference = geom.centroid
refgeom = arcpy.PointGeometry(reference)
newparts = []
for pind in range(geom.partCount):
part = geom.getPart(pind)
newpart = []
for ptind in range(part.count):
apnt = part.getObject(ptind)
if apnt is None:
# polygon boundaries and holes are all returned in the same part.
# A null point separates each ring, so just pass it on to
# preserve the holes.
newpart.append(apnt)
continue
bdist = refgeom.distanceTo(apnt)
bpnt = arcpy.Point(reference.X + bdist, reference.Y)
adist = refgeom.distanceTo(bpnt)
cdist = arcpy.PointGeometry(apnt).distanceTo(bpnt)
# Law of Cosines, angle of C given lengths of a, b and c
angle = math.acos((adist**2 + bdist**2 - cdist**2) / (2 * adist * bdist))
scaledist = bdist * scale
# If the point is below the reference point then our angle
# is actually negative
if apnt.Y < reference.Y: angle = angle * -1
# Create a new point that is scaledist from the origin
# along the x axis. Rotate that point the same amount
# as the original then translate it to the reference point
scalex = scaledist * math.cos(angle) + reference.X
scaley = scaledist * math.sin(angle) + reference.Y
newpart.append(arcpy.Point(scalex, scaley))
newparts.append(newpart)
return arcpy.Geometry(geom.type, arcpy.Array(newparts), geom.spatialReference)
คุณสามารถเรียกมันด้วยวัตถุเรขาคณิตมาตราส่วน (1 = ขนาดเดียวกัน 0.5 = ขนาดครึ่ง 5 = 5 เท่าใหญ่ ฯลฯ ) และจุดอ้างอิงทางเลือก:
scale_geom(some_geom, 1.5)
ใช้สิ่งนี้ร่วมกับเคอร์เซอร์เพื่อขยายคลาสคุณลักษณะทั้งหมดโดยสมมติว่ามีระดับคุณลักษณะปลายทางอยู่แล้ว:
incur = arcpy.da.SearchCursor('some_folder/a_fgdb.gdb/orig_fc', ['OID@','SHAPE@'])
outcur = arcpy.da.InsertCursor('some_folder/a_fgdb.gdb/dest_fc', ['SHAPE@'])
for row in incur:
# Scale each feature by 0.5 and insert into dest_fc
outcur.insertRow([scale_geom(row[1], 0.5)])
del incur
del outcur
แก้ไข: นี่คือตัวอย่างโดยใช้การประมาณรูปทรงเรขาคณิตการทดสอบของคุณสำหรับ 0.5 และ 5 เท่า:
ทดสอบด้วยรูปหลายเหลี่ยมหลายรู (หลุม)!
คำอธิบายตามที่ร้องขอ:
scale_geom
ใช้รูปหลายเหลี่ยมเดียวและวนซ้ำในแต่ละจุดสุดยอดวัดระยะทางจากจุดนั้นไปยังจุดอ้างอิง (โดยค่าเริ่มต้นคือ centroid ของรูปหลายเหลี่ยม)
ระยะทางนั้นจะถูกปรับสัดส่วนด้วยสเกลที่กำหนดเพื่อสร้างจุดสุดยอด 'ปรับ' ใหม่
การปรับสเกลทำได้โดยการวาดเส้นที่ความยาวที่ปรับจากจุดอ้างอิงผ่านจุดสุดยอดเดิมโดยที่จุดสิ้นสุดของเส้นจะกลายเป็นจุดสุดยอดที่ปรับขนาด
สิ่งที่มุมและการหมุนอยู่ที่นั่นเพราะมันตรงไปข้างหน้ามากขึ้นในการคำนวณตำแหน่งของจุดสิ้นสุดของเส้นตามแกนเดียวแล้วหมุน 'เข้าที่'