أكثر

خطأ في الطبقة عند العمل مع الملفات عبر إطارات بيانات متعددة

خطأ في الطبقة عند العمل مع الملفات عبر إطارات بيانات متعددة


يمكنني الحصول على الكود التالي للتشغيل في mxd مع إطار بيانات واحد. ومع ذلك ، أحتاج إليه للتشغيل والتكرار عبر mxd الذي يحتوي على العديد من إطارات البيانات مع ملفات ومصادر بيانات ذات أسماء متطابقة لتلك الموجودة في قائمة lyrlist الخاصة بي.

تعديل معلومات إضافية - كان القصد من عبارة last if هو توفير حل بديل لعدم قدرة arcpy على تعيين Display Expression في مربع حوار خصائص الطبقة عن طريق إعادة إضافة ملف به حقل اسم. لذا ، فإن جوهر السؤال هو أفضل طريقة لتحديث طبقات Display Expression بطريقة آلية قدر الإمكان (ويفضل أن يكون ذلك مع python لأنني لا أعرف ArcObjects).

import arcpy lyrlist = ['Inset Bridges'، 'Bridges'، 'Transportation Points'، 'Transportation Lines'] mxd = arcpy.mapping.MapDocument ("Current") dflist = arcpy.mapping.ListDataFrames (mxd) لـ df في dflist : if df.scale <= 126720: لـ lyr in (arcpy.mapping.ListLayers (mxd، ""، df)): if lyr.supports ("DEFINITIONQUERY"): if lyr.name in lyrlist: NewFile = arcpy.mapping .Layer (lyr.dataSource) OldFN = lyr.name NewFile.name = "NewFi" lyr.name = "OldFi" arcpy.mapping.InsertLayer (df، lyr، NewFile، "AFTER") # ينتج عن السطر التالي خطأ في القيمة عند التشغيل في #mxd يحتوي على إطارات بيانات متعددة بأسماء ملفات من lyrlist updateLyr = arcpy.mapping.Layer ("NewFi") sourceLyr = arcpy.mapping.Layer ("OldFi") arcpy.mapping.UpdateLayer (df، updateLyr، sourceLyr، True) updateLyr.name = OldFN arcpy.mapping.RemoveLayer (df، lyr) arcpy.RefreshTOC () arcpy.RefreshActiveView print "script complete" del mxd

يعمل الكود جيدًا حتى يصل إلى المكان الذي أسند إليه متغير updateLyr. هذا يعطيني الخطأ التالي:

تتبع خطأ وقت التشغيل (آخر مكالمة أخيرة):

ملف "" ، السطر 44 ، بتنسيق

ملف "c: program files (x86) arcgis desktop10.1 arcpy arcpy arcobjects mixins.py"، السطر 389، in فيه سوبر (LayerMixin ، النفس).فيه(ملف lyrfile)

ملف "c: program files (x86) arcgis desktop10.1 arcpy arcpy arcobjects_base.py" ، السطر 47 ، في فيه لـ arg in args))

ValueError: الكائن: CreateObject Layer مصدر بيانات غير صالح


لتصحيح هذا ، أوصيك بتغيير:

بالنسبة إلى df في dflist: if df.scale <= 126720: لـ lyr in (arcpy.mapping.ListLayers (mxd، ""، df)): if lyr.supports ("DEFINITIONQUERY"):

ل:

لـ df في dflist: if df.scale <= 126720: لـ lyr in (arcpy.mapping.ListLayers (mxd، ""، df)): print df.name + ":" + lyr.name if lyr.supports (" استعلام تعريف "):

لم أختبر ما ورد أعلاه ، لكن يجب أن يتيح لك تحديد إطار البيانات والطبقة التي تؤدي إلى حدوث الخطأ.


حصلت على أفكار تصحيح أخطاء جيدة ساعدتني في النهاية على التوصل إلى حل ، والذي انتهى به الأمر إلى أن يكون أبسط مما كنت أحاول القيام به. في الأساس ، تركت برنامج Arcpy UpdateLayer يقوم بالمزيد من العمل لإصلاح مشكلة Display Expression. لست متأكدًا من مصدر مشكلتي الأصلية ولكن الحل التالي فعل ما أردت:

* تحرير هنا هو الحل الخاص بي. تم تعديله لتغيير آخر معلمة UpdateLayer إلى False. كان هذا أمرًا بالغ الأهمية لأنه يطبق بعد ذلك قالب الطبقة بالكامل وليس فقط وسيلة الإيضاح على الملف الذي يحتاج عرضه إلى التحديث. راجع وثائق ESRI لمزيد من المعلومات.

استيراد arcpy mxd = arcpy.mapping.MapDocument ("Current") dflist = arcpy.mapping.ListDataFrames (mxd) لـ df في dflist: if df.scale <= 126720: لـ lyr in (arcpy.mapping.ListLayers (mxd، " "، df)): if lyr.supports (" DEFINITIONQUERY "): if lyr.name ==" Bridges ": sourceLyr = arcpy.mapping.Layer (r" C:  Bridgefile.lyr ") arcpy.mapping.UpdateLayer ( df، lyr، sourceLyr، False) print lyr.name + "updated" elif lyr.name == "Transportation Lines": sourceLyr = arcpy.mapping.Layer (r ": C:  TransFile.lyr") arcpy.mapping. UpdateLayer (df، lyr، sourceLyr، False) اطبع lyr.name + "محدث" arcpy.RefreshTOC () arcpy.RefreshActiveView print "script complete" del mxd