Hơn

Quản lý các biến môi trường trong arcpy?

Quản lý các biến môi trường trong arcpy?


Tài liệu Arcpy dường như gợi ý rằng khi viết các tập lệnh python sử dụng / sửa đổi các biến trongarcpy.env, bạn nên gói mọi thứ trong một loạt cácthử / ngoại trừ / (cuối cùng)vòng lặp với các loại lỗi tùy chỉnh (thường là một phương pháp không tốt, IMO).

Trong trường hợp ở đây, họ thậm chí không đề phòng các lỗi khi kiểm tra tiện ích mở rộng:

import arcpy import arcpyproduction # Kiểm tra giấy phép Lập bản đồ Sản xuất arcpy.CheckOutExtension ("Nền tảng") # Xác định tài liệu bản đồ, khung dữ liệu và tọa độ hình học đa giác [snip] # Tạo hình đa giác cho coordPair trong coordList: x, y = coordPair.split ( ";") pnt = arcpy.Point (x, y) array.add (pnt) array.add (array.getObject (0)) borderPolygon = arcpy.Polygon (array) [snip] # Kiểm tra phần mở rộng arcpy.CheckInExtension ( "Sự thành lập")

Tôi biết đó không phải là một rủi ro lớn, nhưng phải có một cách tốt hơn, phải không?


Tôi thích sử dụng trình quản lý ngữ cảnh. Đặc biệt, tôi có ba cho

  • arcpy.env.workspace,
  • arcpy.env.overwriteOutput, và
  • arcpy.Check [In | Out] Extension

Họ đang:

class Extension (object): def __init __ (self, name): self.name = name def __enter __ (self): if arcpy.CheckExtension (self.name) == "Có sẵn": arcpy.CheckOutExtension (self.name) else: nâng lên ValueError ("% s giấy phép không khả dụng"% self.name) def __exit __ (self, * args): arcpy.CheckInExtension (self.name) class OverwriteState (object): def __init __ (self, override): self. orig_state = arcpy.env.overwriteOutput self.new_state = bool (ghi đè) def __enter __ (self, * args, ** kwargs): arcpy.env.overwriteOutput = self.new_state def __exit __ (self, * args, ** kwargs): arcpy.env.overwriteOutput = self.orig_state class WorkSpace (object): def __init __ (self, path): self.orig_workspace = arcpy.env.workspace self.new_workspace = path def __enter __ (self, * args, ** kwargs): arcpy.env.workspace = self.new_workspace def __exit __ (self, * args, ** kwargs): arcpy.env.workspace = self.orig_workspace

Nếu phiên bản arcpy của bạn gần đây đủ để có trên Python 2.7, bạn có thể sử dụng tất cả chúng cùng lúc như sau:

với Extension ("3D"), OverwriteState (True), Workspace ("c: / GrosMorne"): arcpy.HillShade_3d ("WesternBrook", "wbrook_hill", 300) arcpy.Aspect_3d ("WesternBrook", "wbrook_aspect")

Nếu bạn bị mắc kẹt trên Python 2.6, nó xấu hơn một chút:

with Extension ("3D"): with OverwriteState (True): with: Workspace ("c: / GrosMorne"): arcpy.HillShade_3d ("WesternBrook", "wbrook_hill", 300) arcpy.Aspect_3d ("WesternBrook", "wbrook_aspect ")

Những điều này bảo vệ chống lại các lỗi trong bất kỳ quá trình xử lý nào bạn thực hiện để các biến / tiện ích mở rộng môi trường được hoàn nguyên về trạng thái ban đầu cho dù mã trongvớichặn các lần thoát (ví dụ: thành công, bị lỗi, bị gián đoạn).

Nó trông giống như thế này:

arcpy.env.overwriteOutput = In sai ('Trước trình quản lý ngữ cảnh: {}'. format (arcpy.env.overwriteOutput)) với OverwriteState (True): print ('Bên trong trình quản lý ngữ cảnh: {}'. format (arcpy. env.overwriteOutput)) raise ValueError ("arcpy is a bad time") print ('Sau trình quản lý ngữ cảnh: {}'. format (arcpy.env.overwriteOutput))

Đầu ra:

Trước trình quản lý ngữ cảnh: Sai Bên trong trình quản lý ngữ cảnh: Đúng -------------------------------------- ------------------------------------- ValueError Traceback (cuộc gọi gần đây nhất) [snip] ValueError: arcpy là một thời điểm tồi tệ --------------------------------------------- ------------------------------ Sau trình quản lý ngữ cảnh: Sai

Sau khi tìm hiểu về một số tính năng tốt của thư viện tiêu chuẩn python, trình quản lý ngữ cảnh đơn giản hóa thành:

import arcpy từ contextlib import contextmanager @contextmanager def Phần mở rộng (tên): "" "Sử dụng an toàn phần mở rộng ArcGIS" "" if arcpy.CheckExtension (name) == u "Available": status = arcpy.CheckOutExtension (tên) trạng thái sản lượng khác: raise RuntimeError ("% s giấy phép không khả dụng"% name) arcpy.CheckInExtension (name) @contextmanager def OverwriteState (state): "" "Tạm thời đặt biến env" OverwriteOutput "." "" orig_state = arcpy.env. OverwriteOutput arcpy.env.overwriteOutput = bool (state) output state arcpy.env.overwriteOutput = orig_state @contextmanager def WorkSpace (path): "" "Tạm thời đặt biến env" không gian làm việc "." "" orig_workspace = arcpy.env.workspace arcpy.env.workspace = đường dẫn năng suất đường dẫn arcpy.env.workspace = orig_workspace

Xem video: Hướng dẫn Bài tập lớp GIS trong Quản lý đất đai Phần 1