การกำหนดรหัสจุดให้กับแอตทริบิวต์เริ่มต้นและสิ้นสุดของ polyline นั้นหรือไม่


9

ฉันมีไฟล์สองแบบคือ Point และ Polyline ฉันกำลังพยายามเติมข้อมูลชั้น polyline ของฉันด้วย ID ข้อมูลจุด (systemID) ที่บรรทัดเริ่มต้นที่พวกเขาสิ้นสุด; เช่น. สร้างสองคอลัมน์ (จากและถึง) บรรทัดมีทิศทางการไหลที่กำหนดให้กับพวกเขาแล้ว ฉันใช้เครื่องมือ ArcHydro แต่ Arcpy ก็ใช้ได้เช่นกัน

ใน ArcHydro ฉันได้ลองใช้เครื่องมือคุณสมบัติ> สร้างจาก / ถึงโหนดสำหรับบรรทัด แต่มันสร้างค่าสำหรับถึงและจากที่ไม่ได้มาจากข้อมูลจุดของฉัน ทางเลือกอื่น ๆ ของฉันคือใช้ Feature to Vertices และเข้าร่วมผลลัพธ์ในตาราง data point เพื่อรับ systemID แต่แล้วฉันก็ต้องอัพเดทชั้น polyline เช่นกัน ฉันแน่ใจว่ามีวิธีที่ง่ายกว่าในการทำเช่นนี้

หมายเหตุ: ไม่ใช่ทุกบรรทัดที่มีจุดที่จุดยอดค่าว่างนั้นใช้ได้สำหรับพวกเขา


คะแนนของคุณมีฟิลด์ 'systemID' ที่ต้องไปใน FNode, ฟิลด์ TNode ใน polylines ... ใช่ไหม?
Michael Stimson

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

นี่คือ: gis.stackexchange.com/questions/85082และมันคือจุดยอดคุณลักษณะไปยังจุดไม่ใช่เส้นหรือคุณสมบัติไปยังจุด ค่อนข้างมากสิ่งที่คุณพูดถึงในตอนท้ายของคำถาม
Chris W

@ChrisW ผมมันเหมือนคำตอบโดย FelixIP กว่าที่หนึ่ง มีเพียงสองแอตทริบิวต์ที่เข้าร่วม
Michael Stimson

คำตอบ:


12

บางครั้งมันจะดีกว่าที่จะไม่ใช้ทางออกกล่อง นี่คือเหตุผลที่ฉันแนะนำ

  1. เติมฟิลด์ X และ Y ในเลเยอร์โหนดแปลงเป็นจำนวนเต็มพูด cm สร้างเขตข้อมูลสตริงและเติมข้อมูลโดยเชื่อมโยงการตอบกลับสตริงของจำนวนเต็ม
  2. ทำสิ่งที่คล้ายกันในตารางลิงค์สำหรับจุดแรกในรูปร่าง
  3. เข้าร่วมตารางโหนดเพื่อลิงก์โดยใช้ฟิลด์ที่สร้างล่าสุดและถ่ายโอน nodeID ลงในฟิลด์ FROM

ไปที่ 2 แต่ใช้จุดสุดท้ายเพื่อกำหนดให้กับ nodeID


ชอบมัน! ฟิลด์คำนวณบางอย่างเช่นstr (round (! Shape! .firstPoint.X, 3)) + "," + str (round (! Shape! .firstPoint.Y, 3)) (Parser Python) สำหรับโหนด, str (round (! Shape! .lastPoint.X, 3)) + "," + str (รอบ (! Shape! .astast.Y, 3))สำหรับโหนดแล้วคล้ายกับจุด (เป็นข้อความ) จากนั้นเข้าร่วม ... วิธีที่ยอดเยี่ยมของการเข้าร่วมเชิงพื้นที่โดยไม่ต้องเจ็บปวดเฟลิกซ์! ปัดเศษตัวเลขที่สำคัญมากขึ้นสำหรับข้อมูลทางภูมิศาสตร์ (เช่น 7 หรือ 8)
Michael Stimson

เร็วที่สุดในสภาพแวดล้อมการเขียนสคริปต์ซึ่งแน่นอนว่าพจนานุกรมแทนที่การเข้าร่วมตารางที่ช้า
FelixIP

Int (X * 100) หากมีการคาดการณ์ไว้ใน metres นอกจากนี้ยังใช้รหัสของไมเคิล
FelixIP

เรียบง่ายกว่าวิธีอื่น ๆ ในคำถามที่ฉันเชื่อมโยงกับข้างต้น ลดจำนวนขั้นตอนเครื่องมือน้อยลงและไม่มีข้อ จำกัด ระดับสิทธิ์ใช้งาน แนวคิดที่น่าสนใจในการเปลี่ยนการเข้าร่วมเชิงพื้นที่เป็นการเข้าร่วมแอตทริบิวต์ปกติ
Chris W

1

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

  1. ฉันใช้การรวมเชิงพื้นที่เพื่อตรวจสอบว่าจุด / โหนดใดอยู่ในคุณลักษณะของเส้นที่กำหนด

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

  3. ในที่สุดเมื่อฉันทำงานจากจุดใดถึง / จากจุดที่ฉันใช้ฟังก์ชัน setValue เพื่อเติมข้อมูลไปยัง / จากเขตข้อมูลในชุดข้อมูล polyline ดั้งเดิม

เห็นได้ชัดว่ามันมีอะไรมากกว่านี้อีกเล็กน้อย แต่ฉันได้สรุปประเด็นหลักแล้ว


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

1

ฉันได้รับแรงบันดาลใจจาก @FelixIP แต่ฉันต้องการเขียนวิธีแก้ปัญหาโดยไม่ต้องเข้าร่วมหรือสร้างไฟล์พิเศษเนื่องจากเครือข่ายของฉันมีขนาดใหญ่ที่มีท่อ 400K + และโหนด 500K +

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

การอ้างอิง: ASSETID = id ของไพพ์, UNITID = โหนดไอดีที่จุดเริ่มต้นของไพพ์, UNITID2 = โหนดไอดีที่จุดสิ้นสุดของไพพ์

nodes = "mergeNodes"
pipes = "SEWER_1"

nodeDict = {}
pipeDict = {}

#populate node dictionary with X,Y as the key and node ID as the value
for node in arcpy.da.SearchCursor(nodes, ["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 as values 
#vertices populated in the order that the line was draw
#so that [0] is the first vertex and [-1] is the final vertex
for pipe in arcpy.da.SearchCursor(pipes, ["ASSETID", "SHAPE@"]):
    for arrayOb in pipe[1]:
        for point in arrayOb:
            if pipe[0] in pipeDict:
                pipeDict[pipe[0]].append((point.X, point.Y))
            else: 
                pipeDict[pipe[0]] = [(point.X, point.Y)]

#populate UNITID with the first vertex of the line
#populate UNITID2 with the final vertex of the line
with arcpy.da.UpdateCursor(pipes, ["ASSETID", "UNITID", "UNITID2"]) as cur:
    for pipe in cur:
        if pipeDict[pipe[0]][0] in nodeDict:
            pipe[1] = nodeDict[pipeDict[pipe[0]][0]]
        if pipeDict[pipe[0]][-1] in nodeDict:
            pipe[2] = nodeDict[pipeDict[pipe[0]][-1]]
        cur.updateRow(pipe)

นี่คือสิ่งที่ฉันทำ 90% แต่ฉันไม่ผ่านไปป์สองครั้งเพราะโหนดพจนานุกรมมีอยู่แล้ว
FelixIP
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.