Thực hiện nhiều phép tính trong Bảng thuộc tính ArcGIS?


8

Tôi có một bảng tính Excel hiện có được phát triển để theo dõi dữ liệu vòi chữa cháy cụ thể, đây là bản cập nhật định kỳ và được kết hợp với dữ liệu vòi không gian trong ArcGIS. Trong bảng tính có một số cột để nhập dữ liệu liên quan đến Áp suất tĩnh, Áp suất dư và Tốc độ dòng chảy.

nhập mô tả hình ảnh ở đây

Sử dụng Công suất định mức ở 20 PSI trong công thức Kiểm tra lưu lượng cháy để tính toán lưu lượng cháy, bảng tính sẽ tự động tính toán. Cách tính như sau.

Fire Flow = Flow * ((Static - 20)/(Static - Residual))^0.54

Tôi không chắc chắn cách tốt nhất để tấn công này và đang tìm kiếm gợi ý. Dựa trên kết quả tính toán, tôi có một cột bổ sung với câu lệnh IF chỉ ra màu dòng lửa thích hợp mà vòi phun nên được sơn. Đối với những người không biết, màu vòi là một chỉ báo cho nhân viên cứu hỏa trong trường hợp khẩn cấp các điều kiện dòng lửa. Tôi đã thực hiện một số nghiên cứu và phát triển kịch bản python sau đây:

def Reclass !Bon_Color!:
     if ( !Fire_Flow! <= 0):
       return Black
     elif ( !Fire_Flow! >= 1 and !Fire_Flow! <= 499):
       return  Red
     elif ([Fire_Flow] > 499 and [Fire_Flow] <= 999):
       return Orange
     elif ( !Fire_Flow! > 999 and !Fire_Flow! <= 1499):
         return Green
     elif ( !Fire_Flow! > 1499):
         return Blue
  end if

Tôi muốn biết nếu các tính toán được đề cập ở trên, được sử dụng trong bảng tính Excel có thể được sao chép trong bảng thuộc tính cơ sở dữ liệu sử dụng máy tính trường và trình phân tích cú pháp python không? Thay vì dựa vào bảng tính Excel và sự cần thiết phải nối lại dữ liệu.


5
Họ có thể, nhưng đây là một câu hỏi SQL hơn là một câu hỏi về GIS.
Dan C

Nửa thứ hai của họ có thể được thực hiện thông qua Máy tính trường, tôi chỉ cần lấy Mã hóa Python đúng.
LandArch

Nếu đây là câu hỏi về ArcGIS Field Calculator và Python Parser của nó thì tôi nghĩ bạn nên chỉnh sửa nó để làm cho rõ ràng và tránh bị đóng vì quá rộng (bằng cách hỏi hai câu hỏi).
PolyGeo

Tôi nghĩ rằng bạn sẽ có một thời gian dễ dàng hơn với điều này nếu bạn thực hiện nó ở mặt sau, trong SQL db lưu trữ các tính năng. Bạn có thể thiết lập truy vấn cập nhật để chạy hàng ngày hoặc tuy nhiên thường để tính các giá trị này và bạn không phải suy nghĩ lại. Bạn cũng có thể tạo nó dưới dạng 'cột được tính toán', sẽ tự động được điền với các giá trị chính xác khi bạn chỉnh sửa lớp. Nói chuyện với quản trị viên db của bạn.
Dân C

@Dan CI không đồng ý với bạn. Thật không may, chúng tôi không có một quản trị viên cơ sở dữ liệu. Tôi đoán rằng tôi là nó. Tôi đã tìm ra đủ để thiết lập PostgreSQL để chúng tôi có thể sử dụng dữ liệu trong trường trong Ứng dụng ARCGIS Collector trên máy tính bảng. Tôi nghĩ rằng Python và máy tính trường có thể là lựa chọn tốt hơn của tôi chỉ để tôi học được thứ gì đó mà tôi có thể sử dụng sau này.
LandArch

Câu trả lời:


4

Mã python của bạn có ý nghĩa nhưng có một vài lỗi. Dán phần này vào hộp "Mã kịch bản tiền logic" trong máy tính trường:

def Reclass (fire_flow):
     if (fire_flow <= 0):
       return "Black"
     elif (fire_flow >= 1 and fire_flow <= 499):
       return "Red"
     elif (fire_flow > 499 and fire_flow <= 999):
       return "Orange"
     elif (fire_flow > 999 and fire_flow <= 1499):
       return "Green"
     elif (fire_flow > 1499):
       return "Blue"

Sau đó trong hộp bên dưới, dán:

Reclass (!Fire_Flow!)

