أكثر

تحرير نقاط النهاية في Polyline باستخدام ArcPy؟


أحاول إنشاء أداة انجذاب لنقطة نهاية متعددة الخطوط في Python باستخدام ArcGIS 10. باستخدام مؤشر البحث الذي قرأته في القيم لمصفوفة من كائنات الخط (التي تحتوي على معرّف الميزة للخط ، وكائني "نقطة النهاية" - أولاً و أخيرًا - التي تحتوي على إحداثيات X و Y لكل منهما) ، ثم قم بمعالجة بعض استيفاء البيانات للنقاط لإعطاء جميع النقاط قيمها الصحيحة.

حتى الآن ، يعمل هذا الجزء بشكل مثالي. ومع ذلك ، عندما أحاول العودة وتحرير ملف الأشكال ، يمكنني رؤية البيانات التي أقوم بتغييرها ، لكن لا يمكنني تحريرها.

هذا هو الكود الخاص بتحديث الحقول:

# -------------------------- # # تحديث الملف بـ EPs الجديدة # # ------------ -------------- # إنشاء مؤشر التحديث # rows = arcpy.UpdateCursor (outputDirectory + "" + trails_fc + ".shp") # أدخل للحلقة لكل ميزة / صف # i = 0 للصف في الصفوف: # إنشاء كائن الهندسة # feat = row.getValue (shapefieldname) partnum = 0 if feat.getPart (partnum) [0] .X! = allLines [i] .startEP.x: arcpy.AddMessage ("تغيير:" + str (feat.getPart (partnum) [0] .X) + "إلى" + str (allLines [i] .startEP.x)) feat.getPart (partnum) [0] .X = allLines [i] .startEP.x rows.updateRow (row) arcpy.AddMessage ("الآن هو:" + str (feat.getPart (partnum) [0] .X)) i + = 1

تتكون قراءاتي من عبارات مثل هذه:

التغيير: -105.512166832 إلى -105.699533165 الآن: -105.512166832

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

هل لدي احد اى افكار؟


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

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

بشكل ملموس:

لـ r في cur: ary = r.getValue ("SHAPE"). getPart (0) ary.replace (0، right_point_object) # first arg 0 يستبدل النقطة الأولى في السطر newLine = arcpy.Polyline (ary) r.setValue ("SHAPE"، newLine) cur.updateRow (r)

لاحظ اليستبدلتأخذ الطريقة فهرسًا وقيمة. للأسف لا يقبل على سبيل المثال -1 كفهرس لآخر نقطة في المصفوفة. ومع ذلك يمكنك القولmy_array [my_array.count].

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

row_num = 0 لـ r في cur: r.setValue (shapeField، right_geometry_list [row_num]) cur.updateRow (r) row_num + = 1

وهو ، على الأقل بالنسبة لي ، أكثر وضوحًا ... لكن هذا الأسلوب!

تحرير للإضافة:

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

استيراد arcpy def offsetPoint (old_point، X_distance، Y_distance): "" "وظيفة تافهة لتعويض نقطة - استبدل بما تفعله بالفعل." "new_point = arcpy.Point (old_point.X + X_distance، old_point.Y + Y_distance) إرجاع new_point def offsetFirstPointInLine (line_geom، X_distance، Y_distance): "" "يأخذ كائنًا هندسيًا متعدد الخطوط ويعيد خطًا متعدد الخطوط جديدًا مع إزاحة النقطة الأولى من الجزء الأول بالمسافة المحددة." "" المصفوفة = line_geom.getPart ( 0) first_point = array [0] new_point = offsetPoint (first_point، X_distance، Y_distance) # أنشئ مصفوفة جديدة بنقطتك الجديدة في الموضع 0 ، و # باقي النقاط من المصفوفة القديمة. new_array = arcpy.Array ([new_point] + [array.getObject (x) لـ x في النطاق (1، array.count)]) # ثم قم بعمل كائن متعدد الخطوط جديد بهذه المصفوفة. new_line = arcpy.Polyline (new_array) يُرجع new_line fc = r "C:  Users  student  Documents  ArcGIS  Default.gdb  SomeStorms" cur = arcpy.UpdateCursor (fc) لـ r في cur: geom = r.getValue ( "الشكل") r.setValue ("SHAPE"، offsetFirstPointInLine (geom، -45000، -5000)) cur.updateRow (r) del r، cur

نأمل أن يساعد ذلك في توضيحها.


شاهد الفيديو: AutoCAD Spline Command Tutorial Complete. Fit, Control Points, Convert to Polyline, Precision (شهر اكتوبر 2021).