Помогите создать матрицу (adjacency matrix)

0 голосов
спросил 22 Дек, 10 от Vitas127 (1,480 баллов) в категории Программные продукты Esri
Помогите создать матрицу смежности (adjacency matrix). В сети около 20 000 узловю
Смотреть
Connectivity Matrix (C) здесь http://faculty.washington.edu/krumme/systems/networkmatrix.html.

Вроде это решение http://arcscripts.esri.com/details.asp?dbid=15477б но как это работает так и не понял. Вба запускаю вписываю скрипт - ничего.


Помогите с решением.
Спасибо

18 Ответы

0 голосов
ответил 25 Дек, 10 от Vitas127 (1,480 баллов)
Вам эта матрица в каком вообще виде нужна? Текстовый файл?
Что с этим всем богатством делать собираетесь?


Лучше всего что-бы данные были в таблице, но можно и в тексте с запятыми или табами (потом переведу в таблицу).
0 голосов
ответил 25 Дек, 10 от TDenis (42,620 баллов)
В какой таблице-то?
В качестве названий узлов вам нужны их OID или EID?
0 голосов
ответил 25 Дек, 10 от Vitas127 (1,480 баллов)
<!--[if gte mso 9]><> Normal 0 false false false RU X-NONE X-NONE MicrosoftInternetExplorer4 </><![endif]--><!--[if gte mso 9]><> <w:LsdException Locked="false" Priority="64" Semi="false"
0 голосов
ответил 25 Дек, 10 от TDenis (42,620 баллов)
Нечто вот такое сгодится, я правильно понял?

image

image
0 голосов
ответил 25 Дек, 10 от TDenis (42,620 баллов)
Не силён в network analyst, подскажите, там граф всегда простой или могут быть кратные рёбра и петли (которые матрица смежности, понятно, должна отображать)?
0 голосов
ответил 25 Дек, 10 от Vitas127 (1,480 баллов)
Не силён в network analyst, подскажите, там граф всегда простой или могут быть кратные рёбра и петли (которые матрица смежности, понятно, должна отображать)?


Конечно это самое. Спасибо. Если граф сложный я его перевожу в простой. Это зависит от детальности отображения сети (дорожной). Узлами в моем случае служат - перекрестки и населенные пункты и.т.д.
Результат в АркМапе блестящий, далее все в Эксцеле буду делать.
Как мне сие чудо получить?
Спасибо большое.
0 голосов
ответил 25 Дек, 10 от TDenis (42,620 баллов)
Своей сети у меня нет, я взял какую-то сеть из туториала по десктопу, из 5го занятия.
За основу взял скрипт по приведённой Вами ссылке на форум esri:
http://forums.esri.com/thread.asp?c=93&f=1944&t=186348

Прогонял на маленьком фрагменте.
Начните тоже с маленького участка. Его и проверять легче, и результат получите быстрее.

Первый слой на карте должен быть сетью - это важно. Смотрите, как на картинке выше.

Если найдёте баги - пишите.



Public Sub List_Adjacent_Junctions()
On Error GoTo eh

' Выходной файл
OutputFile = "C:\my.txt"

' Разделитель
Separator = " "

' Показывать ли заголовки строк
ShowRowHeaders = True

' Показывать ли заголовки столбцов
ShowColumnHeaders = True

' Показывать ли саму матрицу (или можно оставить только сумму)
ShowMatrix = True

' Показывать ли сумму
ShowSum = True

' Показывать ли OID вместе с EID
ShowOID = False

'
RowColumnHeader = "\"

' Заголовок колонки суммы
SumColumnHeader = "T"

' ----------------------------------------------


Dim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument

Dim pNLayer As INetworkLayer
Set pNLayer = pMxDoc.FocusMap.Layer(0)

Dim pND As INetworkDataset
Set pND = pNLayer.NetworkDataset

Dim pNQ As INetworkQuery
Set pNQ = pND
    
Dim pEnumNE As IEnumNetworkElement
Set pEnumNE = pNQ.Elements(esriNETJunction)

NodeCount = pNQ.ElementCount(esriNETJunction)

'Dim arr() As Integer
'ReDim arr(NodeCount) As Integer

    
Dim pNEdge As INetworkEdge
Set pNEdge = pNQ.CreateNetworkElement(esriNETEdge)
Dim pNEFromJunc As INetworkJunction
Set pNEFromJunc = pNQ.CreateNetworkElement(esriNETJunction)
Dim pNEToJunc As INetworkJunction
Set pNEToJunc = pNQ.CreateNetworkElement(esriNETJunction)

Dim pNE As INetworkElement
pEnumNE.Reset
Set pNE = pEnumNE.Next

Dim pNEJunc As INetworkJunction
Set pNEJunc = pNE
'here start the code to store the output on a text file

Open OutputFile For Output As #1

Dim outputRow As String

If (ShowColumnHeaders = True) Then
    If (ShowRowHeaders = True) Then
        outputRow = RowColumnHeader
    Else
        outputRow = ""
    End If
    
    If (ShowMatrix = True) Then
        IsFirst = True
        Do Until pNE Is Nothing
            If (IsFirst = True And ShowRowHeaders = False) Then
               outputRow = pNEJunc.EID
            Else
               outputRow = outputRow & Separator & pNEJunc.EID
            End If
            If (ShowOID = True) Then
               outputRow = outputRow & "(" & pNEJunc.OID & ")"
            End If
            IsFirst = False
            Set pNE = pEnumNE.Next
        Loop
    End If
    If (ShowSum = True) Then
        If (outputRow <> "") Then
            outputRow = outputRow & Separator
        End If
        outputRow = outputRow & SumColumnHeader
    End If
    Print #1, outputRow
End If



pEnumNE.Reset
Set pNE = pEnumNE.Next

Dim i As Long

Do Until pNE Is Nothing
      Dim arr() As Integer
      ReDim arr(NodeCount) As Integer
      Sum = 0
      
      For i = 0 To pNEJunc.EdgeCount - 1 'For each connected edge...
          pNEJunc.QueryEdge i, True, pNEdge   'Get that connected edge
          pNEdge.QueryJunctions pNEFromJunc, pNEToJunc 'Get To junction of current edge
          
          arr(pNEToJunc.EID) = arr(pNEToJunc.EID) + 1
          Sum = Sum + 1
          'Print #1, pNEFromJunc.EID & ", "; pNEToJunc.EID & ","; pNEdge.AttributeValueByName("Meters") 'List the adjacency and the edge's length
      Next
      
      If (ShowRowHeaders = True) Then
        outputRow = pNEJunc.EID
        If (ShowOID = True) Then
            outputRow = outputRow & "(" & pNEJunc.OID & ")"
        End If
      Else
        outputRow = ""
      End If
      
      If (ShowMatrix = True) Then
        For i = 1 To NodeCount
            Value = arr(i)
            If (i = 1 And ShowRowHeaders = False) Then
               outputRow = Value
            Else
               outputRow = outputRow & Separator & Value
            End If
        Next
      End If
      If (ShowSum = True) Then
          If (outputRow <> "") Then
            outputRow = outputRow & Separator
          End If
         &nbs
0 голосов
ответил 25 Дек, 10 от TDenis (42,620 баллов)
Кстати, не уверен, что тут самый эффективный способ работы со строками. Думаю, работу программы можно будет прилично ускорить хотя бы за счёт этого.
Если потребуется, конечно.

Но в целом матрицу смежности построить можно, как это сделать - показано. Экспериментируйте)
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...