Kiểm tra "tính kết nối" của shapefile trong ArcMap?


9

Tôi đã thừa hưởng một shapefile dòng trong ArcMap được sử dụng để đại diện cho một mạng lưới đường bộ. Vấn đề là mạng lưới đường bộ khá lớn và tôi không thể:

  1. Cho biết điểm cuối của mỗi đường (đoạn đường) có được "kết nối" với cạnh, đỉnh hoặc điểm cuối của đường khác (đoạn đường); và
  2. Cho biết nếu toàn bộ mạng lưới đường được "kết nối" - tức là tôi có thể theo dõi tuyến đường từ bất kỳ điểm nào trên mạng lưới đường đến bất kỳ điểm nào khác trên mạng lưới đường không?

Có cách nào để thực hiện điều này trong ArcMap không? Đó là, có một chức năng nào cho phép tôi làm nổi bật các phân đoạn dòng không kết nối với các phân đoạn dòng khác hoặc một cái gì đó tương tự sẽ cho phép tôi trả lời hai câu hỏi trên không?

Câu trả lời:


14

Có, nhưng loại. ArcGis không còn có cấu trúc liên kết nút dòng cho phép người dùng cho biết có bao nhiêu cung (đường) được kết nối ở đầu (nút) của họ.

Để kiểm tra là một chuyện, nhưng làm thế nào để sửa chữa thay thế? Nếu bạn mở lớp tính năng trong ArcMap và sau đó sử dụng các dòng phẳng (cung cấp dung sai) và các dòng sẽ được ngắt và phân tách tại giao lộ - tiết kiệm rất nhiều công việc. Nếu bạn không muốn phân chia các dòng thì hãy xem xét công cụ Tích hợp nhưng hãy cẩn thận sử dụng dung sai rất nhỏ, nó sẽ chụp các đầu lại với nhau nhưng có thể làm cho các dòng cũng khớp với nhau. Trước khi sử dụng Integrate, hãy giữ một bản sao lưu vì nó có thể phá hủy dữ liệu của bạn!

Bây giờ, để tìm các đầu bị ngắt kết nối, hãy sử dụng tính năng Vertice to Points để lấy điểm cuối và sau đó Thu thập các sự kiện sẽ cung cấp cho bạn một lớp tính năng với số lượng điểm kết thúc hiện tại, ở giai đoạn này, bất kỳ sự kiện nào của 1 đều bị nghi ngờ, do đó bạn cần tách riêng những cái này

Để biết liệu nó có nên được kết nối hay không là nhiệm vụ tiếp theo, hãy sử dụng Tạo bảng gần (một lần nữa với dung sai phù hợp) và tùy chọn gần nhất = TẤT CẢ bằng cách sử dụng các sự kiện có số lượng 1 so với các dòng ban đầu, sau đó sử dụng Tóm tắt thống kê bạn có thể tìm thấy đối với mỗi điểm, số lượng bản ghi sử dụng IN_FID làm trường hợp trường hợp và NEAR_FID làm trường thống kê với loại thống kê là "COUNT".

Để thực hiện trích xuất dễ dàng hơn từ bảng gần, các bản ghi có khoảng cách lớn hơn 0 bằng Bảng chọn . Mỗi sự kiện sẽ tìm thấy dòng tạo ra nó nhưng khoảng cách sẽ là 0, nếu nó được gắn đúng vào một dòng khác (ở một đỉnh) thì khoảng cách cũng sẽ là 0, vì vậy bây giờ bất kỳ sự kiện nào có bản ghi còn lại trong bảng gần là có thể rời rạc nhưng những thứ này sẽ cần phải được xem bằng tay.


Cảm ơn. Tôi sẽ kiểm tra các chức năng này khi tôi đi làm vào ngày mai và báo cáo lại.
derNincompoop

3
"Tính năng Vertice to Point" có một tùy chọn để xuất Điểm dang. Tôi nghĩ rằng điều này sẽ đơn giản hóa quy trình làm việc của bạn.
klewis

Wow @klewis, khi nào thì nó xuất hiện? Nó chắc chắn không có ở 9.3. Cũng phát hiện ra!
Michael Promotionson

4

Một cách tiếp cận khác là sử dụng cấu trúc liên kết MAP. Tôi đã gõ một chút mã VBA này để xác định các cạnh lơ lửng. Nếu bạn thấy các cạnh lơ lửng trong mạng chứ không phải là các đầu cuối dự kiến của mạng thì phải có ngắt kết nối.

Ví dụ về việc chọn các cạnh lơ lửng

Mã dựa vào việc bạn đã cài đặt VBA, đang ở chế độ chỉnh sửa và đã thêm lớp đa tuyến vào cấu trúc liên kết bản đồ.

