আর্কম্যাপে উন্নত সম্পাদনা সরঞ্জামদণ্ডের স্কেল সরঞ্জামের মতো বহুভুজকে পুনরায় আকার দেওয়ার জন্য কি আরকিপি সরঞ্জাম রয়েছে?


17

আমি আর্কজিআইএস 10.3 এর জন্য পাইথন স্ক্রিপ্ট লিখছি। আমি Scale toolআর্কজিআইএস ইন্টারফেসের বিষয়ে জানি তবে আমি এই জাতীয় আরকিপি কমান্ডটি পাই না। এটি বিদ্যমান?

যেমন আপনি ছবিতে দেখতে পাচ্ছেন Scale toolকাজগুলি এর চেয়ে আলাদা কাজ করে Buffer tool- এটি মূল বহুভুজের আকার পরিবর্তন করে। সুতরাং প্রশ্নটি হ'ল:

আমি কি Scale toolআরকিপি ব্যবহার করে (আরকজিআইএস ইন্টারফেস থেকে উপলব্ধ) ব্যবহার করতে পারি?

এখানে চিত্র বর্ণনা লিখুন


2
পুরানো বহুভুজ বাফারিং এবং অপসারণ সম্পর্কে কীভাবে !? ইতিবাচক এবং নেতিবাচক মানগুলির সাথে বাফার ব্যবহার করা যেতে পারে!
ফরিদ চেরাগি

প্রশ্নটি বিদ্যমান আরকি সরঞ্জাম সম্পর্কে, বহুভুজকে কীভাবে পুনরায় আকার দেবেন সে সম্পর্কে নয়।
মিঃ চে

আপনার শিরোনাম, প্রশ্ন এবং মন্তব্য একে অপরের সাথে মতবিরোধপূর্ণ বলে মনে হচ্ছে। প্রদত্ত সদৃশ প্রশ্নগুলি যদি আপনার প্রশ্নের উত্তর না দেয়, তবে আপনি কি অনুগ্রহ করে আপনার প্রশ্নটি সম্পাদনা করতে পারবেন তবে আপনি কী করছেন?
হারুন

1
@ মিঃচে বাফার সরঞ্জামটি আরকিপি-র মাধ্যমে পাইথন স্ক্রিপ্টিংয়ে ব্যবহার করা যেতে পারে B বাফার_অ্যানালাইসিস (...)
ফরিদ চেরাগি

এটি সুপার! উদাহরণস্বরূপ সমস্ত বৈশিষ্ট্য ০.৫ দ্বারা স্কেল না করে আমি কীভাবে প্রতিটি বৈশিষ্ট্য বর্গকে টেবিলের একটি সংখ্যা দ্বারা আপডেট করতে পারি? ধন্যবাদ
user1655130

উত্তর:


27

আমি আরকিপি এপিআই-তে এমন কোনও কিছু সম্পর্কে অবগত নই যা আপনার জন্য স্কেলিংটি করবে তবে এটি করার জন্য একটি ফাংশন লিখতে তুলনামূলক সহজ।

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

স্কেলিংটি মূল প্রান্তিকের মধ্য দিয়ে রেফারেন্স পয়েন্ট থেকে স্কেলিং দৈর্ঘ্যে মূলত একটি রেখা অঙ্কন করে করা হয়, লাইনটির শেষের সাথে মাপের প্রান্তে পরিণত হয়।
কোণ এবং ঘূর্ণন স্টাফ রয়েছে কারণ এটি একক অক্ষের সাথে রেখার শেষের অবস্থান গণনা করার জন্য আরও সোজা এগিয়ে রয়েছে এবং তারপরে এটি 'স্থানে' ঘোরানো হয়।


1
আমি এই স্ক্রিপ্টটি পরীক্ষা করেছি এবং এটি দুর্দান্ত কাজ করে। তুমি জেনিয়াস! =) অনেক অনেক। আমি এই প্রশ্নটি অযৌক্তিক রেখে দেব যাতে আরও লোকেরা এটি "ভবিষ্যতের প্রশ্নগুলিতে" দেখতে পাবে।
মিঃ চে

1
আমি দেখতে পেলাম যে যখন আমি একটি গর্ত দিয়ে বহুভুজটি প্রক্রিয়া করার চেষ্টা করি - এর ফলস্বরূপ স্ক্রিপ্ট ক্র্যাশ হয়ে যায় bdist = refgeom.distanceTo(apnt)। আপনি কি তা পরীক্ষা করে ঠিক করতে পারবেন?
মিঃ চে

@ মিঃচে উফস, আমি ভুলে গিয়েছিলাম যে আরকিপি একই অ্যারেতে বহুভুজ অংশের সমস্ত রিং ফেরত দেয়। রিংগুলি নাল পয়েন্ট দ্বারা পৃথক করা হয়। এটি একটি সহজ সমাধান, দয়া করে সম্পাদনাটি দেখুন।
এভিল জিনিয়াস

হ্যালো. স্ক্রিপ্ট কীভাবে কাজ করে তার একটি ছোট্ট ব্যাখ্যা পাওয়া সম্ভব, আমি কোডিংয়ে খারাপ, এবং সমস্ত লাইন পাচ্ছি না, এইভাবে এটি আমার পক্ষে কাজ করছে না, দয়া করে?
পিটার

@ পিটার অবশ্যই, আমি কী চলছে তার একটি সংক্ষিপ্ত ব্যাখ্যা যুক্ত করেছি। এটি স্ট্যান্ড একা স্ক্রিপ্ট বলতে বোঝানো হয়নি, তবে আপনার নিজের স্ক্রিপ্টে একীভূত করার জন্য এমন কিছু। নীচের কোড স্নিপেট এটি কীভাবে ব্যবহৃত হতে পারে তার একটি উদাহরণ দেখায়।
দুষ্ট জিনিয়াস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.