มากกว่า

ระยะห่างระหว่างจุดต่างๆ ตามโพลิไลน์ ArcGIS for Desktop?

ระยะห่างระหว่างจุดต่างๆ ตามโพลิไลน์ ArcGIS for Desktop?


ฉันใช้ ArcGIS 10.3 (เดสก์ท็อป) และฉันกำลังพยายามวัดระยะห่างระหว่างจุดต่างๆ ตามเส้นทางที่กำหนดโดยชุดของโพลิไลน์ การวัดด้วยมือไม่ใช่ตัวเลือกที่ใช้การได้ มี ~7500 คะแนน และชุดเส้นโพลีไลน์ของฉันคือแนวชายฝั่งทั่วโลก เป้าหมายสูงสุดคือการได้ระยะห่างของจุดเหล่านี้ตามเส้นหลายเส้น เพื่อที่ผมจะได้วิเคราะห์สิ่งนี้เทียบกับตัวแปรอื่นๆ สองสามตัว

ฉันสามารถอ่าน python ได้ โดยใช้ความพยายามเล็กน้อย แต่ไม่เขียนหรือแก้ไข ดังนั้นโซลูชันที่ใช้โค้ดจะไม่เป็นประโยชน์กับฉันโดยเฉพาะ

ฉันได้ลองใช้เครื่องมืออ้างอิงเชิงเส้นแล้ว -- ฉันจัดจุดเป็นเส้น จากนั้นเปลี่ยนเส้นหลายเส้นเป็นเส้นทาง และใช้ 'ระบุตำแหน่งคุณลักษณะ' -- แต่เนื่องจากคะแนนของฉันไม่ได้เรียงตามเส้นทาง (ทั้งหมด) โดยใช้ความแตกต่างระหว่าง ตำแหน่งอ้างอิงเชิงเส้นของจุดที่ตามมาให้คำตอบที่ไม่น่าจะเป็นไปได้ นอกจากนี้ การตรวจสอบเฉพาะจุด (วัดด้วยมือโดยใช้เครื่องมือวัดความยาวเส้นทางในตัว) ระยะทางตามแนวเส้นตรงแบบจุดต่อจุดจะให้คำตอบที่แตกต่างจากที่ให้ไว้โดยการอ้างอิงเชิงเส้นที่สอดคล้องกันสำหรับคู่จุด (คำตอบบางข้ออยู่ใกล้พอที่จะเป็นข้อผิดพลาดในการวัดในส่วนของฉันได้ แต่คำตอบอื่นๆ เกือบ 20% แม้ว่าฉันจะซูมเข้าและเลื่อนเคอร์เซอร์การวัดไปที่เส้นหลายเหลี่ยมแล้วก็ตาม ต่อจากจุดสุดยอดไปยังจุดยอด)

การเรียงลำดับก่อนตามระยะทางเชิงเส้นดูเหมือนจะแก้ไขปัญหาแรกได้ แต่สำหรับปัญหาที่สอง ฉันยังคงสงสัยในกระบวนการนี้

จากนั้นฉันก็ลองแยกเส้นหลายเส้นออกเป็นส่วนๆ ('เส้นแยกที่จุด') โดยใช้จุด (ที่หักแล้ว) เป็นตัวแบ่ง โดยมีเป้าหมายในการค้นหาความยาวของส่วนโดยใช้คุณลักษณะการคำนวณทางเรขาคณิต สิ่งนี้ทำให้เกิดการพูดพล่อยๆ ฉันไม่แน่ใจว่าเกณฑ์ใดที่ ArcGIS ใช้ในการแยกบรรทัด แต่ไม่ใช่ชุดจุดที่ฉันได้ให้ไว้ ส่วนต่างๆ ในไฟล์รูปร่างที่ได้นั้นวิ่งผ่านจุดหลายสิบจุด เพื่อสิ้นสุดที่จุดที่ไม่มีจุด (นอกจากนี้ยังมีส่วนที่ว่างเปล่าอย่างสมบูรณ์ของคะแนน… คุณได้รับส่วนสำคัญแล้ว) ฉันขอย้ำว่าชุดพอยต์นั้นถูกจัดชิดกับโพลิไลน์โดยเฉพาะ ดังนั้นปัญหานี้ไม่ควรเกิดจากระยะห่างที่มากเกินไประหว่างจุดกับเส้นตรง

