أكثر

تحديد جيران الطرود باستخدام PYTHON

تحديد جيران الطرود باستخدام PYTHON


كما ترون في الصورة الأولى لدي قسيمة 220 وأريد أن أحدد مكانة كل من جاره! لذا كانت الفكرة هي حساب الاتجاه بين النقطة المركزية 220 ، والنقطة الوسطى الأخرى للجيران (عندما يكون الاتجاه بين [50،150] = الشمال ؛ [150 ، 250] = الشرق ؛ [250،350] = الغرب ...). لذلك لتحديد الجيران ، أستخدم الوظيفةarcpy.PolygonNeighbours_analysis (in_features، out_table، {in_fields})(الصورة 2) ، وفي الصورة 3 ، لدينا طرود مع centroide (X ، Y). لذلك في كل مرة يجب أن آخذ

  1. (X ، Y) من P220 كنقطة بداية و (X ، Y) من P228 كنقطة نهاية من حساب الاتجاه
  2. (X ، Y) من P220 كنقطة بداية و (X ، Y) من P227 كنقطة نهاية ، احسب الاتجاه
  3. (X ، Y) من P220 كنقطة بداية و (X ، Y) من P226 كنقطة نهاية ، احسب الاتجاه
  4. من جميع الجيران في الصورة 2

للقيام بذلك ، استخدمت ثلاث حلقات من أجل ، وأعتقد أنها تستدير لليمين ، لكنها تفعل ذلك للصف الأول فقط ، ولا تنتقل إلى صف نيوت!

الرمز هو هذا:

>>> cur = arcpy.UpdateCursor ("Join_Output_12") >>> cur2 = arcpy.UpdateCursor ("Join_Output_12") >>> cur_t = arcpy.UpdateCursor ("tb20_12_2014_") >>> del row2، Refname__ytable_neighbor ، end_x1، end_y1، copy_field >>> للصف في cur:… Refname_feature = row.getValue ("RefName")… لـ row_t في cur_t:… Refname__table_target = row_t.getValue ("src_RefName")… if (Refname__table_target == Refname_feature) :… start_x1 = row.getValue ("POINT_X")… start_y1 = row.getValue ("POINT_Y")… print Refname_feature… print start_x1… print start_y1… Refname__table_neighbor = row_t.getValue ("nbr_RefName")… print Refname__table_neighbor cur2:… copy_field = row2.getValue ("copy_field")… if (copy_field == Refname__table_neighbor):… end_x1 = row2.getValue ("POINT_X") ... end_y1 = row2.getValue ("POINT_Y") ... print copy_field… print end_x1 … print end_y1… row = cur.next ()

النتيجه هي:

1 221408.8543 200288.7235 1 1 221408.8543 200288.7235

لذلك أعتقد أن المشكلة تأتي من حلقة for!

الآن بعد الحصول على هذه النتيجة ، يمكنك أن ترى في الصورة 4 (ضع كل طرد) النتيجة التي حصلت عليها كانت جيدة! لكنها لا تستجيب بنسبة 100٪ لحاجتي ، ولأكون أكثر وضوحًا ، دعنا نرى مثال القسيمة 221 ، حيث يوجد جارتها 220 في الشمال والغرب أيضًا ، ولكن على الطاولة يمكننا أن نرى الشمال فقط ، لذلك أريد لإلغاء هذه النتيجة إلى نتيجة الوظيفةحساب الحقول المجاورة_الرسوم البيانية (في_الميزات ، في_الحقل)ستقول لي لماذا فقط لا تستخدم هذه الوظيفة فقط؟ لكنها أيضًا غير مكتملة! انظر إلى الصورة 5 لمعرفة النتيجة لنأخذ المثال P220 ، يمكننا أن نرى أنه يضع 224 ، 226 فقط في الشمال ، حتى لو كان هناك المزيد! لذا فإن الفكرة تكمن في تجميع النتيجتين للحصول أخيرًا على نتيجة أكثر اكتمالا وموثوقية! ولكن كيف نفعل ذلك ؟ لا أستطيع أن أجد منطقًا واحدًا للجمع بينهما !!

تحرير: هذا مثال على علاقة معقدة ، وعلى الطاولة بعد ما أحصل عليه كنتيجة الخط بالألوان ، يقدم الجيران الذين اختارهم البرنامج ، وعندما نظرت إلى نوع الفوضى من الطرود ، وجدت هو فقط من ليس على اتصال بطرد تاغيت (مثل 164 P2 و 150 في الشمال ...) !!


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

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

أنت تستخدم UpdateCursors ولكنك لا تكتب أي شيء على الطاولة. لماذا ا؟ أنت بحاجة إلى حقلي X و Y للكتابة إليه. ما عليك سوى UpdateCursor واحد على مصدر واحد على الإطلاق ، وليس اثنين على نفس مصدر البيانات. حدد تلك الحقول وأسمائها والجدول الذي سيقيمون فيه.

