# импортируем библиотеку сетевого анализа
from qgis.networkanalysis import *

# импортируем библиотеку gui
from qgis.gui import *

# Создаем директора. Директор поределяет из чего (и как) строить граф. В будующем будет добавлено еще несколько директоров.
director = QgsLineVectorLayerDirector( qgis.utils.iface.mapCanvas().currentLayer(), -1, '', '', '', 3 )

# Создаем стратегию назначения свойств ребрам графа. Стратегия вычисляет свойство ребра, запрашивая у директора данные. 
# В данном случае это длина, в плагине Road Graph я сделал стратегию, которая вычисляет время движения по ребру.
properter = QgsDistanceArcProperter( );

# Сообщаем о стратегии директору, можно использовать любое количество стратегий.
director.addProperter( properter )

# Создаем строителя. Он определяет граф какого типа будем строить. Сейчас доступен только встроенный QgsGraph. 
# Вы можите создать собственного строителя для таких библиотек как Boost Graph library и networkX. 
builder = QgsGraphBuilder( qgis.utils.iface.mapCanvas().mapRenderer().destinationCrs() )

# Введем координаты точки.
point = QgsPoint(66.6757,57.1742)

# Директор отдает комманды строителю. Строитель создает граф. Кроме того "привязывается" точка point к графу
# в возвращаемом значении координаты точки соответствующей point.
tiedPoint = director.makeGraph( builder, [point] )

# Получаем граф пригодный для анализа
graph = builder.graph()

# получаем индекс точки на графе
id = graph.findVertex( tiedPoint[0] )

# Получаем дерево кратчайших путей с корнем в точне point
tree = QgsGraphAnalyzer.shortestTree( graph, id, 0 )
id = tree.findVertex( tiedPoint[0] )

# рисуем дерево кратчайших путей (осторожно, код жутко не оптимален). Что с ним делать - решайте сами
#i = 0
#while i<tree.vertexCount():
#  for j in tree.vertex(i).outArc():
#    rb = QgsRubberBand( qgis.utils.iface.mapCanvas() )
#    rb.addPoint( tree.vertex(tree.arc(j).inVertex()).point() )
#    rb.addPoint( tree.vertex(tree.arc(j).outVertex()).point() )
#  
#  i = i + 1
#

not_begin = [id]
rb = QgsRubberBand( qgis.utils.iface.mapCanvas() )
rb.setWidth( 3 )

while len(not_begin)>0:
  curId = not_begin[0]
  not_begin = not_begin[1:]
  rb.addPoint( tree.vertex(curId).point() )
  f = 1
  for i in tree.vertex(curId).outArc():
    if f==1:
      not_begin = [ tree.arc(i).inVertex() ] + not_begin
      f=0
    else:
      not_begin = not_begin + [ tree.arc(i).inVertex() ]
  
  
  if len( tree.vertex(curId).outArc() )==0 :
    rb = QgsRubberBand( qgis.utils.iface.mapCanvas() )
    rb.setWidth( 3 )
    if (len(not_begin)>0) and (len(tree.vertex(not_begin[0]).inArc())>0): 
      rb.addPoint( tree.vertex( tree.arc( tree.vertex(not_begin[0]).inArc()[0] ).outVertex() ).point() )



