Saya tidak mengetahui apa pun di arcpy API yang akan melakukan penskalaan untuk Anda, tetapi menulis fungsi untuk melakukannya akan relatif sederhana.
Kode di bawah ini melakukan penskalaan untuk fitur 2D, dan tidak memperhitungkan nilai M atau Z akun:
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)
Anda dapat menyebutnya dengan objek geometri, faktor skala (1 = ukuran yang sama, 0,5 = ukuran setengah, 5 = 5 kali lebih besar, dll.), Dan titik referensi opsional:
scale_geom(some_geom, 1.5)
Gunakan ini bersama dengan kursor untuk skala seluruh kelas fitur, dengan asumsi kelas fitur tujuan sudah ada:
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
sunting: inilah contoh menggunakan perkiraan geometri pengujian Anda, untuk 0,5 dan 5 kali:
Juga diuji dengan poligon multi-cincin (lubang)!
Penjelasan, seperti yang diminta:
scale_geom
mengambil satu poligon dan loop melalui setiap titik, mengukur jarak dari itu ke titik referensi (secara default, centroid dari poligon).
Jarak itu kemudian diskalakan oleh skala yang diberikan untuk membuat titik 'skala' baru.
Penskalaan dilakukan dengan menggambar garis pada dasarnya pada skala panjang dari titik referensi melalui titik asli, dengan ujung garis menjadi titik skala.
Sudut dan benda rotasi ada di sana karena lebih lurus ke depan untuk menghitung posisi ujung garis sepanjang sumbu tunggal dan kemudian memutarnya 'ke tempatnya.'