أكثر

إدارة متغيرات البيئة في Arcpy؟

إدارة متغيرات البيئة في Arcpy؟


يبدو أن وثائق Arcpy تشير إلى أنه عند كتابة نصوص Python النصية التي تستخدم / تعدل المتغيرات بتنسيقarcpy.env، يجب عليك لف كل شيء في مجموعة منحاول / باستثناء / (أخيرًا)حلقات بأنواع أخطاء مخصصة (وهي ممارسة سيئة بشكل عام ، IMO).

في الحالة هنا ، لا يحترسوا حتى من الأخطاء عندما يتركون الامتداد مفتوحًا:

import arcpy import arcpyproduction # تحقق من ترخيص رسم خرائط الإنتاج arcpy.CheckOutExtension ("Foundation") # تحديد مستند الخريطة وإطار البيانات وإحداثيات هندسة المضلع [snip] # إنشاء هندسة المضلع لـ formatPair في قائمة الإحداثيات: x، y = coordPair.split ( "؛") pnt = arcpy.Point (x، y) array.add (pnt) array.add (array.getObject (0)) borderaryPolygon = arcpy.Polygon (array) [snip] # Check in extension arcpy.CheckInExtension ( "مؤسسة")

أعلم أن هذه ليست مخاطرة كبيرة ، لكن يجب أن تكون هناك طريقة أفضل ، أليس كذلك؟


أحب استخدام مديري السياق. على وجه الخصوص ، لدي ثلاثة من أجل

  • مساحة عمل arcpy.env,
  • arcpy.env.overwriteOutput، و
  • arcpy.Check امتداد [In | Out]

هم انهم:

ملحق الفئة (كائن): def __init __ (self ، name): self.name = name def __enter __ (self): if arcpy.CheckExtension (self.name) == "Available": arcpy.CheckOutExtension (self.name) else: رفع ValueError ("٪ s ترخيص غير متوفر"٪ self.name) def __exit __ (self، * args): arcpy.CheckInExtension (self.name) class OverwriteState (object): def __init __ (self، overwrite): self. Orig_state = arcpy.env.overwriteOutput self.new_state = bool (overwrite) def __enter __ (self، * args، ** kwargs): arcpy.env.overwriteOutput = self.new_state def __exit __ (self، * args، ** kwargs): : arcpy.env.workspace = self.new_workspace def __exit __ (self، * args، ** kwargs): arcpy.env.workspace = self.orig_workspace

إذا كان إصدار Arcpy الخاص بك حديثًا بما يكفي ليكون على Python 2.7 ، فيمكنك استخدامها جميعًا في نفس الوقت مثل هذا:

مع الامتداد ("3D") ، OverwriteState (True) ، مساحة العمل ("c: / GrosMorne"): arcpy.HillShade_3d ("WesternBrook"، "wbrook_hill"، 300) arcpy.Aspect_3d ("WesternBrook"، "wbrook_aspect")

إذا كنت عالقًا في Python 2.6 ، فهذا أبشع قليلاً:

بالملحق ("3D"): مع OverwriteState (True): with: Workspace ("c: / GrosMorne"): arcpy.HillShade_3d ("WesternBrook"، "wbrook_hill"، 300) arcpy.Aspect_3d ("WesternBrook"، "wbrook_aspect ")

هذه الحماية من الأخطاء في أي معالجة تقوم بها بحيث يتم إرجاع متغيرات / ملحقات البيئة إلى حالتها الأصلية بغض النظر عن كيفية الكود داخلمعمنع الخروج (على سبيل المثال ، بنجاح ، خطأ ، متقطع).

هذا يبدو كالتالي:

arcpy.env.overwriteOutput = False print ('Before the Context manager: {}'. format (arcpy.env.overwriteOutput)) مع OverwriteState (True): print ('Inside the Context manager: {}'. format (arcpy. env.overwriteOutput)) رفع ValueError ("arcpy وقت سيء") print ('بعد مدير السياق: {}'. format (arcpy.env.overwriteOutput))

انتاج:

قبل مدير السياق: خطأ داخل مدير السياق: صحيح -------------------------------------- ------------------------------------- ValueError Traceback (أحدث استدعاء أخير) [snip] ValueError: Arcpy هو وقت سيء --------------------------------------------- ------------------------------ بعد مدير السياق: False

بعد التعرف على بعض مزايا مكتبة Python القياسية ، يقوم مديرو السياق بالتبسيط إلى:

استيراد arcpy من Contextlib import Contextmanagercontextmanager def Extension (name): "" "استخدام ملحقات ArcGIS بأمان" "" إذا كان arcpy.CheckExtension (الاسم) == u "متاح": status = arcpy.CheckOutExtension (الاسم) ينتج عنه حالة أخرى: رفع RuntimeError ("ترخيص٪ s غير متوفر"٪ name) arcpy.CheckInExtension (الاسم)contextmanager def OverwriteState (حالة): "" "عيّن مؤقتًا" overwriteOutput "env متغير." "" Orig_state = arcpy.env. overwriteOutput arcpy.env.overwriteOutput = bool (state) العائد الحالة arcpy.env.overwriteOutput = Orig_statecontextmanager def WorkSpace (المسار): "" "عيّن مؤقتًا" مساحة العمل "متغير env." "" Orig_workspace = arcpy.env.workspace arcpy.env.workspace = مسار مسار العائد arcpy.env.workspace = Orig_workspace

شاهد الفيديو: Python: Map Automation in ArcGIS Pro