ArcMap'te Gelişmiş Düzenleme araç çubuğunun Ölçek aracı gibi çokgen yeniden boyutlandırma için ArcPy aracı var mı?


17

ArcGIS 10.3 için bir python betiği yazıyorum. Scale toolArcGIS arayüzünde biliyorum ama böyle bir arcpy komutu bulamıyorum. Var?

Resimde de görebileceğiniz gibi Scale toolfarklı işler Buffer tool- orijinal çokgen şeklini değiştirir. Soru şu:

Scale toolArcpy kullanarak (ArcGIS arayüzünden edinilebilir) kullanabilir miyim ?

resim açıklamasını buraya girin


2
Eski çokgeni arabelleğe almaya ve çıkarmaya ne dersiniz? tampon pozitif ve negatif değerlerle kullanılabilir!
Farid Cheraghi

Soru, bir çokgenin nasıl yeniden boyutlandırılacağı değil, mevcut arkpy aracıyla ilgilidir.
Bay Che

Başlığınız, sorunuz ve yorumunuz birbiriyle çelişiyor gibi görünüyor. Sağlanan yinelenen sorular sorunuzu yanıtlamazsa, neyin peşinde olduğunuzu açıklığa kavuşturmak için lütfen sorunuzu düzenleyebilir misiniz?
Aaron

1
@ Mr.Che Buffer aracı arcpy ile piton komut dosyalarında kullanılabilir.Buffer_analysis (...)
Farid Cheraghi

Bu süper! Tüm özellik sınıflarını, örneğin tüm özellikleri 0,5 olarak ölçeklemek yerine tablodaki bir sayı ile nasıl güncelleyebilirim? Teşekkürler
user1655130 15:16

Yanıtlar:


27

Ben senin için ölçekleme yapacak arcpy API hiçbir şey farkında değilim, ama bunu yapmak için bir işlev yazmak nispeten basit olacaktır.

Aşağıdaki kod 2D özelliklerin ölçeklendirmesini yapar ve M veya Z değerlerini dikkate almaz:

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)

Bir geometri nesnesi, bir ölçek faktörü (1 = aynı boyut, 0.5 = yarım boyut, 5 = 5 kat daha büyük, vb.) Ve isteğe bağlı bir referans noktası ile arayabilirsiniz:

scale_geom(some_geom, 1.5)

Hedef özellik sınıfının zaten var olduğunu varsayarak, tüm özellik sınıfını ölçeklendirmek için imleçlerle birlikte bunu kullanın:

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

edit: İşte 0.5 ve 5 kez test geometrinizin yaklaşık bir tahminini kullanan bir örnek: resim açıklamasını buraya girin

Ayrıca çok halkalı çokgenlerle (delikler) test edilmiştir! resim açıklamasını buraya girin

İstendiği gibi bir açıklama:

scale_geomtek bir çokgen alır ve ondan bir referans noktasına olan mesafeyi ölçerek (varsayılan olarak, çokgenin centroidi) her bir tepe noktasında dolaşır.
Bu mesafe daha sonra yeni 'ölçeklendirilmiş' tepe noktasını oluşturmak için verilen ölçekle ölçeklendirilir.

Ölçekleme esasen referans noktasından orijinal tepe noktasına kadar ölçeklendirilmiş uzunlukta bir çizgi çizilerek yapılır, çizginin sonu ölçeklenmiş tepe noktası haline gelir.
Açı ve döndürme öğeleri oradadır, çünkü çizginin sonunun konumunu tek bir eksen boyunca hesaplamak ve daha sonra 'yerine' döndürmek daha düzdür.


1
Bu komut dosyasını test ettim ve iyi çalışıyor. Kahretsin Genius! =) Çok teşekkürler. Bu soruyu cevapsız bırakacağım, böylece daha fazla insan "gelecek soruları" nda görecek.
Bay Che

1
Ben bir delik ile bir çokgen işlemeye çalıştığınızda - bir komut dosyası çökmesine neden olduğunu buldum bdist = refgeom.distanceTo(apnt). Bunu test edip düzeltebilir misiniz?
Bay Che

Bay Mr.Oops, ArcPy'nin aynı dizideki bir çokgen parçanın tüm halkalarını döndürdüğünü unuttum. Halkalar boş noktalar ile ayrılır. Bu kolay bir düzeltme, lütfen düzenlemeye bakın.
Evil Genius

Merhaba. Komut dosyasının nasıl çalıştığına dair küçük bir açıklama almak mümkün mü, kodlama konusunda kötüyüm ve tüm satırları alamıyorum, bu yüzden benim için çalışmıyor, lütfen?
peter

@peter Elbette, neler olduğuna dair kısa bir açıklama ekledim. Bu tek başına bir betik olması değil, kendi betiğinize entegre edilmesi gereken bir şeydir. Alt kod snippet'i, bunun nasıl kullanılabileceğine ilişkin bir örnek gösterir.
Evil Genius
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.