Public Sub SelectDanglingPolylines()
 ' Description: Takes a polyline dataset and select all dangling polylines.
 '
 ' Requirements: You need to be in edit mode and have added the layer to a MAP TOPOLOGY,
 ' also polyline layer must be first in TOC.
 '
 ' Limitations: Large datasets take a long time to build the cache and may even fail.
 '
 ' Author: Duncan Hornby
 ' Created: 11/12/2011
 '

 ' Get map and then first layer, must be of polyline type
 Dim pMXDocument As IMxDocument
 Set pMXDocument = ThisDocument
 Dim pMap As IMap
 Set pMap = pMXDocument.FocusMap
 Dim pLayer As ILayer
 Set pLayer = pMap.Layer(0)
 Dim pFeatureLayer As IFeatureLayer
 Set pFeatureLayer = pLayer
 Dim pFeatureClass As IFeatureClass
 Set pFeatureClass = pFeatureLayer.FeatureClass
 If pFeatureClass.ShapeType <> esriGeometryPolyline Then
     MsgBox "This code works only with polylines!", vbExclamation, "Wrong data type at layer 0"
     Exit Sub
 End If

 ' Get editor and topology extension
 Dim pEditor As IEditor
 Dim pID As New UID
 Dim pTopologyExtension As ITopologyExtension
 Dim pTEID As New UID
 pID = "esriEditor.editor"
 Set pEditor = Application.FindExtensionByCLSID(pID)
 pTEID = "esriEditorExt.TopologyExtension"
 Set pTopologyExtension = Application.FindExtensionByCLSID(pTEID)
 If pTopologyExtension.CurrentTopology Is Nothing Then Exit Sub

 ' Get a MAP topology not a geodatabase topology
 Dim pMapTopology As IMapTopology
 If TypeOf pTopologyExtension.CurrentTopology Is IMapTopology Then
     Set pMapTopology = pTopologyExtension.MapTopology
 Else
     ' Not a Map Topology
     Exit Sub
 End If

 ' This is the colection that FID are added to
 Dim aColl As New Collection

 ' Build cache
 Application.StatusBar.Message(0) = "Building MAP TOPOLOGY cache, this can take a long time on large datasets..."
 DoEvents
 Dim pGeoDataset As IGeoDataset
 Set pGeoDataset = pFeatureClass
 Dim pEnvelope As IEnvelope
 Set pEnvelope = pGeoDataset.Extent
 pMapTopology.Cache.Build pEnvelope, False

 ' Identify dangling nodes and add polyline FID to collection
 Application.StatusBar.Message(0) = "Identifying dangling nodes..."
 DoEvents
 Dim pEnumTopologyParent As IEnumTopologyParent
 Dim pTopologyNode As ITopologyNode
 Dim pEnumTopologyNode As IEnumTopologyNode
 Set pEnumTopologyNode = pMapTopology.Cache.Nodes
 pEnumTopologyNode.Reset
 Set pTopologyNode = pEnumTopologyNode.Next
 While Not pTopologyNode Is Nothing
 If pTopologyNode.Degree = 1 Then
     ' As this has 1 degree it has only 1 parent polyline
     Set pEnumTopologyParent = pTopologyNode.Parents
     pEnumTopologyParent.Reset
     aColl.Add (pEnumTopologyParent.Next.m_FID) 'Adds polyline FID to collection
 End If
 Set pTopologyNode = pEnumTopologyNode.Next
 Wend

 ' Use collection to select polylines
 Application.StatusBar.Message(0) = "Selecting polylines..."
 DoEvents
 Dim pFeatureSelection As IFeatureSelection
 Set pFeatureSelection = pFeatureLayer
 Dim X As Variant
 For Each X In aColl
     pFeatureSelection.SelectionSet.Add CLng(X)
 Next
 pMXDocument.ActiveView.PartialRefresh esriViewGeoSelection, Nothing, pEnvelope
 Application.StatusBar.Message(0) = ""
 DoEvents
End Sub

Tôi thích mã đó, nếu bạn không phiền tôi sẽ sao chép một vài bit trong số đó; Lợi ích của việc thực hiện theo cách này là nó tồn tại và khi các lỗi được khắc phục, chúng sẽ biến mất, phần xấu là nếu một dòng bị treo lủng lẳng thì nó được hiển thị - cho dù một đầu được kết nối hay đường dây bị ngắt hoàn toàn. Tôi có thể đề nghị bạn thay đổi mã để hiển thị nút "hóa trị" (có bao nhiêu dòng được kết nối) hoặc chỉ các nút dangle (đó là máy trạm của tôi xuất hiện trở lại!) ... sẽ tuyệt vời ... nhưng chỉ khi OP có khả năng VBA / VB.net.
Michael Promotionson

