แยกสายที่ตัดกันจากเส้นที่แตะหรือไม่?


9

ฉันจะแยกความแตกต่างระหว่างกรณีเหล่านี้ใน ArcGIS 10 ได้อย่างไร

  • กรณีที่ 1 : จุดปลายทั้งสองของเส้นตรงแตะอีกเส้นหนึ่ง
  • กรณีที่ 2 : จุดปลายทั้งสองห้อยลงบนเส้นที่ตัดกัน

ฉันกำลังดูที่ฟังก์ชันTrim Lineแต่นั่นไม่ใช่สิ่งที่ฉันต้องการ (ทำลายล้าง)

กรณีการใช้งานในโลกแห่งความเป็นจริงคือการแยกแยะระหว่างถนนบริการที่เชื่อมระหว่างถนนทั้งสองของทางด่วนและกรณีอื่น ๆ ของถนนที่ตัดกับทางด่วน

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่

คำตอบ:


13

สำหรับฟีเจอร์เดียวในแต่ละครั้งคุณสามารถทำสิ่งนี้ได้อย่างง่ายดายโต้ตอบโดยใช้กล่องโต้ตอบเลือกตามตำแหน่งโดยใช้ปุ่มต่อไปนี้เป็นแนวทางสำหรับประเภทของความสัมพันธ์เชิงพื้นที่สำหรับการวางซ้อนบรรทัดบนบรรทัด (จากเลือกตามตำแหน่ง: ตัวอย่างกราฟิก ):

ภาพ
(ที่มา: arcgis.com )

เลือกบรรทัดโดยใช้บรรทัด

การเชื่อมต่อ A, C, D, E, F, G, H, I, J

มี G, H

COMPLETELY_CONTAINS G

CONTAINS_CLEMENTINI G, H

ภายใน F, H

COMPLETELY_WITHIN ฉ

WITHIN_CLEMENTINI F, H

ARE_IDENTICAL_TO H

BOUNDARY_TOUCHES C, E

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

ในการทำให้กระบวนการเป็นอัตโนมัติคุณสามารถใช้สคริปต์ Python ต่อไปนี้ (ใช้เป็นเครื่องมือสคริปต์หากต้องการ) เพื่อคำนวณจำนวนการสัมผัสและทางแยกสำหรับแต่ละคุณลักษณะในคลาสหรือเลเยอร์คุณลักษณะ:

import arcpy

################################ Configuration #################################
numTouchesField = "NUM_TOUCHES"
numIntersectionsField = "NUM_INTERSECTIONS"
################################################################################

def countTouches(layer, feature):
    """Returns the number of times the boundary of a feature touches other
    features in the same feature layer."""
    return countSpatialRelation(layer, feature, "BOUNDARY_TOUCHES")

def countIntersections(layer, feature):
    """Returns the number of times a feature intersects other features in the
    same feature layer."""
    return countSpatialRelation(layer, feature, "INTERSECT") - 1 # Subtract 1 because the feature will always intersect its clone in the feature layer

def countSpatialRelation(layer, feature, relation):
    """Returns the number of times a feature meets the specified spatial
    relationship with other features in the same feature layer."""
    arcpy.SelectLayerByLocation_management(layer, relation, feature)
    count = int(arcpy.GetCount_management(layer).getOutput(0))
    return count

def addField(table, fieldName, fieldType):
    """Adds a fields of the given name and type to a table, unless a field with
    the same name already exists."""
    desc = arcpy.Describe(table)
    fieldInfo = desc.fieldInfo
    fieldIndex = fieldInfo.findFieldByName(fieldName)
    if fieldIndex == -1:
        # Field does not exist, add it
        arcpy.AddField_management(table, fieldName, fieldType)

def countTouchesAndIntersections(layer):
    """Adds and populates fields describing the number of times each feature
    touches and intersects other features in the feature layer."""
    addField(layer, numTouchesField, "LONG")
    addField(layer, numIntersectionsField, "LONG")
    desc = arcpy.Describe(layer)
    shapeField = desc.shapeFieldName
    rows = arcpy.UpdateCursor(layer)
    for row in rows:
        feature = row.getValue(shapeField)
        row.setValue(numTouchesField, countTouches(layer, feature))
        row.setValue(numIntersectionsField, countIntersections(layer, feature))
        rows.updateRow(row)
    del row, rows

if __name__ == "__main__":
    layer = arcpy.MakeFeatureLayer_management(arcpy.GetParameterAsText(0))
    countTouchesAndIntersections(layer)

คุณสามารถค้นหาคุณสมบัติที่แตะสองครั้งและตัดกันสองครั้ง (กรณีที่ 1) และสัมผัสที่ 0 ครั้งและตัดสองครั้ง (กรณีที่ 2)

ตัวอย่างข้อความค้นหาคำจำกัดความ:

  • กรณีที่ 1 (สัมผัสสองครั้งตัดกันสองครั้ง):"NUM_TOUCHES" = 2 AND "NUM_INTERSECTIONS" = 2
  • กรณีที่ 2 (ไม่แตะเลยตัดสองครั้ง):"NUM_TOUCHES" = 0 AND "NUM_INTERSECTIONS" = 2

ดูภาพหน้าจอด้านล่างสำหรับภาพประกอบของอินสแตนซ์ของทั้งสองกรณีที่พบ: ภาพหน้าจอ ArcMap แสดงความสัมพันธ์ของจุดตัด / สัมผัสหลายบรรทัด

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

สำหรับกรณีทั่วไปมากขึ้นคุณอาจต้องการที่จะมองหา dangles ใด ๆ "NUM_INTERSECTIONS" > "NUM_TOUCHES"โดยการตรวจสอบว่า


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

อีกหนึ่งความคิดเห็น: ฉันต้องลดความยาวชื่อฟิลด์ให้เหลือน้อยกว่า 10 ตัวอักษร (อาจเป็นเพราะเลเยอร์ซอร์สคือรูปร่างไฟล์)
mvexel

ดูเหมือนว่าจะมี URL สำหรับภาพเอกสารประกอบ ArcGIS ที่ผิดเพี้ยนไปตั้งแต่ต้นคำตอบนี้
PolyGeo

@ PolyGeo อันไหน? ดูเหมือนว่าดีสำหรับฉัน
blah238

นั่นเป็นเรื่องแปลกภาพแรก (ในสิ่งที่จะเกี่ยวกับบรรทัดที่สี่) แสดงเป็นข้ามเล็ก ๆ เมื่อวานนี้ วันนี้มันดูดี ฉันคิดว่าฉันเห็นมันในเบราว์เซอร์ (ซึ่งฉันใช้อยู่ตอนนี้) มากกว่าไคลเอ็นต์ iOS ที่ฉันมักใช้
PolyGeo

2

แยกสายที่ยอด (การจัดการข้อมูล)

"สร้างคลาสคุณลักษณะที่มีบรรทัดที่สร้างขึ้นโดยแยกบรรทัดอินพุตหรือขอบเขตรูปหลายเหลี่ยมที่จุดยอด"

เก็บ Attribution

ป้อนคำอธิบายรูปภาพที่นี่

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00170000003z000000


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

-1

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


-1

คุณสามารถแยกโหนดของเครือข่ายออกได้ ในกรณีที่ 1 คุณจะได้รับ 2 โหนดแต่ละอันมีความจุ 4 ในกรณีที่ 2 ไม่มีโหนด


คุณสามารถแนะนำวิธีการทำสิ่งนี้ใน ArcGIS ได้ไหม?
blah238

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