2 votos

¿Cómo puedo insertar el resultado del algoritmo dijkstra como una característica en una tabla con PyQGIS?

Te pido ayuda con la API PyQGIS. Siendo un nuevo usuario de GIS me gustaría realizar una operación.

Se trata de buscar el camino más corto en un grafo utilizando el algoritmo DIJKSTRA.

El código del doc de QGIS tras unas pequeñas adaptaciones funciona bien salvo que no recupero nada al final si no es un plot gráfico. Después de la ejecución me gustaría recuperar el camino más corto encontrado (el resultado) como una entidad que inserto en una tabla y así sucesivamente para posiblemente otros caminos más cortos que voy a calcular.

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from qgis.gui import *
from qgis.networkanalysis import *

vl = qgis.utils.iface.mapCanvas().currentLayer()
director = QgsLineVectorLayerDirector(vl, -1, '', '', '', 3)
properter = QgsDistanceArcProperter()
director.addProperter(properter)
crs = qgis.utils.iface.mapCanvas().mapRenderer().destinationCrs()
builder = QgsGraphBuilder(crs)

pStart = QgsPoint(-0.835953, 0.15679)
pStop = QgsPoint(-1.1027, 0.699986)
tiedPoints = director.makeGraph(builder, [pStart, pStop])
graph = builder.graph()
tStart = tiedPoints[0]
tStop = tiedPoints[1]
idStart = graph.findVertex(tStart)
idStop = graph.findVertex(tStop)
(tree, cost) = QgsGraphAnalyzer.dijkstra(graph, idStart, 0)

if tree[idStop] == -1:
  print "Path not found"
else:
  p = []
  curPos = idStop
  while curPos != idStart:
    p.append(graph.vertex(graph.arc(tree[curPos]).inVertex()).point())
    curPos = graph.arc(tree[curPos]).outVertex();
  p.append(tStart)
  rb = QgsRubberBand(qgis.utils.iface.mapCanvas())
  rb.setColor(Qt.red)
  for pnt in p:
    rb.addPoint(pnt)

¿Alguien puede ayudar?

1voto

DBM Puntos 51

Esto se aplica para QGIS 2.18: Primero puede crear una capa (de memoria) (si aún no tiene una) y un proveedor de datos y añadirlo al registro y a la lista de capas utilizando el siguiente código:

my_lyr = QgsVectorLayer('Linestring?crs=epsg:31468', 'network result', 'memory')
# 31468 is only an example, set the epsg code you require
my_lyr_dp = my_lyr.dataProvider()

root = QgsProject.instance().layerTreeRoot()
network_analysis_group = root.addGroup('Network results')

QgsMapLayerRegistry.instance().addMapLayer(my_lyr, False)
network_analysis_group.addLayer(my_lyr)

Necesita el proveedor de datos para añadir nuevas características, así que si ya tiene una capa a la que desea añadir características, puede, por ejemplo, seleccionarla en la leyenda y crear un proveedor de datos mediante

selected_lyr = iface.activeLayer()
my_lyr_dp = selected_lyr.dataProvider() #cp. above

A continuación, desde el p en el código anterior (una lista formada por QgsPoint() entidades) puede crear una característica en su capa como

f = QgsFeature()
geom = QgsGeometry().fromPolyline(p) #this is your p
f.setGeometry(geom)
my_lyr_dp.addFeatures([f])
my_lyr.updateExtents()
iface.mapCanvas().refreshAllLayers()

Si desea "borrar" la capa (eliminar todos los resultados de análisis de red anteriores), puede hacerlo de la siguiente manera

fids = [f.id() for f in my_lyr.getFeatures()]
my_lyr_dp.deleteFeatures(fids)
my_lyr.updateExtents()
iface.mapCanvas().refreshAllLayers()

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X