ฉันค่อนข้างจะสูญเสียที่นี่: มีใครสามารถชี้ให้เห็นว่าฉันหลงทางที่ไหนและ / หรือแนะนำวิธีแก้ปัญหา? หรือล้มเหลววิธีใหม่ที่ฉันจะลอง? ดูเหมือนว่าเป็นการวิเคราะห์ที่ค่อนข้างพื้นฐาน (ไม่จำเป็นต้องง่าย แต่เป็นพื้นฐาน) เกี่ยวกับข้อมูลทางภูมิศาสตร์ และฉันไม่เข้าใจว่าทำไมมันถึงได้นำเสนอปัญหามากมาย


การอ้างอิงเชิงเส้นควรใช้งานได้ แต่อาจมีขนาดใหญ่ นี่คือเหตุผลที่ฉันใช้สคริปต์นี้:

# นำเข้าโมดูล arcpy นำเข้า arcpy, os, traceback, sys, เวลาจากการนำเข้า arcpy env.overwriteOutput = True infc = arcpy.GetParameterAsText(0) routeid = arcpy.GetParameterAsText(1) outfc=arcpy.GetParameterAsText(2) ฟิลด์ = [ f สำหรับ f ใน arcpy.ListFields(infc)] fieldNames = [f.name สำหรับ f ใน arcpy.ListFields(infc)] # กำหนดจำนวนบรรทัด result=arcpy.GetCount_management(infc) nF=int(result.getOutput(0) ) d=arcpy.Describe(outfc) SR_p=d.spatialReference d=arcpy.Describe(infc) SR=d.spatialReference ถ้า SR_p.name<>SR.name: arcpy.AddError("
การประมาณการที่แตกต่างกัน เลิก
" ) ยก SystemExit('Quit… ') ## จุดเริ่มต้นเลเยอร์การล้างข้อมูล fieldP = [f สำหรับ f ใน arcpy.ListFields(outfc)] fieldNamesP = [f.name สำหรับ f ใน arcpy.ListFields(outfc)] dToLine,dAlong ="D_TO_LINE","D_ALONG" สำหรับ ent ใน [routeid,dToLine,dAlong]: ถ้า ent ใน fieldNamesP: arcpy.DeleteField_management(outfc, ent) outFolder, theFile="in_memory","intLines" env.workspace = outFolder ลอง: def showPyMessage(): arcpy.AddMessage(str(time.ctime()) ) + " - " + ข้อความ) def CalcChainage(): pC,lineID,dToLine,Chainage=theRow shp=dictFeatures[lineID] theRow[2]=pC.distanceTo(shp) theRow[3]=shp.measureOnLine(pC) กลับด้วย arcpy.da.SearchCursor(infc, ("[email protected]",routeid)) เป็นแถว: dictFeatures = {} for feat,theID in rows: dictFeatures[theID]=(feat) del rows arcpy.SpatialJoin_analysis(outfc, infc , "theJoin", "JOIN_ONE_TO_ONE", "KEEP_ALL", "", "CLOSEST","",dToLine) arcpy.AddField_management("theJoin", dAlong, "DOUBLE") ## คำนวณ chainage result=arcpy.GetCount_management(" theJoin") nF=int(result.getOutput(0)) arcpy.AddMessage("
Computing chainage… ") arcpy.SetProgressor("step", "", 0, nF,1) with arcpy.da.UpdateCursor(" theJoin", ("[email protected]",routeid,dToLine,dAlong)) เป็นแถว: สำหรับแถวในแถว: CalcChainage() rows.updateRow(theRow) arcpy.SetProgressorPosition() del rows ##defining the type of route id field n =fieldNames.index(routeid) fType=fields[n].type fLength=fields[n].length ลอง: if fType=="String": arcpy.AddField_management(outfc, ro uteid, "TEXT","","",fLength) if fType=="Integer": arcpy.AddField_management(outfc, routeid, "LONG") if fType=="SmallInteger": arcpy.AddField_management(outfc, routeid, "SHORT") ยกเว้น: ลองผ่าน: arcpy.AddField_management(outfc, dToLine, "DOUBLE") arcpy.AddField_management(outfc, dAlong, "DOUBLE") ยกเว้น: pass arcpy.AddMessage("โอน calcs ไปยังจุด… 
") vFT=arcpy.da.TableToNumPyArray("theJoin",(routeid,dToLine,dAlong)) arcpy.SetProgressor("step", "", 0, nF,1) ด้วย arcpy.da.UpdateCursor(outfc,(routeid,dToLine ,dAlong )) เป็นแถว: n=0 สำหรับแถวในแถว: theRow=vFT[n] rows.updateRow(theRow) arcpy.SetProgressorPosition() n+=1 del vFT แถวยกเว้น NameError ข้อความ: arcpy.AddMessage (theMessage) ยกเว้น: message = "
*** PYTHON ERRORS *** "; showPyMessage() message = "ข้อมูล Python Traceback: " + traceback.format_tb(sys.exc_info()[2])[0]; showPyMessage() message = "ข้อมูลข้อผิดพลาดของ Python: " + str(sys.exc_type)+ ": " + str(sys.exc_value) + "
"; showPyMessage()

