ผู้คนใช้โครงสร้างข้อมูลและคลาส Python ใน ArcPy อย่างไร


16

คำถามนี้อาจทำให้ฉันไม่รู้เกี่ยวกับการเขียนโปรแกรม แต่ฉันอยากรู้ว่าผู้คนใช้โครงสร้างข้อมูลหลามใน ArcPy อย่างไร

หน้านี้แสดงรายการโครงสร้างข้อมูลใน Python ฉันเข้าใจว่าสามารถนำรายการไปใช้ใน GIS ได้อย่างไร (รายการของคุณลักษณะคลาสรายการประเภทคุณลักษณะรายการกรอบข้อมูล ฯลฯ ) ฉันเข้าใจว่าสามารถใช้ชุดได้อย่างไร (เพื่อลบรายการที่ซ้ำกัน) ผู้คนกำลังใช้สิ่งอันดับทูเปิลพจนานุกรมและโครงสร้างข้อมูลอื่นภายใน ArcPy อย่างไร นอกจากนี้ยังมีตัวอย่างอื่น ๆ ของรายการและชุดที่ฉันไม่ได้แสดงไว้ในรายการ?

นอกจากนี้ไม่ต้องสงสัยเลยว่าผู้คนกำลังสร้างคลาสที่กำหนดเองใน ArcPy คุณต้องการสิ่งเหล่านี้ภายใต้สถานการณ์และสถานการณ์ใด คุณสามารถให้ตัวอย่างได้หรือไม่ มีใครสร้างคลาสที่กำหนดเองซึ่งสืบทอดมาจากคลาสอาร์คมีในตัวหรือไม่

ฉันไม่ต้องการคำตอบสำหรับคำถามเหล่านี้ทั้งหมดฉันแค่อยากรู้ว่าผู้คนใช้ Python ใน GIS อย่างไรและขั้นตอนการทำงานใดที่ต้องการการปรับแต่งเหล่านี้


4
คำถามที่น่าสนใจ แต่นี่ไม่มีคำตอบที่ชัดเจน ควรเป็นวิกิชุมชน
RK

คำตอบ:


14

ฟังก์ชั่น arcpy จำนวนมากที่รับอินพุตหลาย ๆ ตัวยอมรับวัตถุรายการ Python

ตัวอย่างเช่นDissolve_managementฟังก์ชั่นยอมรับรายการชื่อเขตข้อมูลที่จะละลายใน:

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

tuple สามารถใช้แทนรายการเมื่อคุณไม่ต้องการแก้ไขลำดับหรือจำนวนองค์ประกอบเนื่องจาก tuples ไม่สามารถเปลี่ยนได้ พวกมันเป็นโครงสร้างข้อมูลที่มีประโยชน์สำหรับข้อมูลที่ต่างกัน แต่เกี่ยวข้องกันเช่นองค์ประกอบของการประทับเวลาหรือพิกัดของจุด คุณมักจะเห็นรายการของสิ่งอันดับที่ tuple ทำหน้าที่เป็นบันทึกที่แตกต่างกันด้วยจำนวนคงที่ของแอตทริบิวต์ในขณะที่รายการสามารถเปลี่ยนขนาดได้อย่างง่ายดายสั่งใหม่ (เรียงลำดับ) ฯลฯ ดูคำถาม StackOverflowนี้เพิ่มเติมเกี่ยวกับการใช้ จากรายการเทียบกับสิ่งอันดับ

พจนานุกรมสามารถใช้เป็นตารางการค้นหาอย่างรวดเร็วเพื่อแคชชุดคู่คีย์ - ค่าที่ค่อนข้างเล็ก แต่ใช้บ่อยในหน่วยความจำ ฉันเห็นตัวอย่างที่น่าสนใจของเรื่องนี้ในฟอรัม ArcGIS: http://forums.arcgis.com/threads/55099-Update-cursor-with-joined-tables-work-around-w-dictionaries

การใช้พจนานุกรมแทนที่จะเข้าร่วมเพิ่มความเร็วในการคำนวณจาก 3.5 ชั่วโมงเป็น 15 นาที

ตัวอย่างที่ง่ายกว่าอาจเป็นได้ถ้าคุณมีบันทึกที่อยู่นับล้านรายการพร้อมแอตทริบิวต์ที่มีชื่อย่อ (CA) แต่สำหรับจุดประสงค์ในการแสดงผลคุณต้องการสะกดชื่อที่ถูกต้อง (แคลิฟอร์เนีย) คุณสามารถใช้พจนานุกรมนี้เป็นตารางค้นหาเมื่อ การเติมฟิลด์ชื่อรัฐแบบเต็ม

ฉันไม่พบความจำเป็นในการเขียนคลาสใน Python เพื่อใช้ใน arcpy ตัวเอง แต่นั่นไม่ใช่การบอกว่าไม่มีกรณีการใช้งานเช่นนั้น คลาสอาจมีประโยชน์เมื่อคุณมีชุดของฟังก์ชั่นที่เกี่ยวข้องอย่างใกล้ชิด (พฤติกรรม) ที่ทำงานกับอินพุต (ข้อมูล) บางอย่างและคุณต้องการที่จะสามารถใช้ข้อมูลและพฤติกรรมเหล่านั้นในลักษณะที่เป็นวัตถุ แต่นี่เป็นสิ่งที่มากกว่า มีแนวโน้มที่จะเป็นตรรกะทางธุรกิจเฉพาะและไม่เกี่ยวข้องกับ arcpy


