ArcPy'de insanlar Python veri yapılarını ve sınıflarını nasıl kullanıyor?


16

Bu soru programlama konusundaki bilgisizliğimizi ortaya çıkarabilir, ancak insanların ArcPy içinde farklı python veri yapılarını nasıl kullandıklarını merak ediyorum.

Bu sayfa Python'daki veri yapılarını listeler. Listelerin CBS'de nasıl uygulanabileceğini anlıyorum (özellik sınıflarının listesi, özellik türlerinin listesi, veri çerçeveleri listesi vb.). Kümelerin de nasıl kullanılabileceğini anlıyorum (kopyaları kaldırmak için). İnsanlar ArcPy içinde tuples, sözlükler ve diğer veri yapılarını nasıl uyguluyorlar? Ayrıca, listelemediğim diğer liste ve set örnekleri var mı?

Ayrıca, şüphesiz, insanlar ArcPy'de özel sınıflar yaratıyorlar. Hangi şartlar ve koşullar altında bunlara ihtiyacınız var? Örnek verebilir misiniz? Dahili arcpy sınıflarından miras alan özel sınıflar yaratan var mı?

Tüm bu soruların cevaplarını istemiyorum, sadece insanların CBS'de Python'u nasıl kullandıklarını ve bu özelleştirmelerin hangi iş akışlarını gerektirdiğini merak ediyorum.


4
İlginç bir soru ama bunun kesin bir cevabı yok. Bir topluluk wiki olmalı.
RK

Yanıtlar:


14

Birden çok girdi alan birçok yayılma işlevi Python listesi nesnelerini kabul eder.

Örneğin Dissolve_managementişlev, üzerinde çözülmesi gereken alan adlarının bir listesini kabul eder:

arcpy.Dissolve_management("taxlots", "C:/output/output.gdb/taxlots_dissolved",
    ["LANDUSE", "TAXCODE"], "", "SINGLE_PART", "DISSOLVE_LINES")

Demetler olduğu gibi, öğelerin sırasını veya numarayı değiştirmek gerekmez zaman Bir demet bir liste yerine kullanılabilecek değişmez . Bunlar, zaman damgasının öğeleri veya bir noktanın koordinatları gibi heterojen ancak ilgili veri parçaları için yararlı bir veri yapısıdır. Liste kolayca değişiklik boyut, yeniden sipariş olabilir iken Sık sık, tuple niteliklerin sabit sayıda ayrı kayıt olarak hizmet veren küpe, listelerini göreceksiniz (sıralı), vb bu Bkz StackOverflow soru kullanımları hakkında daha fazla bilgi için ile tuples arasındaki listeler.

Sözlük, nispeten küçük fakat sık kullanılan bir anahtar / değer çifti kümesini belleğe önbelleğe almak için hızlı arama tablosu olarak kullanılabilir. Bunun ilginç bir örneğini ArcGIS forumlarında gördüm: http://forums.arcgis.com/threads/55099-Update-cursor-with-joined-tables-work-around-w-dictionaries

Birleştirme yerine sözlük kullanmaları hesaplamalarını 3,5 saatten 15 dakikaya çıkardı.

Kısaltılmış durum adıyla (CA) bir özniteliğe sahip bir milyon adres kaydınız varsa, ancak uygun adı (California) hecelemek istediğiniz görüntüleme amaçları için bu sözlüğü arama tablosu olarak kullanabilirsiniz. tam durum adı alanı doldurma.

Kendimi arcpy içinde kullanmak için Python bir sınıf yazmak için bir ihtiyaç bulamadık, ama bu böyle bir kullanım durumu olmadığını söylemek değildir. Bir sınıf, bazı girdiler (veriler) üzerinde çalışan ve yakından ilişkili işlevler (davranışlar) varsa ve bu verileri ve davranışları nesne yönelimli bir şekilde kullanmak istediğinizde yararlı olabilir, ancak bu daha fazla muhtemelen iş mantığına özgü olacak ve arcpy ile ilgili olmayacak.


7

Blah238 bu konuyu iyi ele alıyor, bu yüzden kendi işimden birkaç örnek ekleyeceğim. Birçok havaalanı verisi geliştiriyorum ve düzenli olarak yapmam gereken şeylerden biri, bir pistten incelenen pist merkez çizgisi noktaları boyunca okunuyor. Bu noktaların zaten (CBS veritabanında) sırada olacağını düşünürsünüz, ancak nadiren olurlar. Merkez çizgisi noktaları, merkez çizgisi boyunca her 10 fitte bir meydana gelir ve her iki tarafa, birbirinden 10 fit aralıklı iki sıra anket noktasıyla çevrelenir. Resmi elde edersiniz: çok sayıda puan ... ve genellikle hepsi veritabanı açısından karıştırılır. Betiklerimde ne yaptığımla, genellikle merkez çizgisi özelliklerini niteliklere göre (veya gerekirse uzamsal olarak) seçmek, her birinin koordinatlarını okumak ve sonuçları bir Python listesine dökmek en kolay yoldur. Sonra sıralayabilir, pop, ters, vb.

Benzer şekilde, Python sözlüklerini yoğun olarak kullanıyorum (muhtemelen bazılarının onaylayabileceğinden çok daha fazla). Bir havaalanındaki her pist sonu için 3B birim vektörleri oluşturmam gerekiyor ve bunlara sürekli olarak bir senaryo içinde erişiyorum ve bunu senaryolarımın çoğunda yapıyorum. Sözlüklerde düzenli olarak erişilen diğer birçok veri kümesini de saklıyorum. Listeler gibi, bunlar da hızlı ve esnektir. Şiddetle tavsiye edilir.

