क्या आर्कपेज़ में एडवांस एडिटिंग टूलबार के स्केल टूल की तरह बहुभुज के लिए आर्कपी टूल है?


17

मैं आर्कगिस 10.3 के लिए एक पायथन स्क्रिप्ट लिख रहा हूं। मुझे Scale toolआर्कजीआईएस इंटरफ़ेस के बारे में पता है लेकिन मुझे इस तरह की आर्कपी कमांड नहीं मिल रही है। वह मौजूद है?

जैसा कि आप चित्र पर Scale toolकाम करता है अलग से देख सकते हैं Buffer tool- यह मूल बहुभुज के रूप को बदलता है। तो सवाल यह है:

क्या मैं Scale toolआर्कपी का उपयोग करके (आर्कजीआईएस इंटरफेस से उपलब्ध) उपयोग कर सकता हूं?

यहाँ छवि विवरण दर्ज करें


2
कैसे के बारे में बफरिंग और पुराने बहुभुज को हटाने !? सकारात्मक और नकारात्मक मूल्यों के साथ बफर का उपयोग किया जा सकता है!
फरीद चराघी

सवाल मौजूदा चापलूसी उपकरण के बारे में है, बहुभुज का आकार बदलने के बारे में नहीं।
श्री चे

आपका शीर्षक, प्रश्न और टिप्पणी एक-दूसरे के साथ अजीब लगती है। यदि प्रदान किए गए डुप्लिकेट प्रश्न आपके प्रश्न का उत्तर नहीं देते हैं, तो क्या आप अपने प्रश्न को संपादित करने के लिए स्पष्ट कर सकते हैं कि आप क्या हैं?
हारून

1
@ Mr.Che बफर टूल का उपयोग आर्कटिक के
फरीद चेरगही

यह सुपर है! मैं उदाहरण के लिए 0.5 से सभी सुविधाओं को मापने के बजाय एक तालिका में एक संख्या द्वारा प्रत्येक सुविधा वर्ग को कैसे अपडेट कर सकता हूं? धन्यवाद
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 बार बड़े, आदि), और एक वैकल्पिक संदर्भ बिंदु के साथ कह सकते हैं:

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)। क्या आप परीक्षण करके उसे ठीक कर सकते हैं?
श्री चे।

@ Mr.Che उफ़, मैं भूल गया कि आर्कपी एक ही सरणी में एक बहुभुज भाग के सभी छल्ले लौटाता है। अंगूठियां अशक्त बिंदुओं से अलग हो जाती हैं। यह एक आसान समाधान है, कृपया संपादन देखें।
ईविल जीनियस

नमस्कार। क्या यह संभव है कि स्क्रिप्ट कैसे काम करती है, इसकी एक छोटी सी व्याख्या करना संभव है, मैं कोडिंग में खराब हूं, और सभी लाइनें नहीं मिल रही हैं, इस प्रकार यह मेरे लिए काम नहीं कर रहा है, कृपया?
पीटर

@ गैपर ज़रूर, मैंने जो कुछ किया है उसका संक्षिप्त विवरण जोड़ा है। इसका मतलब केवल एक अकेले लिपि का होना नहीं है, बल्कि कुछ को अपनी स्वयं की लिपि में एकीकृत करना है। निचला कोड स्निपेट एक उदाहरण दिखाता है कि इसका उपयोग कैसे किया जा सकता है।
ईविल जीनियस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.