Phân biệt các dòng giao nhau với các dòng chạm?


9

Làm cách nào để phân biệt giữa các trường hợp này trong ArcGIS 10?

  • Trường hợp 1 : Cả hai điểm cuối của một dòng chạm vào một dòng khác
  • Trường hợp 2 : Cả hai điểm cuối treo lủng lẳng trên các đường nó giao nhau

Tôi đang xem chức năng Trim Line nhưng đó không phải là điều tôi muốn (phá hoại).

Trường hợp sử dụng trong thế giới thực là để phân biệt giữa các đường dịch vụ kết nối cả hai đường của đường cao tốc và các trường hợp khác của đường giao nhau với đường cao tốc.

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Câu trả lời:


13

Đối với một tính năng tại một thời điểm, bạn có thể thực hiện điều này khá dễ dàng bằng cách sử dụng hộp thoại Chọn theo vị trí thông thường , sử dụng phím sau làm hướng dẫn cho các loại mối quan hệ không gian cho lớp phủ trên dòng (từ Chọn theo Vị trí: ví dụ đồ họa ):

hình ảnh
(nguồn: arcgis.com )

Chọn dòng sử dụng dòng

TƯƠNG TÁC A, C, D, E, F, G, H, I, J

CONTAIN G, H

COMPLETELY_CONTAIN G

CONTAIN_CLEMENTINI G, H

TRONG VÒNG F, H

COMPLETELY_WITHIN F

VỚIIN_CLMENTINI F, H

IS_IDENTICS_TO H

BOUNDARY_TOUCHES C, E

Các loại mối quan hệ có liên quan trong trường hợp này là INTERSECTBOUNDARY_TOUCHES. Như bạn có thể thấy từ sơ đồ trên, bạn có thể sử dụng BOUNDARY_TOUCHESđể chọn các tính năng chạm vào điểm cuối của dòng. Nếu chính xác hai tính năng được chọn thì bạn có Case 1. Nếu một tính năng không bị bất kỳ tính năng nào khác chạm vào mà chỉ giao nhau với chúng, thì BOUNDARY_TOUCHESsẽ không chọn gì. INTERSECTsẽ chọn tất cả các tính năng giao nhau bất kể chúng có chạm vào điểm cuối hay không. Vì vậy, nếu bạn biết không có tính năng nào chạm vào điểm cuối, nhưng bạn thấy có những tính năng giao nhau, thì bạn có Trường hợp 2 của bạn.

Để tự động hóa quy trình, bạn có thể sử dụng tập lệnh Python sau (triển khai như một công cụ tập lệnh nếu muốn) để tính toán số lần chạm và giao điểm cho từng tính năng trong một lớp hoặc lớp tính năng:

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)

Khi đã chạy, bạn có thể dễ dàng truy vấn các tính năng chạm chính xác hai lần và giao nhau chính xác hai lần (Trường hợp 1) và các tính năng chạm 0 lần và giao nhau chính xác hai lần (Trường hợp 2).

Các truy vấn định nghĩa ví dụ:

  • Trường hợp 1 (Chạm hai lần, giao nhau hai lần):"NUM_TOUCHES" = 2 AND "NUM_INTERSECTIONS" = 2
  • Trường hợp 2 (Không chạm vào, giao nhau hai lần):"NUM_TOUCHES" = 0 AND "NUM_INTERSECTIONS" = 2

Xem ảnh chụp màn hình bên dưới để biết minh họa về các trường hợp của hai trường hợp được tìm thấy: Ảnh chụp màn hình ArcMap hiển thị các mối quan hệ giao nhau / chạm khác nhau

Lưu ý rằng với dữ liệu trong thế giới thực, thông thường các đoạn đường bị phá vỡ tại các giao lộ và các nguy hiểm chỉ xảy ra khi các đường đi qua nhau như tại một nút giao hoặc cầu. Vì vậy, thông thường bạn có cùng số lượng các tính năng giao nhau như chạm.

Đối với trường hợp tổng quát hơn, bạn có thể muốn tìm kiếm bất kỳ nguy hiểm nào bằng cách kiểm tra xem "NUM_INTERSECTIONS" > "NUM_TOUCHES".


Cảm ơn câu trả lời công phu. Tôi gặp một chút khó khăn khi biến nó thành một công cụ script (nó bị đóng băng khi tôi cố gắng chọn một lớp) nhưng tôi tự tin rằng cách tiếp cận này là hợp lệ.
mvexel

Thêm một nhận xét: Tôi đã phải giảm độ dài tên trường xuống dưới 10 ký tự (có lẽ vì nguồn lớp là một shapefile).
mvexel

Dường như có một URL đến hình ảnh tài liệu ArcGIS đã đi lạc hướng khi bắt đầu câu trả lời này.
PolyGeo

@PolyGeo cái nào? Có vẻ tốt với tôi.
blah238

Thật kỳ lạ, bức ảnh đầu tiên (trên dòng thứ tư) sẽ được hiển thị dưới dạng một chữ thập nhỏ ngày hôm qua. Hôm nay có vẻ ổn. Tôi nghĩ rằng tôi đã thấy nó trong trình duyệt (hiện tôi đang sử dụng) chứ không phải ứng dụng khách iOS mà tôi thường sử dụng.
PolyGeo

2

Chia dòng tại Vertices (Quản lý dữ liệu)

"Tạo một lớp đối tượng chứa các dòng được tạo bằng cách chia các dòng đầu vào hoặc ranh giới đa giác ở các đỉnh của chúng"

Hãy ghi công.

nhập mô tả hình ảnh ở đây

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


Tôi không chắc điều đó sẽ giúp tôi như thế nào, nhưng tôi nhận ra rằng tôi có thể đã làm rõ những gì tôi cần để đạt được một chút tốt hơn. Chỉnh sửa câu hỏi.
mvexel

-1

Làm thế nào về việc sao chép lớp tính năng, cắt xén các dòng, sau đó so sánh tính năng cắt xén được đặt thành bản gốc để tìm các tính năng đã thay đổi? Không đẹp, gần như chắc chắn yêu cầu sử dụng Python, nhưng có vẻ như nó nên hoạt động.


-1

Bạn cũng có thể trích xuất các nút của mạng. Trong trường hợp 1, bạn sẽ nhận được 2 nút, mỗi nút có hóa trị là 4. Trong trường hợp 2 không có nút nào.


Bạn có thể đề nghị làm thế nào để làm điều này trong ArcGIS?
blah238

Bạn có thể sử dụng tập lệnh hoặc công cụ của ai đó để thêm id duy nhất vào đa tuyến là từ và đến các nút. Tôi biết archydro làm điều đó nhưng tôi chắc chắn có các tập lệnh trên trang web arcscripts làm điều đó. Sau đó, theo cách không lập trình, bạn có thể chạy công cụ tần số trên trường từ và sau đó đến trường nút và tổng hợp chúng, điều này mang lại cho bạn giá trị nút mà bạn có thể nối lại với một lớp điểm đại diện cho các nút.
Hornbydd
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.