أكثر

احصل على المعلمة كنص وحدد طبقة بسمة

احصل على المعلمة كنص وحدد طبقة بسمة


لقد كتبت أداة نصية بلغة Python حيث يحدد المستخدم فئة ميزة (على سبيل المثال ، Landuse) تحتوي على سمات مختلفة (على سبيل المثال ، حجم قطعة الأرض وغطاء الأرض وما إلى ذلك) ، واسم حقل السمة الذي سيتم تحديد الميزات منه (على سبيل المثال ، "landcover" ) واسم السمة المطلوب تحديدها (على سبيل المثال ، "الغابة" أو "المباني"). يجب أن تكون النتيجة النهائية أن البرنامج النصي يختار جميع الميزات ذات السمة المحددة وينشئ فئة ميزة جديدة خارجها. لهذا ، لدي 3 معلمات إدخال ، كما هو موضح أدناه ، ويتلقى البرنامج النصي الإدخال باستخدامGetParameterAsText ().

يبدو كتلة التعليمات البرمجية الخاصة بي كما يلي:

FClass = arcpy.GetParameterAsText (0) Field = arcpy.GetParameterAsText (1) Feature = arcpy.GetParameterAsText (2) arcpy.MakeFeatureLayer_management (FClass، "FclassLayer") arcpy.SelectLayerByAttribute_management (" = 'Feature' ") arcpy.CopyFeatures_management (" FclassLayer "،" Feature1.shp ")

عندما أقوم بتشغيل أداة البرنامج النصي ، فإنها لا تنتج أي رسالة خطأ وتقوم بإنشاء Feature1.shp ، ولكن ملف الشكل هو مجرد نسخة من فئة الميزة المحددة. هذا يعني،اخترLayerByAttributeهو ببساطة اختيار فئة الميزة بأكملها بغض النظر عن السمة المحددة.

نظرًا لكوني مبتدئًا في برمجة لغة Python ، فأنا غير قادر على تحديد الخطأ الذي أفعله هنا. علاوة على ذلك ، اختبرت نفس البرنامج النصي بقيم مشفرة ثابتة بدلاً من الحصول عليه من المستخدمGetParameterAsText، وهناك يعمل بشكل مثالي ويحصل لي على الإخراج كما هو متوقع.


المشكلة تكمن فياخترLayerByAttributeخط.

طلبك"'الحقل' = 'ميزة'"يشير إلى أنك تريد تحديد كل المعالم في أي سمةحقليحتوي على السلسلةميزة. ينتهي هذا باختيار لا شيء (من المفترض أنه لم يتم تسمية أي حقولحقلو / أو تحتوي على'ميزة') ، وهكذانسخ الميزاتخطوة نسخ كل شيء في طبقة المعالم.

نظرًا لأنك تريد أن يتم التعامل معها كمتغيرات ، فحاول بدلاً من ذلك:

"{} = '{}'". format (Field، Feature) # في حالة الاستعلام عن تنسيق GDB '"{}" = ' {}  ". (حقل ، ميزة) # إذا كان الاستعلام عن ملف شكل

سيؤدي ذلك إلى استبدال المعلمات التي يوفرها المستخدم في السلسلة ، ويجب الاستعلام عنها واختيارها ونسخها بشكل صحيح.

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


لديك خطأ هنا:

arcpy.SelectLayerByAttribute_management ("FclassLayer"، "NEW_SELECTION"، "'Field' = 'Feature'")

لا يوجد اقتباس بسيط للحقول ولكن تم شرح 3 حلول أخرى في المستند هنا

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

إذا كان الاستعلام الخاص بك على Shapefile، استخدم علامة اقتباس مزدوجة ومرفقة بـ "" "" ""

arcpy.SelectLayerByAttribute_management ("FclassLayer"، "NEW_SELECTION"، "" "" {} "= '{}'" "". format (Field، Feature))

إذا كان استفسارك على GDB، لا يوجد اقتباس

arcpy.SelectLayerByAttribute_management ("FclassLayer"، "NEW_SELECTION"، "{} = '{}'". format (Field، Feature))

إذا كان استفسارك على MDB، لا يوجد اقتباس ولكن []

arcpy.SelectLayerByAttribute_management ("FclassLayer"، "NEW_SELECTION"، "[{}] = '{}'". format (Field، Feature))

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

مشكلة الكود هي التعبير ، لقد وضعت المتغيرحقلالذي يحمل اسم الحقل في غضون سلسلة لذلك الكود يبحث عن حقل يسمى الحقل!

ستحتاج إلى إنشاء تعبير مثل:

'"' + الحقل +" = '"+ الميزة +" "" + "" "

قد يتغير هذا اعتمادًا على تنسيق البيانات المصدر. السبب في أن الطريقة الذكية لحل هذا الأمر وجعل شفرتك قوية هي استدعاء الوظيفة AddFieldDelimiters. ابحث في تعليمات سطح المكتب حول هذاأركبيوظيفة.


ما حل مشكلتي في النهاية هو ما يلي:

arcpy.SelectLayerByAttribute_management ("FclassLayer"، "NEW_SELECTION"، "" "" {} "= '{}'" "". format (Field، Feature))

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


شاهد الفيديو: ملف الإنجاز وملف المعلمة