Mọi người đang sử dụng các cấu trúc dữ liệu Python và các lớp trong ArcPy như thế nào?


16

Câu hỏi này có thể phơi bày sự thiếu hiểu biết của tôi về lập trình nhưng tôi tò mò về cách mọi người sử dụng các cấu trúc dữ liệu python khác nhau trong ArcPy.

Trang này liệt kê các cấu trúc dữ liệu trong Python. Tôi hiểu cách danh sách có thể được triển khai trong GIS (danh sách các lớp đối tượng, danh sách các loại tính năng, danh sách khung dữ liệu, v.v.). Tôi hiểu làm thế nào các bộ có thể được sử dụng là tốt (để loại bỏ trùng lặp). Mọi người đang triển khai các bộ dữ liệu, từ điển và các cấu trúc dữ liệu khác trong ArcPy như thế nào? Ngoài ra, có những ví dụ khác về danh sách và bộ mà tôi chưa liệt kê không?

Hơn nữa, không còn nghi ngờ gì nữa, mọi người đang tạo các lớp tùy chỉnh trong ArcPy. Trong hoàn cảnh và tình huống nào bạn yêu cầu những điều này? Bạn có thể cung cấp ví dụ? Có ai đang tạo các lớp tùy chỉnh kế thừa từ các lớp arcpy tích hợp không?

Tôi không yêu cầu câu trả lời cho tất cả những câu hỏi này, tôi chỉ tò mò về cách mọi người sử dụng Python trong GIS và quy trình công việc yêu cầu những tùy chỉnh này.


4
Câu hỏi thú vị nhưng điều này không có câu trả lời dứt khoát. Nên là một wiki cộng đồng.
RK

Câu trả lời:


14

Nhiều hàm arcpy có nhiều đầu vào chấp nhận các đối tượng danh sách Python.

Ví dụ, Dissolve_managementhàm chấp nhận một danh sách các tên trường để giải thể trên:

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

Một bộ dữ liệu có thể được sử dụng thay cho danh sách khi bạn không cần sửa đổi thứ tự hoặc số phần tử, vì bộ dữ liệu là bất biến . Chúng là một cấu trúc dữ liệu hữu ích cho các phần dữ liệu không đồng nhất nhưng có liên quan, chẳng hạn như các yếu tố của dấu thời gian hoặc tọa độ của một điểm. Bạn sẽ thường thấy danh sách các bộ dữ liệu, trong đó một bộ dữ liệu đóng vai trò là một bản ghi riêng biệt với số lượng thuộc tính cố định, trong khi danh sách có thể dễ dàng thay đổi kích thước, được sắp xếp lại (sắp xếp), v.v. Xem câu hỏi StackOverflow này để biết thêm về cách sử dụng của danh sách so với tuples.

Một từ điển có thể được sử dụng như một bảng tra cứu nhanh để lưu trữ một bộ các cặp khóa-giá trị tương đối nhỏ nhưng thường được sử dụng vào bộ nhớ. Tôi đã thấy một ví dụ thú vị về điều này trên các diễn đàn ArcGIS: http://forums.arcgis.com/threads/55099-Update-coder-with-joined-tables-work-around-w-dictionaries

Việc họ sử dụng từ điển thay vì tham gia đã tăng tốc tính toán của họ từ 3,5 giờ lên 15 phút.

Một ví dụ đơn giản hơn có thể là nếu bạn có một triệu bản ghi địa chỉ với một thuộc tính có tên trạng thái viết tắt (CA), nhưng với mục đích hiển thị, bạn muốn đánh vần tên thích hợp (California), bạn có thể sử dụng từ điển này làm bảng tra cứu khi điền vào một trường tên đầy đủ.

Bản thân tôi chưa thấy cần phải viết một lớp bằng Python để sử dụng trong Arcpy, nhưng điều đó không có nghĩa là không có trường hợp sử dụng như vậy. Một lớp có thể hữu ích khi bạn có một tập hợp các hàm (hành vi) liên quan chặt chẽ hoạt động trên một số đầu vào (dữ liệu) và bạn muốn có thể sử dụng các dữ liệu và hành vi đó theo cách hướng đối tượng, nhưng điều này còn hơn thế có khả năng sẽ là logic kinh doanh cụ thể và không liên quan đến arcpy.


7

Blah238 bao quát tốt chủ đề này, vì vậy tôi sẽ chỉ thêm một vài ví dụ từ công việc của riêng tôi. Tôi phát triển rất nhiều dữ liệu sân bay, và một trong những điều tôi phải làm thường xuyên là đọc theo thứ tự dọc theo các điểm trung tâm đường băng được khảo sát từ một đường băng. Bạn sẽ nghĩ rằng những điểm này sẽ theo thứ tự (trong cơ sở dữ liệu GIS), nhưng chúng hiếm khi như vậy. Các điểm trung tâm xảy ra cứ sau 10 feet dọc theo đường trung tâm và được đặt ở hai bên bởi hai hàng điểm khảo sát khác cách nhau 10 feet. Bạn nhận được hình ảnh: rất nhiều điểm ... và thường là tất cả được trộn lẫn với nhau trong cơ sở dữ liệu. Với những gì tôi đang làm trong các tập lệnh của mình, thường dễ nhất là chỉ chọn các điểm trung tâm theo các thuộc tính (hoặc theo không gian nếu cần), đọc tọa độ cho từng và đưa kết quả vào danh sách Python. Sau đó tôi có thể sắp xếp, bật, đảo ngược, v.v.