สคริปต์คาดหวังพารามิเตอร์เหล่านี้:

เพื่อรับสิ่งนี้:

บางทีคุณอาจต้องการรวม (ละลาย) polylines ของคุณเป็นบรรทัดเดียว ตรวจสอบให้แน่ใจว่าจะไม่สร้างรูปร่างที่มีหลายส่วน กล่าวคือ ต้องหักส่วนปลาย สคริปต์ทดสอบกับไฟล์รูปร่าง


ความเป็นไปได้อย่างหนึ่งคือการใช้เวลาสร้าง m รับรู้เรขาคณิต สำหรับคุณลักษณะเส้นของคุณ ค้นหาการอ้างอิงเชิงเส้น เป็นจำนวนงานที่พอเหมาะ... ปกติฉันจะใช้ตัวเลือกนี้เมื่อระยะทางตามเส้นคำถามจะถูกถามซ้ำเป็นประจำ การพิจารณามักขึ้นอยู่กับความซับซ้อนของเครือข่ายและรูปแบบและเนื้อหาของคำถามที่ฉันได้รับ เห็นได้ชัดว่าข้อมูลและคำถามบางอย่างอยู่ในหมวดหมู่การอ้างอิงเชิงเส้นเมื่อคุณคุ้นเคยกับแนวคิดนี้บ้าง ฉันเดาว่าทั้งการกำหนดเส้นทางของเหตุการณ์ในบรรทัด หรือการตีความระยะทางเอาต์พุตตามตารางเส้นกำลังทำให้คุณสะดุด

สมมุติว่าจุด A ไปตามถนน Smith 5 กิโลเมตรจากจุดเริ่มต้นที่ทางหลวง และจุด B ขึ้นไปตามถนน Smith 5 กิโลเมตร ถึงสี่แยกกับถนน 3 ที่คุณเลี้ยวซ้ายไปตามถนน 3 อีก 10 กิโลเมตรแล้วเลี้ยวซ้ายอีกครั้งเข้าสู่ถนน Bob และขับต่อไปอีก 3 กิโลเมตรเพื่อไปยังจุด B. มีคำถามว่า “ไกลแค่ไหนจากจุด a ไป B?”… หรือมากกว่าเหมือนคำแนะนำในการขับรถจาก Google โดยตั้งชื่อถนนแต่ละสาย? นอกจากนี้ ด้วยตารางที่จะส่งออกจากตัวอย่างนี้ คุณจะมีระยะเริ่มต้นและสิ้นสุดจำนวนมากไม่ใช่ความยาว คณิตศาสตร์ที่ค่อนข้างง่าย… แต่ตอนนี้ทิศทางของเส้นเข้ามาเล่น… อย่างไรก็ตาม… มันใช้ได้ดี… แต่ต้องใช้เวลาพอสมควรในการตั้งค่าอย่างถูกต้อง


ดูวิดีโอ: ArcGIS - Intersect - Extract intersection points of lines