أكثر

طريقة لتقسيم أجزاء الخط في شبكة الطريق التي يزيد طولها عن X إلى n أجزاء خط أصغر باستخدام ArcGIS؟

طريقة لتقسيم أجزاء الخط في شبكة الطريق التي يزيد طولها عن X إلى n أجزاء خط أصغر باستخدام ArcGIS؟


أنا أستخدم ArcGIS Desktop 10.2 وأرغب في استخدام طرق في شبكة أكبر من طول معين وتقسيمها إلى أجزاء أصغر متساوية. لقد لاحظت أن التقسيم بنسبة مئوية يمكن تحقيقه من خلال قائمة المحرر ؛ ومع ذلك ، يبدو أن هذا يجب أن يتم على أساس سطر بسطر.

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


القليل من أتمتة Python ينجز هذه المهمة. الخطوات الأساسية:

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

المدخلات:

inFc: فئة ميزة سطر الإدخال

outFc: فئة ميزة الإخراج

حي: أقصى مسافة بالأمتار

شفرة:

# المسار الكامل إلى فئة ميزة سطر الإدخال inFc = r "C:  Users  e1b8  Desktop  E1B8  Workspace  Workspace5.gdb  testLines_split" # المسار الكامل إلى فئة ميزة سطر الإخراج outFc = r "C:  Users  e1b8  سطح المكتب  E1B8  مساحة العمل  مساحة العمل5.gdb  testLines_split2 "# المسافة (بالأمتار) dist = 15 # ----------- استيراد arcpy import os #overwrite Output (اختياري) arcpy.env.overwriteOutput = True print "تحديد معلومات الإسناد المكاني" # الحصول على كائن الإسناد المكاني sr = arcpy.Describe (inFc) .spatialReference #meters conversion meterPerUnit = sr.metersPerUnit #Distance in feature class Units checkDistance = dist / meterPerUnit print "max مسافة:"، checkDistance print " إنشاء فئة ميزة الإخراج "#Create out feature class outPath = os.path.dirname (outFc) outName = os.path.basename (outFc) arcpy.CreateFeatureclass_management (outPath، outName،" POLYLINE "، inFc، spatial_reference = sr) #set مساحة العمل arcpy.env.workspace = outPath #list مع حقول حقل الهندسة = ["SHAPE @"] # إضافة حقول فئة المعلم إلى قائمة fiel ds + = [f.name for f in arcpy.ListFields (inFc)] #Get objectid field name oidFld = arcpy.Describe (inFc) .OIDFieldName #Remove oid field from field list links. remove (oidFld) # blank list to have الصفوف الملحقة بالصفوف = [] طباعة print "iterating" ، arcpy.GetCount_management (inFc) .getOutput (0) ، "rows" i = 0 #cursor لتكرار فئة الميزة باستخدام arcpy.da.SearchCursor (inFc ، الحقول) كمؤشر : # صفوف متعلمة للصف في المؤشر: i + = 1 #get geometry object geometry = row [0] #get length length = geometry.length #check إذا كان الطول أطول من الحد إذا كان الطول> تحقق من المسافة: print "row" ، i print "طول السطر:" ، الطول # قائمة فارغة للتاريخ الوسيط المراد حذفه من القمامة = [] # إنشاء سطر فارغ لتقسيم ميزة واحدة = arcpy.CreateUniqueName ("الانقسام") outPath = os.path.dirname (Split) outName = os.path.basename (الانقسام) arcpy.CreateFeatureclass_management (outPath، outName، "POLYLINE"، inFc، spatial_reference = sr) # insert feature in new fc with arcpy.da.InsertCursor (split، field) as cu r: cur.insertRow (row) del cur #add new fc to garbage garbage + = [split] #create blank point fc for single feature = arcpy.CreateUniqueName ("point") outPath = os.path.dirname (midPnt) outName = os.path.basename (midPnt) arcpy.CreateFeatureclass_management (outPath، outName، "POINT"، spatial_reference = sr) #Get midpoint pnt = geometry.positionAlongLine (.5، True) # أدخل نقطة في فئة ميزة جديدة باستخدام Arcpy. da.InsertCursor (midPnt، "SHAPE @") كـ cur: cur.insertRow ((pnt،)) del cur #add new fc إلى القمامة المهملة + = [midPnt] #loop بينما الطول أكبر من الحد بينما الطول> checkDistance: #Split line at (mid) point newSplit = arcpy.CreateUniqueName ("split") garbage + = [newSplit] arcpy.SplitLineAtPoint_management (split، midPnt، newSplit) #Create new midpoint midPnt = arcpy.CreateUniqueName ("point") garbage + = [midPnt] outPath = os.path.dirname (midPnt) outName = os.path.basename (midPnt) arcpy.CreateFeatureclass_management (outPath، outName، "POINT"، spatial_reference = sr) #empty list for new points pnts = [] #iterate split line واحصل على نقاط المنتصف باستخدام arcpy.da.SearchCursor (newSplit، "SHAPE @") كـ cur: for geom، in cur: pnt = geom.positionAlongLine (.5 ، صحيح) pnts + = [pnt] del cur # إضافة نقاط منتصف إلى فئة معلم النقطة المتوسطة باستخدام arcpy.da.InsertCursor (midPnt، "SHAPE @") على شكل cur: لـ pnt في pnts: cur.insertRow ((pnt،)) del cur #divide length variable by two length = length / 2 print "line length:"، length split = newSplit rows + = [صف للصف في arcpy.da.SearchCursor (مقسم ، حقول)] # تنظيف البيانات الوسيطة للمهملات في القمامة: arcpy.Delete_management (trash) else: rows + = [row] #del cursor variable del cursor print print "insert rows in new feature class" # insert cursor new feature class with rows with arcpy.da.InsertCursor (outFc، field ) كمؤشر: للصف في الصفوف: cursor.insertRow (row) del cursor print print "created:"، outFc print print "done"

يبدو الإخراج شيئًا كالتالي:

تحديد معلومات الإسناد المكاني الحد الأقصى للمسافة: 65.6166666667 إنشاء فئة ميزة الإخراج تتكرر 11 صفًا طول الخط 4: 90.6641581736 طول الخط: 45.3320790868 طول الصف السادس: 81.7030489448 طول السطر: 40.8515244724 طول السطر 7: 82.7060163161 طول الخط: 41.35300: طول 81581 الصف 9 97.005780961 طول السطر: 48.5028904805 طول السطر 10: 90.6565601113 طول السطر: 45.3282800557 تم إنشاء صفوف في فئة الميزات الجديدة: C:  Users  e1b8  Desktop  E1B8  Workspace  Workspace5.gdb  testLines_split2 تم

في فئة الميزات:

فئة خارج الميزة:


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

http://resources.arcgis.com/EN/HELP/MAIN/10.2/index.html#//001700000037000000


شاهد الفيديو: طريقة اخذ مقاسات الجسم الاساسية بشكل صحيح فيديو مهم للمبتدئين