Sınıflara gelince, Blah238 gibi, herhangi bir şey yaratmaya ihtiyaç duymadım. Senaryolarımda bir sınıfın tercih edileceği birkaç durum var, ama ben gerçekten bu yerleri tanımlayamadım. Daha fazla programlama tecrübesi olan biri muhtemelen onları çabucak bulur.


5

Ben de sözlükleri seviyorum - her zaman kullan. Bu yöntem bazı uzamsal referans özellikleri alır ve hepsini bir dikte halinde saklar:

def get_coord_sys(self, in_dataset):
    """Get and return info on dataset coord sys/projection"""
    spatial_ref = arcpy.Describe(in_dataset).spatialReference
    # Get spatial ref props and put in dictionary
    spat_ref_dict = {}
    spat_ref_dict["name"] = spatial_ref.name
    spat_ref_dict["type"] = spatial_ref.type
    spat_ref_dict["gcs_code"] = spatial_ref.GCSCode
    spat_ref_dict["gcs_name"] = spatial_ref.GCSName
    spat_ref_dict["pcs_code"] = spatial_ref.PCSCode
    spat_ref_dict["pcs_name"] = spatial_ref.PCSName
    return spat_ref_dict

Bu yöntem snippet'i iki özellik sınıfından nokta geometrilerini çıkarır, daha sonra bazı trig yapmak için geometrileri daha sonra kullanırım:

def build_fields_of_view(self):
        """For all KOPs in a study area, build left, right, center FoV triangles"""
        try:    
            fcs = {os.path.join(self.gdb, "WindFarmArray"):[], os.path.join(self.gdb, "KOPs"):[]}
            # Build a dict of WTG and KOP array geometries, looks like:
            #  {'KOPs': [[1, -10049.2697098718, 10856.699451165374], 
            #            [2, 6690.4377855260946, 15602.12386816188]], 
            #   'WindFarmArray': [[1, 5834.9321158060666, 7909.3822339441513], 
            #                     [2, 6111.1759513214511, 7316.9684107396561]]}
            for k, v in fcs.iteritems():
                rows = arcpy.SearchCursor(k, "", self.sr)
                for row in rows:
                    geom = row.shape
                    point = geom.getPart()
                    id = row.getValue("OBJECTID")
                    v.append([id, point.X, point.Y])   

            kops = fcs[os.path.join(self.gdb, "KOPs")] # KOP array
            wtgs = fcs[os.path.join(self.gdb, "WindFarmArray")] # WTG array

Şu anda üzerinde çalıştığım bir çok şey, verilerin GIS verilerinin ne olduğunu bile bilmeyen başka bir yazılım parçasına itilebilmesi için vektör özellik sınıflarından ve rasterlerden koordinatların ve özniteliklerin çıkarılmasını içerir. Bunun için listeleri ve sözlükleri çok kullanıyorum.


Cevap için teşekkürler. Bir sözlük neden bu durumlarda başka bir veri yapısından daha iyi bir seçimdir?
Fezter

Değerlerimi anahtarlarım ile arayabilmeyi seviyorum.
Chad Cooper

2
başka bir nedenin tercih edilmesinin nedeni sıralı olmadıkları için listelerden çok daha hızlı okunmalarıdır. bu nedenle, çok uzun listelerin çok sayıda girdisi varsa işlenmesi biraz daha zaman alabilir.
ndimhypervol

@gotanuki Doğru ve büyük bir liste kullanmanız gerekiyorsa, listelerden daha hızlı oldukları için bir demet kullanın.
Chad Cooper

2

Bir cevap verirken bunu okuyun ve bazı düzenlemeler yapmak zorunda kaldınız ..

Ben Python uzmanı değilim ama sınıfları kullanmanın arkasındaki fikir, veri yapısı ile ilgili yöntemlerin yanı sıra veri yapısı ile ilgili gitmek için hazır yöntemler bir grup var bir nesne somutlaştırmak olduğunu düşünüyorum. Sınıflarla modüller arasında bazı değişken kapsam avantajları da vardır, yukarıdaki bağlantı biraz bu noktaya gelir.

FeatureLayer adlı bir sınıf var (muhtemelen pythonic-ly adlı değil ... hala öğrenme). Yapabilirim

sys.path.append(r"\\Path\To\Scripts")
import gpFuncs as gpF
fc = arcpy.GetParameterAsText(0)
featureLayer = gpF.featureLayer(fc)
points = featureLayer.featureVerticesToPoints(featureid, "", first_and_last)

Bunu yapmanın tanımı, sadece özellikleri, parçaları ve köşeleri yineleyen bir sınıf yöntemidir. Sonra benim puan nesnesi bir featureLayer örneğine dönüştürebilir ve benim sınıf sahip olduğu diğer şeyler yapabilirsiniz.

Eğer doğru inşa sınıflar işlevselliği enapuslate gerektiğini düşünüyorum. Örneğin, yakında tüm özellik katmanları sahip yöntem ve özniteliklere sahip bir featureLayer sınıf var böylece refactoring başlayacağım. Ardından, tüm featureLayers özniteliklerini / yöntemlerini devralacak ancak çokgen gibi belirli bir geometri türüyle somutlaşacak bir featureLayerStrict sınıf örneği oluşturmak için ondan devralın.


4
Check out Python stil rehberi (aka PEP 8) adlandırma için.
blah238

0

Ben esas olarak VB .net çalışıyorum ama python ve arcpy kullanarak kendimi daha fazla bulmak. VB içinde kod okuma daha net hale getirir gibi Enums kullanmayı ve deneyin. Python'un önceki sürümleri Enums'ı uygulamadı, bu yüzden bir hack bazı özellikleri ortaya çıkaran bir Sınıf oluşturmaktı, Stack Overflow üzerinde bir grup örnek tartışıldı . Şimdi python'un en son sürümü burada tartışılanları uygulamaktadır .

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.