أكثر

تعيين معرفات النقاط لسمات البداية والنهاية ذات الصلة لخطوط متعددة؟

تعيين معرفات النقاط لسمات البداية والنهاية ذات الصلة لخطوط متعددة؟


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

في ArcHydro ، حاولت استخدام أدوات السمات> إنشاء من / إلى العقد للخطوط ولكنه ينشئ قيمًا لـ "إلى" و "من" ليست من بيانات نقطتي. كان البديل الآخر الخاص بي هو استخدام Feature to Vertices وضم النتيجة إلى جدول بيانات النقاط الخاص بي للحصول على معرف النظام. ولكن بعد ذلك سأضطر إلى تحديث طبقة الخطوط المتعددة أيضًا. أنا متأكد من أن هناك طريقة أسهل للقيام بذلك.

ملاحظة: ليست كل الخطوط لها نقاط عند الرؤوس ، فالقيم الفارغة مناسبة لها.


في بعض الأحيان يكون من الأفضل عدم استخدام الحل خارج الصندوق. هذا هو السبب في أنني أقترح

  1. قم بملء الحقول X و Y في طبقة العقدة ، وقم بتحويلها إلى أعداد صحيحة ، على سبيل المثال سم. قم بإنشاء حقل سلسلة وملئه بسلسلة تمثيلات سلسلة من الأعداد الصحيحة.
  2. افعل شيئًا مشابهًا في جدول الروابط للنقطة الأولى في الشكل.
  3. انضم إلى جدول العقد للارتباطات باستخدام أحدث الحقول التي تم إنشاؤها ونقل nodeID إلى الحقل FROM.

انتقل إلى 2 ، ولكن استخدم النقطة الأخيرة لتعيين TO nodeID


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

  1. لقد استخدمت صلة مكانية لاكتشاف النقاط / العقد التي كانت ضمن ميزة خطية معينة.

  2. نظرًا لأن الوصلة المكانية لا تأخذ اتجاه التدفق في الاعتبار ، فقد استخدمت Arcpy للتأكد من نقطة البداية ونقطة النهاية. لقد تمكنت من القيام بذلك باستخدام Arcpy يصف وظيفة لاستخراج معلومات الإحداثيات لرؤوس البداية / النهاية لميزة الخط ومقارنتها بقيم إحداثيات النقاط المتصلة.

  3. أخيرًا ، بمجرد تحديد أي من النقاط إلى / من التي استخدمت وظيفة setValue لملء الحقول إلى / من في مجموعة البيانات الأصلية متعددة الخطوط.

من الواضح أن هناك ما هو أكثر من ذلك بقليل ولكني أوجزت النقاط الرئيسية.


لقد استلهمت الفكرة منFelixIP ، لكنني أردت كتابة حل بدون صلات أو إنشاء ملفات إضافية ، نظرًا لأن شبكتي كبيرة جدًا حيث تحتوي على 400 ألف + أنابيب وعقد 500 ألف +.

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

المرجع: ASSETID = معرف الأنبوب ، UNITID = معرف العقدة في بداية أنبوب التوجيه ، UNITID2 = معرف العقدة في نهاية الأنبوب.

العقد = "mergeNodes" الأنابيب = "SEWER_1" nodeDict = {} pipeDict = {} #populate node Dictionary مع X ، Y كمعرف المفتاح والعقدة كقيمة للعقدة في arcpy.da.SearchCursor (العقد ، ["UNITID") ، "SHAPE @ XY"]): nodeDict [(node ​​[1] [0]، node [1] [1])] = node [0] #populate pipe Dictionary with pipe ID as the key and list of X، Y كقيم #vertices يتم ملؤها بالترتيب الذي رسم الخط فيه # بحيث يكون [0] هو الرأس الأول و [-1] هو الرأس الأخير للأنبوب في arcpy.da.SearchCursor (الأنابيب ، ["ASSETID" ، "SHAPE @ "]): لـ arrayOb في الأنبوب [1]: للنقطة في arrayOb: إذا كان الأنبوب [0] في pipeDict: pipeDict [pipe [0]]. append ((point.X، point.Y)) else: pipeDict [ الأنابيب [0] = [(point.X، point.Y)] #populate UNITID مع الرأس الأول من السطر #populate UNITID2 مع الرأس الأخير للخط الذي يحتوي على arcpy.da.UpdateCursor (الأنابيب ، ["ASSETID" ، "UNITID"، "UNITID2"]) كـ cur: for pipe in cur: if pipeDict [pipe [0]] [0] في nodeDict: pipe [1] = nodeDict [pipeDict [pipe [0]] [0]] if pipeDict [pipe [0]] [- 1] في nodeDict: pipe [2] = nodeDict [pipeDict [الأنابيب [0]] [- 1]] cur.updateRow (الأنبوب)

شاهد الفيديو: 6 امور مخفيه في خيارات المطورين