আমি আরকিপি এপিআই-তে এমন কোনও কিছু সম্পর্কে অবগত নই যা আপনার জন্য স্কেলিংটি করবে তবে এটি করার জন্য একটি ফাংশন লিখতে তুলনামূলক সহজ।
নীচের কোডটি 2 ডি বৈশিষ্ট্যগুলির জন্য স্কেলিং করে এবং এম বা জেড মানগুলিকে বিবেচনা করে না:
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 গুণ হিসাবে বড়, ইত্যাদি) এবং একটি alচ্ছিক রেফারেন্স পয়েন্ট সহ কল করতে পারেন:
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
একটি একক বহুভুজ নিয়ে যায় এবং প্রতিটি শীর্ষবিন্দুর মধ্য দিয়ে লুপ করে, এটি থেকে একটি রেফারেন্স পয়েন্টের দূরত্ব পরিমাপ করে (ডিফল্টরূপে, বহুভুজের সেন্ট্রয়েড)।
তারপরে নতুন 'স্কেলড' শীর্ষবিন্দু তৈরি করতে প্রদত্ত স্কেল দিয়ে সেই দূরত্বটি স্কেল করা হয়।
স্কেলিংটি মূল প্রান্তিকের মধ্য দিয়ে রেফারেন্স পয়েন্ট থেকে স্কেলিং দৈর্ঘ্যে মূলত একটি রেখা অঙ্কন করে করা হয়, লাইনটির শেষের সাথে মাপের প্রান্তে পরিণত হয়।
কোণ এবং ঘূর্ণন স্টাফ রয়েছে কারণ এটি একক অক্ষের সাথে রেখার শেষের অবস্থান গণনা করার জন্য আরও সোজা এগিয়ে রয়েছে এবং তারপরে এটি 'স্থানে' ঘোরানো হয়।