لذا ادرس مدونتي وابدأ من جديد. ستكون سعيد بانك فعلت.

نشكرك على تحرير المنشور الخاص بك باستخدام رسم يوضح مصدر الجداول والهدف من التحليل بالإضافة إلى جداول أفضل للعمل معها. تتمثل الخطوة الأولى في إضافة 4 حقول مزدوجة إلى الجدول مع حقلي src_RefName و nbr_RefName للاحتفاظ بـ XYs من النقطتين الوسطى من الجدول الآخر بحيث يكون هناك مكان لتخزين نتائج مؤشر التحديث. سأطلق عليهم اسم X_Start و Y_Start و X_End و Y_End. أضف أيضًا حقلًا مزدوجًا آخر للمحمل. المحمل المحسوب أدناه هو المحمل المثلثي الذي يبدأ من الشرق المناسب ويتجه عكس اتجاه عقارب الساعة ، وليس المحمل الملاحي الذي يبدأ من الشمال المنتظر ويتجه في اتجاه عقارب الساعة. إذا كنت تريد الاتجاه الملاحي ، فقم بتغيير الخط الذي يقرأ: updateRow6 = (زاوية + 360)٪ 360 إلى updateRow6 = (90 - زاوية)٪ 360. ارتباط المحامل بنقاط البوصلة هو [45-135] = الشمال ، [ 135-225] = الغرب ، [225-315] = الجنوب ، [315-359.9 ... ، 0-45] = الشرق.

الآن قم بتحميل الجدول مع النقطه الوسطى XY في القاموس. ثم احصل على قيمتي RefName لكل صف وقم بملء إحداثيات 2 XY والحقول المزدوجة المحمل. يمكن تكييف المثال الثالث في مدونتي للقيام بهذه العملية.

من وقت استيراد strftime print "بدء البرنامج النصي:" + strftime ("٪ Y-٪ m-٪ d٪ H:٪ M:٪ S") استيراد arcpy من درجات استيراد الرياضيات ، atan2 sourceFC = r "C:  Path  SourceFeatureClass "sourceFieldsList = [" RefName "،" POINT_X "،" POINT_Y "] # استخدم قائمة الفهم لبناء قاموس من da SearchCursor valueDict = {r [0] :( r [1:]) لـ r في arcpy.da. SearchCursor (sourceFC، sourceFieldsList)} updateFC = r "C:  Path  UpdateFeatureClass" updateFieldsList = ["src_RefName" ، "nbr_RefName" ، "X_Start" ، "Y_Start" ، "X_End" ، "Y_End" ، "Bearing"] مع arcpy.da.UpdateCursor (updateFC، updateFieldsList) كـ updateRows: for updateRow in updateRows: # قم بتخزين src_RefName و nbr_RefName للصف في زوج من متغيرات keyValue keyValue1 = updateRow [0] keyValue2 = updateRow [1] # تحقق من أن توجد keyValues ​​في القاموس إذا كانت keyValue1 في valueDict و keyValue2 في valueDict: # نقل القيمة المخزنة ضمن keyValues ​​من القاموس إلى الحقل المحدث. updateRow [2] = valueDict [keyValue1] [0] updateRow [3] = valueDict [keyValue1] [2] updateRow [4] = valueDict [keyValue2] [0] updateRow [5] = valueDict [keyValue2] [3] angle = الدرجات (atan2 (valueDict [keyValue1] [4] - valueDict [keyValue2] [5]، valueDict [keyValue1] [0] - valueDict [keyValue2] [0])) updateRow [6] = (angle + 360)٪ 360 updateRows .updateRow (updateRow) del valueDict print "Finished script:" + strftime ("٪ Y-٪ m-٪ d٪ H:٪ M:٪ S")

يحرر:

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

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

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

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

إذا نظرت إلى اتجاه النقطه الوسطى للمضلع 224 إلى النقطه الوسطى للمضلع 220 في الصورة الأولى ، يبدو أن علاقة الاتجاه يجب أن توصف بأنها جنوبية غربية. ومع ذلك ، عندما تنظر إلى صورة محامل النقطه الوسطى للمضلع 224 إلى النقطه الوسطى لحافتها المشتركة مع المضلع 220 ، فمن الواضح أن علاقة الاتجاه بين 224 إلى 220 من وجهة النظر هذه توصف بدقة أكبر بأنها علاقة تحمل الجنوب الشرقي. من وجهات نظر مختلفة ، كلاهما صحيح بالنسبة لهذا الفيل. السؤال هو ، هل تقبل سوى واحدة من هذه الإجابات على أنها صحيحة أم أنك تقبل كلاهما على أنه صحيح؟

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

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


شاهد الفيديو: تطبيق عملي ومشروع كامل على تحليل البيانات في بايثون. Python Exploratory Data Analysis Case-study