7

Blah238 ครอบคลุมหัวข้อนี้ดีดังนั้นฉันจะเพิ่มตัวอย่างจากงานของฉันเอง ฉันพัฒนาข้อมูลสนามบินจำนวนมากและสิ่งหนึ่งที่ฉันต้องทำอย่างสม่ำเสมอคืออ่านตามลำดับจุดกึ่งกลางรันเวย์ที่สำรวจจากรันเวย์ คุณคิดว่าประเด็นเหล่านี้จะเป็นไปตามลำดับ (ในฐานข้อมูล GIS) แล้ว แต่ก็ไม่ค่อยมี จุดศูนย์กลางจะเกิดขึ้นทุกๆ 10 ฟุตตามเส้นกลางและขนาบข้างด้วยสองแถวจากจุดสำรวจสองแถวเว้นระยะห่างกัน 10 ฟุต คุณได้ภาพ: คะแนนมากมาย ... และโดยปกติแล้วทุกอย่างจะรวมกันเป็นฐานข้อมูลที่ชาญฉลาด ด้วยสิ่งที่ฉันทำในสคริปต์ของฉันมักจะง่ายที่สุดเพียงแค่เลือกจุดกึ่งกลางตามคุณลักษณะ (หรือ spatially ถ้าจำเป็น) อ่านพิกัดสำหรับแต่ละและถ่ายโอนข้อมูลผลลัพธ์ลงในรายการหลาม ฉันสามารถเรียงลำดับป๊อปย้อนกลับ ฯลฯ

ฉันใช้พจนานุกรม Python อย่างกว้างขวาง (อาจมากกว่าที่บางคนอนุมัติ) ฉันต้องสร้างชุดเวกเตอร์ 3 มิติสำหรับรันเวย์แต่ละจุดที่สนามบินและฉันสามารถเข้าถึงสิ่งเหล่านี้ได้ตลอดเวลาในสคริปต์และทำสิ่งนี้ในสคริปต์ของฉัน ฉันเก็บชุดข้อมูลที่เข้าถึงเป็นประจำจำนวนมากในพจนานุกรมด้วย เช่นเดียวกับรายการพวกเขารวดเร็วและยืดหยุ่น แนะนำเป็นอย่างยิ่ง

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


5

ฉันก็รักพจนานุกรม - ใช้พวกมันตลอดเวลา วิธีการนี้จะได้รับคุณสมบัติการอ้างอิงเชิงพื้นที่และเก็บมันทั้งหมดใน dict:

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

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

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

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


ขอบคุณสำหรับคำตอบ. เหตุใดพจนานุกรมจึงเป็นตัวเลือกที่ดีกว่าโครงสร้างข้อมูลอื่นในกรณีเหล่านี้
Fezter

ฉันแค่อยากจะเรียกค่าของฉันด้วยกุญแจของฉัน
Chad Cooper

2
อีกเหตุผลหนึ่งที่อาจจะดีกว่าก็เพราะพวกเขาจะอ่านเร็วกว่ารายการเพราะพวกเขาไม่ได้สั่ง ดังนั้นรายการที่มีความยาวมากอาจใช้เวลาดำเนินการอีกเล็กน้อยหากมีหลายรายการ
ndimhypervol

@gotanuki True และหากคุณต้องการใช้รายการใหญ่ให้ใช้ tuple แทนเนื่องจากรายการเหล่านั้นเร็วกว่ารายการเช่นกัน
ชาดคูเปอร์

2

อ่านนี้ในขณะที่วางกันคำตอบและต้องทำการแก้ไขบางอย่าง ..

ฉันไม่ใช่ผู้เชี่ยวชาญของ Python แต่ฉันคิดว่าความคิดเบื้องหลังการใช้คลาสคือคุณสามารถสร้างอินสแตนซ์ของวัตถุที่มีวิธีการมากมายที่พร้อมใช้งานซึ่งเกี่ยวข้องกับโครงสร้างข้อมูลรวมถึงวิธีการรวมศูนย์ของคุณ นอกจากนี้ยังมีขอบเขตประโยชน์บางอย่างของตัวแปรกับคลาส vs โมดูลลิงค์ด้านบนมาถึงจุดนี้บ้าง

ฉันมีคลาสที่เรียกว่า featureLayer (อาจจะไม่ใช่ชื่อ pythonic-ly ... ยังคงเรียนรู้อยู่) ที่ฉันสามารถทำได้

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)

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

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


4
ตรวจสอบ คู่มือสไตล์ Python (หรือ PEP 8)สำหรับการตั้งชื่อการประชุม
blah238

0

ฉันทำงานเป็นหลักใน VB .net แต่พบว่าตัวเองใช้ python และ arcpy มากขึ้นเรื่อย ๆ ใน VB ฉันชอบและพยายามใช้ Enums เพราะทำให้อ่านรหัสได้ชัดเจนขึ้น รุ่นก่อนหน้านี้หลามไม่ได้ดำเนินการเพื่อให้ Enums สับคือการสร้างคลาสการเปิดเผยคุณสมบัติบางพวงของตัวอย่างที่จะกล่าวถึงในกองมากเกิน ตอนนี้ดูเหมือนว่าเวอร์ชันล่าสุดของการดำเนินการหลามเหล่านี้ที่จะกล่าวถึงที่นี่

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