Tương tự như vậy, tôi sử dụng từ điển Python rộng rãi (có thể nhiều hơn nhiều so với một số từ điển). Tôi phải tạo các bộ vectơ đơn vị 3D cho mỗi đầu đường băng tại sân bay và tôi truy cập chúng liên tục trong một tập lệnh và thực hiện điều này trong nhiều tập lệnh của mình. Tôi cũng giữ nhiều bộ dữ liệu được truy cập thường xuyên trong từ điển. Giống như danh sách, chúng rất nhanh và linh hoạt. Rất khuyến khích.

Theo như các lớp học, như Blah238, tôi không thấy cần phải tạo bất kỳ. Có thể có một vài trường hợp một lớp sẽ được ưu tiên trong các tập lệnh của tôi, nhưng tôi thực sự không thể xác định được những nơi đó. Ai đó có nhiều kinh nghiệm lập trình có thể sẽ tìm thấy chúng một cách nhanh chóng.


5

Tôi cũng rất thích từ điển - sử dụng chúng mọi lúc. Phương pháp này nhận được một số thuộc tính tham chiếu không gian và lưu trữ tất cả trong một lệnh:

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

Phương pháp này trích đoạn hình học điểm từ hai featureclass, sau đó tôi sử dụng hình học sau này để thực hiện một số trig:

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

RẤT NHIỀU những gì tôi hiện đang làm việc liên quan đến việc trích xuất tọa độ và thuộc tính từ các lớp tính năng vectơ và trình quét để dữ liệu có thể được đẩy vào một phần mềm khác thậm chí không biết dữ liệu GIS là gì. Vì vậy, tôi sử dụng danh sách và từ điển rất nhiều cho việc này.


cảm ơn vì câu trả lời Tại sao một từ điển là một lựa chọn tốt hơn so với cấu trúc dữ liệu khác trong những trường hợp này?
Fezter

Tôi chỉ muốn có thể gọi các giá trị của tôi bằng các phím của tôi.
Chad Cooper

2
một lý do khác có thể thích hợp hơn là vì chúng được đọc nhanh hơn rất nhiều so với danh sách vì chúng không được đặt hàng. do đó, danh sách rất dài có thể mất thêm một chút thời gian để xử lý nếu chúng có nhiều mục.
ndimhypervol

@gotanuki Đúng, và nếu bạn cần sử dụng một danh sách lớn, thay vào đó hãy sử dụng một tuple, vì chúng cũng nhanh hơn danh sách.
Chad Cooper

2

Đọc điều này trong khi đưa ra một câu trả lời và phải thực hiện một số chỉnh sửa ..

Tôi không phải là chuyên gia về Python nhưng tôi nghĩ ý tưởng đằng sau việc sử dụng các lớp là bạn có thể khởi tạo một đối tượng có sẵn một loạt các phương thức liên quan đến cấu trúc dữ liệu cũng như tập trung các phương thức của bạn. Ngoài ra còn có một số lợi ích phạm vi thay đổi với các lớp so với các mô-đun, liên kết ở trên đến điểm này phần nào.

Tôi có một lớp gọi là FeatureLayer (có lẽ không phải là pythonic-ly có tên ... vẫn đang học). tôi có thể làm

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)

Định nghĩa để làm điều này là một phương thức lớp chỉ lặp lại các tính năng, các bộ phận và đỉnh. Sau đó, tôi có thể biến đối tượng điểm của mình thành một đối tượng FeatureLayer và làm những thứ khác mà lớp tôi có.

Tôi nghĩ rằng nếu được xây dựng chính xác các lớp nên mất chức năng. Ví dụ: tôi sẽ sớm bắt đầu tái cấu trúc để tôi có một lớp FeatureLayer có các phương thức và thuộc tính mà tất cả các lớp đối tượng đều có. Sau đó, kế thừa từ nó để xây dựng một thể hiện của lớp FeatureLayerStrict sẽ kế thừa tất cả các thuộc tính / phương thức của FeatureLayers nhưng sẽ khởi tạo với một kiểu hình học cụ thể như đa giác.


4
Kiểm tra hướng dẫn kiểu Python (còn gọi là PEP 8) để biết các quy ước đặt tên.
blah238

0

Tôi làm việc chủ yếu trong VB .net nhưng ngày càng thấy mình sử dụng python và arcpy nhiều hơn. Trong VB tôi thích và thử sử dụng Enums vì nó làm cho việc đọc mã rõ ràng hơn. Các phiên bản trước đó của python đã không triển khai Enums, do đó, một vụ hack là tạo ra một Class phơi bày một số thuộc tính, một loạt các ví dụ được thảo luận trên Stack Overflow . Bây giờ có vẻ như phiên bản mới nhất của python thực hiện những điều này sẽ được thảo luận ở đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.