มีเครื่องมือ ArcPy สำหรับปรับขนาดรูปหลายเหลี่ยมเช่นเครื่องมือปรับขนาดของแถบเครื่องมือการแก้ไขขั้นสูงใน ArcMap หรือไม่?


17

ฉันกำลังเขียนสคริปต์ไพ ธ อนสำหรับ ArcGIS 10.3 ฉันรู้เกี่ยวกับScale toolอินเทอร์เฟซ ArcGIS แต่ไม่พบคำสั่ง arcpy มันมีอยู่จริง?

อย่างที่คุณเห็นบนรูปภาพScale toolผลงานที่แตกต่างกว่าBuffer tool- มันเปลี่ยนรูปแบบของรูปหลายเหลี่ยมดั้งเดิม ดังนั้นคำถามคือ:

ฉันสามารถใช้Scale tool(พร้อมใช้งานจากส่วนต่อประสาน ArcGIS) โดยใช้ arcpy ได้หรือไม่?

ป้อนคำอธิบายรูปภาพที่นี่


2
วิธีการเกี่ยวกับการบัฟเฟอร์และการลบรูปหลายเหลี่ยมเก่า! บัฟเฟอร์สามารถใช้กับค่าบวกและค่าลบ!
Farid Cheraghi

คำถามเกี่ยวกับเครื่องมือ arcpy ที่มีอยู่ไม่ใช่เกี่ยวกับวิธีการปรับขนาดรูปหลายเหลี่ยม
นายเช

ชื่อคำถามและความคิดเห็นของคุณดูเหมือนจะขัดแย้งกัน หากคำถามซ้ำซ้อนที่ให้ไว้ไม่ตอบคำถามของคุณคุณสามารถแก้ไขคำถามของคุณเพื่ออธิบายสิ่งที่คุณเป็น
แอรอน

1
เครื่องมือ @ Mr.Che Buffer สามารถใช้ในการสร้างสคริปต์ไพธ อน
Farid Cheraghi

นี่มันสุดยอดมาก! ฉันจะอัปเดตคุณลักษณะทุกคลาสด้วยตัวเลขในตารางแทนที่จะปรับขนาดคุณลักษณะทั้งหมดด้วย 0.5 ได้อย่างไร ขอบคุณ
user1655130

คำตอบ:


27

ฉันไม่ทราบว่ามีอะไรใน arcpy API ที่จะทำการปรับขนาดให้คุณ แต่การเขียนฟังก์ชั่นให้ทำนั้นค่อนข้างง่าย

โค้ดด้านล่างทำการปรับขนาดสำหรับคุณสมบัติ 2D และไม่คำนึงถึงค่า M หรือ 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)

คุณสามารถเรียกมันด้วยวัตถุเรขาคณิตมาตราส่วน (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 ใช้รูปหลายเหลี่ยมเดียวและวนซ้ำในแต่ละจุดสุดยอดวัดระยะทางจากจุดนั้นไปยังจุดอ้างอิง (โดยค่าเริ่มต้นคือ centroid ของรูปหลายเหลี่ยม)
ระยะทางนั้นจะถูกปรับสัดส่วนด้วยสเกลที่กำหนดเพื่อสร้างจุดสุดยอด 'ปรับ' ใหม่

การปรับสเกลทำได้โดยการวาดเส้นที่ความยาวที่ปรับจากจุดอ้างอิงผ่านจุดสุดยอดเดิมโดยที่จุดสิ้นสุดของเส้นจะกลายเป็นจุดสุดยอดที่ปรับขนาด
สิ่งที่มุมและการหมุนอยู่ที่นั่นเพราะมันตรงไปข้างหน้ามากขึ้นในการคำนวณตำแหน่งของจุดสิ้นสุดของเส้นตามแกนเดียวแล้วหมุน 'เข้าที่'


1
ฉันทดสอบสคริปต์นี้และทำงานได้ดี คุณเป็นอัจฉริยะ! =) ขอบคุณมาก ฉันจะทิ้งคำถามนี้ไว้โดยไม่สนใจดังนั้นผู้คนจำนวนมากจะเห็นได้ใน "คำถามที่มีอนาคต"
Mr. Che

1
ฉันพบว่าเมื่อฉันพยายามที่จะดำเนินการรูปหลายเหลี่ยมมีรู - bdist = refgeom.distanceTo(apnt)มันจะส่งผลให้เกิดความผิดพลาดสคริปต์ในสาย คุณสามารถทดสอบและแก้ไขได้ไหม
นายเช

@ Mr.Che โอ๊ะฉันลืมไปว่า ArcPy ส่งคืนวงแหวนทั้งหมดของส่วนรูปหลายเหลี่ยมในอาร์เรย์เดียวกัน แหวนถูกคั่นด้วยจุดว่าง เป็นการแก้ไขที่ง่ายโปรดดูการแก้ไข
Evil Genius

สวัสดี. เป็นไปได้ไหมที่จะได้คำอธิบายเล็ก ๆ น้อย ๆ เกี่ยวกับวิธีการทำงานของสคริปต์ฉันไม่ดีในการเขียนโค้ดและไม่ได้รับทุกบรรทัดดังนั้นจึงไม่เหมาะกับฉันใช่ไหม
เตอร์

@ peter แน่นอนว่าฉันได้เพิ่มคำอธิบายสั้น ๆ ว่าเกิดอะไรขึ้น มันไม่ได้หมายถึงการเป็นสคริปต์แบบสแตนด์อะโลน แต่เป็นสิ่งที่จะรวมเข้ากับสคริปต์ของคุณเอง ตัวอย่างโค้ดด้านล่างแสดงตัวอย่างวิธีการใช้
Evil Genius
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.