Buscar este blog

viernes, 17 de octubre de 2008

Crear una ruta. NetworkAnalist

Con esta funcion conseguiremos crear dado una serie de puntos que cargamos,una ruta.

Dim indice As Integer
Dim nomb As String
Dim arrLineas As New Hashtable
Dim pLayer As ESRI.ArcGIS.Carto.ILayer
Dim sNombreLayer As String
Dim listaLayersAEliminar As New ArrayList
Dim arrPuntosDatagr As Windows.Forms.DataGridViewRowCollection = datagrid.Rows

Try
Dim networkDataset As ESRI.ArcGIS.Geodatabase.INetworkDataset = Me.OBTENERNetworkAnalist() ' coger la network de la bd y cargarla en arcMap
Dim imxDoc As ESRI.ArcGIS.ArcMapUI.IMxDocument
imxDoc = m_Application.Document
Dim pNetworkLayer As ESRI.ArcGIS.Carto.INetworkLayer
pNetworkLayer = New ESRI.ArcGIS.Carto.NetworkLayer
pNetworkLayer.NetworkDataset = networkDataset
imxDoc.AddLayer(pNetworkLayer)

Dim numRutas As Integer
numRutas = Get_PuntosRutas.Count
Dim It As IDictionaryEnumerator
It = Get_PuntosRutas.GetEnumerator()
indice = 1
Dim arrPuntos As ArrayList
While It.MoveNext
Dim arrPoint As ArrayList
If It.Key <> m2_sector Then
arrPoint = It.Value
Else

arrPuntos = New ArrayList


Dim j As Integer
For j = 0 To arrPuntosDatagr.Count - 1
Dim fila As Windows.Forms.DataGridViewRow
fila = arrPuntosDatagr(j)
arrPuntos.Add(fila)
Next

End If
If m_sector = "" Then
nomb = It.Key
Else
nomb = It.Key
End If

Dim naLayer As ESRI.ArcGIS.NetworkAnalyst.INALayer = CreateRouteAnalysisLayer(m_sector, networkDataset)
Dim naContext As ESRI.ArcGIS.NetworkAnalyst.INAContext = naLayer.Context
Dim stopsNAClass As ESRI.ArcGIS.NetworkAnalyst.INAClass = naContext.NAClasses.ItemByName("Stops")
Dim routesFC As ESRI.ArcGIS.Geodatabase.IFeatureClass = naContext.NAClasses.ItemByName("Routes")


Dim pFcGis As ESRI.ArcGIS.Geodatabase.IFeatureClass
pFcGis = Me.GetControlConexion.ObtenerFeatureClass(General.Configuracion.getConfigurador.tablaGISplanific)
Dim naLoader As ESRI.ArcGIS.NetworkAnalyst.INAClassLoader = New ESRI.ArcGIS.NetworkAnalyst.NAClassLoaderClass()
naLoader.Locator = naContext.Locator
naLoader.NAClass = stopsNAClass


Dim rowsInCursor As Integer = 0
Dim rowsLocated As Integer = 0
Dim pInputCursor As ESRI.ArcGIS.Geodatabase.ICursor
Dim pQuery As ESRI.ArcGIS.Geodatabase.IQueryFilter


Dim i As Integer
i = 0
im codCliente As String
Dim fila2 As Windows.Forms.DataGridViewRow
Dim pFeat As IFeature
Dim pfcClass As IFeatureClass
Dim pQuery2 As IQueryFilter
Dim pCursor2 As ICursor
While i <= arrPuntos.Count - 1
fila2 = arrPuntos(i)
If Not fila2.Cells("ObjectID").Value Is Nothing Then

pfcClass = ObtenerFeatureClass(featureclass)
pQuery2 = New QueryFilter
codCliente = fila2.Cells("Código Cliente").Value
pQuery2.WhereClause = General.Configuracion.getConfigurador.cli_cod & " = " & codCliente & " AND " & General.Configuracion.getConfigurador.rta_cod & "='" & fila2.Cells("Ruta").Value & "' AND " & General.Configuracion.getConfigurador.cli6_dia & "=" & fila2.Cells("Dia").Value
'hay que meter punto a punto.
pInputCursor = pfcClass.Search(pQuery2, False)
naLoader.Load(pInputCursor, New ESRI.ArcGIS.Carto.TrackCancel, rowsInCursor, rowsLocated)
End If
Me.liberaRecurso(pQuery2)
Me.liberaRecurso(pfcClass)
i = i + 1
End While

'Solve
Dim pGPMessages As ESRI.ArcGIS.Geodatabase.IGPMessages
pGPMessages = New ESRI.ArcGIS.Geodatabase.GPMessages
Dim naSolver As ESRI.ArcGIS.NetworkAnalyst.INASolver = naContext.Solver
naSolver.Solve(naContext, pGPMessages, Nothing)
Dim result As ESRI.ArcGIS.NetworkAnalyst.INAResult = CType(naContext.Result, ESRI.ArcGIS.NetworkAnalyst.INAResult)
Dim fcr As ESRI.ArcGIS.Geodatabase.IFeatureClass
fcr = result.NAContext.NAClasses.Item(1)
Dim pfeatt As ESRI.ArcGIS.Geodatabase.IFeature
Dim pCursor As ESRI.ArcGIS.Geodatabase.IFeatureCursor
pCursor = fcr.Search(Nothing, False)
pfeatt = pCursor.NextFeature
arrLineas.Add(It.Key, pfeatt)
imxDoc.AddLayer(naLayer)
indice = indice + 1
End While
Return arrLineas
Catch ex As Exception

Throw ex
End Try
End Function

No hay comentarios: