أكثر

قم بتعيين بيانات شبكة الأنابيب المفقودة (العمر والحجم) بناءً على أقرب الأنابيب المجاورة أو المتصلة

قم بتعيين بيانات شبكة الأنابيب المفقودة (العمر والحجم) بناءً على أقرب الأنابيب المجاورة أو المتصلة


لدي بيانات شبكة الأنابيب (خطوط متعددة) مع سمات العمر والحجم المفقودة. بالنسبة لعمر الأنابيب ، لدي 10779 أنبوبًا يحتوي 1034 منها على قيم NODATA. بالنسبة لحجم الأنبوب ، لدي 10779 أنبوبًا مع 738 منها بقيم NODATA.

ما الأداة التي يمكنني استخدامها لتعيين القيم المفقودة استنادًا إلى أقرب (أو توصيل) معلومات خصائص الأنبوب؟

تحرير 1: في رأيي ، أشعر أنه يمكنني إعداد شيء مثل هذا الرمز الزائف:

لكل أنبوب إذا كان الأنبوب [age] == NODATA ابحث عن pipe_nearest [age] = pipe_nearest [age] إذا كان الأنبوب [الحجم] == NODATA ابحث عن pipe_nearest [size] = pipe_nearest [الحجم]

وبعد ذلك يتم كل شيء. أنا فقط لا أستطيع معرفة كيفية تحديد polyline الأقرب إلى polyline الحالي.

تحرير 2: محاولة استخدام حل FelixIP. أولاً ، تمكنت من الوصول إلى نسخة أخرى من مجموعة البيانات مع الأنابيب المتصلة بوضوح ببعضها البعض - لدي من وإلى حقول العقدة (FNODE_1 و TNODE_1) ، ومن الواضح أن الأنابيب مقطوعة ببعضها البعض. لقد قمت بنسخ الطبقة الأولية مرتين ، وإنشاء طبقات has_X و Missing_X لكل من معلومات العمر (YEAR_) والقطر (DIAM).

بدءًا من القطر أولاً ، قمت بتعديل البرنامج النصي لأسماء الطبقات الخاصة بي ، لذلك يقرأ:

def fillGap (d، fr): mxd = arcpy.mapping.MapDocument ("CURRENT") lyr = arcpy.mapping.ListLayers (mxd، "Has_Diam") [0] TNODE_1 "=٪ s٪ s٪ s"٪ (r "" "، fr،" "") tbl = arcpy.da.TableToNumPyArray (lyr، "DIAM"، q) إذا كان len (tbl) == 0: إرجاع d إرجاع tbl [0] [0] fillGap (! DIAM! ،! FNODE_1!)

ولكن لسبب ما أتلقى هذا الخطأ عند التنفيذ:

أحاول فرزها ، لكن نظرًا لأنني لا أكمل كود Python المستخدم في حساب التعبير ، فقد ثبت أنه صعب بعض الشيء.


الطريقة أدناه تعمل للأنابيب ذات النهايات المقطوعة بنهايات الأنابيب الأخرى ، التي أستخدمها شكل كمثال.

أضف حقلين نصيين (FROMN ، TON) ، بطول 50 حرفًا إلى الجدول الخاص بك وقم بتشغيل هذا البرنامج النصي في الحقل FROMN

def truncate (f، n): s = '{}'. format (f) i، p، d = s.partition ('.') return '.'. Join ([i، (d + '0' * n ) [: n]]) def fromto (shp، ft): p = shp.firstPoint if ft> 0: p = shp.lastPoint return truncate (pX، 2) + "-" + truncate (pY، 2)

استخدام

fromto (! Shape!، 0)

قم بتشغيل نفس البرنامج النصي في الحقل TON ، باستخدام

fromto (! Shape!، 1)

سيبدو الجدول الخاص بك مشابهًا لهذا.

لاحظ أن القطر المفقود له قيمة -1 في المثال الخاص بي.

قم بإنشاء نسخ من طبقة الأنابيب الخاصة بك في جدول المحتوى باستخدام النسخ واللصق. استدعاء طبقة واحدة مفقود واستخدام استعلام التعريف

"القطر" = -1

استدعاء طبقة واحدة AVAILABLE واستخدام استعلام التعريف

"DIAMETER" <> -1

سيبدو جدول المحتوى الخاص بك كما يلي:

لاحظ عدد السجلات في الطبقة المفقودة وقم بتشغيل هذا البرنامج النصي في الحقل DIAMETER للطبقة المفقودة:

def fillGap (d، fr): mxd = arcpy.mapping.MapDocument ("CURRENT") lyr = arcpy.mapping.ListLayers (mxd، "AVAILABLE") [0] TON "=٪ s٪ s٪ s"٪ (r "" "، fr،" "") tbl = arcpy.da.TableToNumPyArray (lyr، "DIAMETER"، q) إذا len (tbl) == 0: return d return tbl [0] [0] fillGap (! DIAMETER! ،! من!)

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

ما يفعله البرنامج النصي هو توفير الوقت عند الانضمام إلى جداول MISSING و AVAILABLE باستخدام حقلي FROMN و TON وفقًا لذلك.

إذا كان لا يزال لديك سجلات في الطبقة المفقودة بعد عدة عمليات تشغيل ، فيجب عليك ملء الفجوات في اتجاه المنبع. للقيام بذلك ، استبدل سطر الاستعلام في البرنامج النصي

q = '"FROMN" =٪ s٪ s٪ s'٪ (r "" "، fr،" "")

وتشغيله باستخدام

ملء جاب (! DIAMETER !،! ton!)

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

في غضون ذلك ، جرب هذا:

سيبدو جدول الإخراج مثل هذا

إنها إجابة سؤالك:

لكل أنبوب (مفقود) ابحث عن أقرب أنبوب بالحجم المتاح

أليس كذلك؟

الطريقة السريعة جدًا والقذرة جدًا هي ضمها إلى الجدول المفقود (PIPE_ID إلى PIPE_ID) وحساب DIAMETER في الجدول المفقود باستخدام DIAMETER_1 وهذا يعادل

إذا كان الأنبوب [الحجم] == NODATA: الأنبوب [الحجم] = pipe_nearest [الحجم]


شاهد الفيديو: Stucwerk Oudezijds Voorburgwal 61