Việc thụt lề trong khối trên cùng đó là một chút khác thường, nhưng số lượng thụt chính xác không quan trọng miễn là các dòng được thụt chính xác tương đối với nhau.

Những lỗi:

def Reclass !Bon_Color!:

Khi bạn xác định một hàm, bạn cần theo dõi nó với một danh sách các tham số mà hàm sử dụng để thực hiện công việc của nó. Danh sách nên ở trong ngoặc đơn. Trong trường hợp của bạn, bạn chỉ đang sử dụng một tham số đầu vào, số Fire_Flow của bạn.

if ( !Fire_Flow! <= 0):
   return Black

Bạn sẽ chuyển !Fire_Flow!vào hàm, một khi bạn ở hàm có giá trị được gán cho biến fire_flow, vì vậy hãy tham khảo biến đó. Ngoài ra, bạn cần đặt Blackdấu ngoặc kép, để một chuỗi được trả về. Cách bạn có nó ở đây, tập lệnh của bạn đang tìm kiếm một biến có tên Blackđể trả về và nó không tồn tại.

end if

Bạn không cần kết thúc nếu trong Python.

Đối với trường đầu tiên của bạn, số luồng lửa, bạn cần đặt tên cho các trường của mình một cách thích hợp và toán tử cho số mũ trong Python **, chứ không phải ^.pem cái này vào hộp dưới cùng trong máy tính trường:

!Fire_Flow! = !Flow! * ((!Static! - 20)/(!Static! - !Residual!))**0.54

Nếu bạn cần cập nhật đồng thời nhiều hơn một trường, tôi đồng ý với MacroZED rằng con trỏ cập nhật là cách tốt hơn, nhưng chúng có thể hơi khó hiểu nếu bạn chưa quen với Python.


Cảm ơn, điều này đã làm việc để tính toán màu sắc nắp ca-pô, bất kỳ suy nghĩ về việc tính toán phần khác của nếu?
LandArch

@LandArch Xin lỗi, tôi nghĩ rằng câu hỏi đã nói rằng phần đó đã được quan tâm. Tôi sẽ thêm nó.
Dan C

2

Điều này chắc chắn có thể được thực hiện trong ArcGIS mà không cần phải xuất sắc. Nếu các trường này (Áp suất tĩnh, Áp suất dư và Tốc độ dòng chảy) đã có trong bộ dữ liệu, thì chúng ta có thể sử dụng các con trỏ sau để thêm các trường mới và cập nhật chúng:

import arcpy

ds = r"path/to/dataset"    

with arcpy.da.UpdateCursor(ds, ["Fire_Flow", "Colour"]) as ucursor:
    with arcpy.da.SearchCursor(ds, ["Static", "Residual", "Flow", "Fire_Flow"]) as scursor:
        for urow in ucursor:
             for srow in scursor:
                 urow[0] = "{}" * (("{}"-20)/("{}"-"{}"))**0.54.format(srow[2], srow[0], srow[0], srow[1])
                 ucursor.updateRow(urow)
                 if srow[3] <= 0:
                     urow[1] = "Black"
                     if srow[3] >= 1 and srow[3] <= 499:
                         urow[1] = "Red"
                         if srow[3] > 499 and srow[3] <= 999:
                             urow[1] = "Orange"
                             if srow[3] > 999 and srow[3] <= 1499:
                                 urow[1] = "Green"
                                 if srow[3] > 1499:
                                     urow[1] = "Blue"
                                     ucursor.updateRow(urow)

Tôi không muốn thêm các cột, tôi chỉ muốn cập nhật sau đó khi thử nghiệm Tĩnh, dư và Lưu lượng được tiến hành và thêm số.
LandArch

không có vấn đề, bạn chỉ có thể loại bỏ điều đó. xấu chỉnh sửa kịch bản để phản ánh điều này. Tập lệnh sẽ cần được chạy lại mỗi khi giá trị Tĩnh, dư hoặc Lưu lượng thay đổi. Nhưng phương pháp này sẽ nhanh hơn sau đó tính toán trường.
MacroZED

Tôi nhận được lỗi sau, có phải thay đổi [#] không vì chúng không phải là hàng 1 đến 3 trong bảng thuộc tính? Lỗi thời gian chạy TracBack (cuộc gọi gần đây nhất vừa qua): Tệp "<chuỗi>", dòng 5, trong <module> RuntimeError: không thể mở 'path / to / tập dữ liệu'
LandArch

Không, lỗi là do bạn chưa chỉ định tập dữ liệu. Biến "DS" cần được thay đổi thành tập dữ liệu thực tế của bạn.
MacroZED

Xin lỗi vì đã cầm tay, tôi cần bao gồm đường dẫn vật lý, ví dụ: C: / ....
LandArch
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.