1
Người ta có thể điều chỉnh mã và nhận các cạnh có giá trị 1 ở cả hai đầu để tìm một dòng hoàn toàn bị ngắt kết nối, hoặc các biến thể như đầu 1 tại 1 và 2 ở đầu kia, tùy thuộc vào mạng tôi đoán?
Hornbydd

2

Đây là một bài viết cũ, nhưng tôi nghĩ giải pháp đơn giản nhất là:

  1. Hòa tan tính năng đa tuyến của bạn
  2. Sử dụng tùy chọn tính năng điểm đến điểm với tùy chọn dang
  3. Tham gia theo vị trí không gian , tính năng đa tuyến ban đầu đến lớp điểm kết quả. Sử dụng tùy chọn "Giao nhau bởi nó".

Kết quả sẽ có trường "Đếm" cho mỗi dòng trong lớp của bạn. nếu Đếm lớn hơn 1, dòng không được "kết nối" với phần còn lại của dòng.

Về mặt khái niệm: Bước 2 ở đây tạo các điểm tại các đỉnh với một cạnh được kết nối duy nhất (một dòng "đi vào", không "đi ra"). Vì mỗi dòng trong mạng "được kết nối" sẽ có nhiều nhất 1 đỉnh như vậy, bất kỳ dòng nào có nhiều hơn 1 không phải là một phần của mạng và do đó không được "kết nối".


Phương pháp này tạo ra nhiều dương tính giả. Nói một con đường dẫn đến một ngã ba T. Phần trên cùng của T sẽ có hai đỉnh lơ lửng. Nếu bạn lấy các tính năng với số lượng hai và sau đó giao cắt chúng một lần nữa với mạng lưới đường bộ, thì các tính năng không chạm vào là các đảo.
woot

Trên thực tế, giao lộ thứ hai tôi đã viết ở trên chỉ tìm thấy những con đường bị cô lập. Nó sẽ không tìm ra nếu mạng có nhiều phần
woot

1

Đây là một phương pháp tôi đã nghĩ ra, với sự giúp đỡ của một số người bạn, sử dụng Model Builder và Gephi. Bước 1 ArcModel tạo bảng liên kết / cạnh (thêm các nút ở mỗi dòng trùng nhau nếu muốn) Bước 2 Gephi nhập liên kết / cạnh sau đó thêm ID thành phần Bước 3 ArcModel thêm ID thành phần trở lại dòng ban đầu

Bước 1 Bước 1 Thực hiện tất cả các tính năng đầu vào phân tách chúng tại các giao lộ để đảm bảo có một nút mạng và tạo một bảng được nhập vào Gephi. Dưới đây là các bước: Quy trình: Tính năng cho dòng (có thể mất nhiều đầu vào) Quy trình: Đa nhân thành một phần Quy trình: Sửa chữa Quá trình hình học: Thêm hợp đồng bắt đầu kết thúc (Thêm thuộc tính hình học) Quá trình: Thêm trường "Nguồn" Quá trình: Thêm trường "Mục tiêu" Quy trình: Tính toán "Nguồn" (dưới dạng startX & startY) Quá trình: Tính toán "Mục tiêu" (khi kết thúc X & endY) Quy trình: Xóa các trường (xóa các trường bổ sung để tránh nhầm lẫn) Quá trình: Bảng GDB sang CSV

Step2Gephi_Sc mãi Bước 2 Quá trình Gephi (tải xuống miễn phí) -xuất nhập đầu ra CSV với các trường nút được đặt tên Nguồn và đích dưới dạng Liên kết -Run Các thành phần được tính là không bị chặn (trong các công cụ thống kê) -Xuất nhập CSV từ Phòng thí nghiệm dữ liệu cho các nút (bao gồm ID nút và ID thành phần)

Bước 3: Đưa đầu ra Gephi và thêm thuộc tính thành phần / mạng vào các dòng ban đầu Quá trình: Table to Table (nhập đầu ra Gephi vào Geodatabase để cấu trúc các objectID duy nhất) Quá trình: Tham gia trường (Giá trị nút nguồn được nối với đầu ra Gephi để nhập số thành phần vào dòng) Tượng trưng theo thành phần

Dọn dẹp sau thời điểm này có thể sẽ là một quá trình kiểm tra thủ công trong đó việc ngắt kết nối xảy ra dọc theo đường dây và nếu ngắt kết nối là một sự tách biệt trong thế giới thực hợp lệ hoặc chỉ là một lỗ hổng dữ liệu.

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.