Tôi không biết bất cứ điều gì trong API phức tạp sẽ làm thay đổi tỷ lệ cho bạn, nhưng viết một hàm để làm điều đó sẽ tương đối đơn giản.
Mã bên dưới thực hiện chia tỷ lệ cho các tính năng 2D và không tính đến các giá trị M hoặc 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)
Bạn có thể gọi nó với một đối tượng hình học, hệ số tỷ lệ (1 = cùng kích thước, 0,5 = một nửa kích thước, lớn gấp 5 lần, v.v.) và một điểm tham chiếu tùy chọn:
scale_geom(some_geom, 1.5)
Sử dụng kết hợp với các con trỏ để mở rộng toàn bộ lớp tính năng, giả sử lớp tính năng đích đã tồn tại:
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
chỉnh sửa: đây là một ví dụ sử dụng xấp xỉ hình học thử nghiệm của bạn, trong 0,5 và 5 lần:
Cũng được thử nghiệm với đa giác nhiều vòng (lỗ)!
Một lời giải thích, theo yêu cầu:
scale_geom
lấy một đa giác đơn và các vòng lặp qua mỗi đỉnh, đo khoảng cách từ nó đến một điểm tham chiếu (theo mặc định, tâm của đa giác).
Khoảng cách đó sau đó được chia tỷ lệ theo tỷ lệ được đưa ra để tạo đỉnh 'tỷ lệ' mới.
Việc chia tỷ lệ được thực hiện bằng cách cơ bản vẽ một đường ở độ dài tỷ lệ từ điểm tham chiếu qua đỉnh ban đầu, với điểm cuối của đường trở thành đỉnh được chia tỷ lệ.
Công cụ góc và xoay là ở đó bởi vì nó thẳng hơn để tính toán vị trí của điểm cuối dọc theo một trục duy nhất và sau đó xoay nó 'vào vị trí'.