Advertisement
Guest User

Qgis Processing networkanalysis

a guest
Aug 1st, 2015
380
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.03 KB | None | 0 0
  1. #Definition of inputs and outputs
  2. #==================================
  3. ##GeoHealth=group
  4. ##points=vector
  5. ##network=vector
  6. ##speed_field=field network
  7. ##speed_default=number 70
  8. ##perpendicular_roads=output vector
  9. ##centroid_cell=output vector
  10. ##centroid_buffer=output vector
  11.  
  12. from PyQt4.QtCore import *
  13. from PyQt4.QtGui import *
  14.  
  15. from qgis.core import *
  16. from qgis.gui import *
  17. from qgis.networkanalysis import *
  18. import qgis.utils
  19.  
  20. from processing import runalg, runandload
  21. try :
  22.     from processing.tools.vector import VectorWriter
  23. except ImportError:
  24.     from processing.core.VectorWriter import VectorWriter #Old API Versions
  25.  
  26. class ghAccessibility:
  27.     def __init__(self, points, network, perpendicular_roads, centroid_cell, centroid_buffer):
  28.         #Get objects
  29.         #===============
  30.         self.pointLayer = processing.getObject(points)
  31.         self.pFeatures = processing.features(self.pointLayer)
  32.         self.networkLayer = processing.getObject(network)
  33.         self.perpendicular_roads = perpendicular_roads
  34.         self.centroid_cell = centroid_cell
  35.         self.centroidBuffer = centroid_buffer
  36.        
  37.         self.director = QgsLineVectorLayerDirector(self.networkLayer,-1,'','','',3)
  38.         properter = QgsDistanceArcProperter()
  39.         self.director.addProperter(properter)
  40.         crs = self.networkLayer.crs()
  41.         self.graphBuilder = QgsGraphBuilder(crs)
  42.         self.graph = None
  43.  
  44.         self.checkLayerGeometry()
  45.         gridCentroid = self.gridCentroid( )
  46.         tiedPoints = self.makeGraph(gridCentroid)
  47.         self.computeRouting(gridCentroid, tiedPoints)
  48.         #self.bufferCentroidIntersection(gridCentroid)
  49.         return
  50.  
  51.     """ check if layers geometry is valid
  52.        :return error in case of invalid geometry
  53.    """
  54.     def checkLayerGeometry(self):
  55.         progress.setText(u'Step 1 :Check geometry')
  56.         pointLayerGeometryType = self.pointLayer.geometryType()
  57.         if pointLayerGeometryType == QGis.Line or pointLayerGeometryType == QGis.Polygon :
  58.             err = "error : Invalid geometry type for point layer (must be point)"
  59.             print err
  60.             raise Exception(err)
  61.  
  62.         networkLayerGeometryType = self.networkLayer.geometryType()
  63.         if networkLayerGeometryType == QGis.Point or networkLayerGeometryType == QGis.Polygon :
  64.             err =  "error : Invalid geometry type for network layer (must be line)"
  65.             print err
  66.             raise Exception(err)
  67.  
  68.     """ compute the bouding box of the point layer. Then creates a grid and for each cell compute the centroid.
  69.        :return temporary points layer
  70.    """
  71.     def gridCentroid(self):
  72.         progress.setText(u'Step 2 :Create Grid & Grid Centroid')
  73.         progress.setPercentage(0)
  74.         pBoxBuffer = self.pointLayer.extent().buffer(10)
  75.         xmin, xmax, ymin, ymax = pBoxBuffer.xMinimum(), pBoxBuffer.xMaximum(), pBoxBuffer.yMinimum(), pBoxBuffer.yMaximum()
  76.         gridExtent = "{xMin},{xMax},{yMin},{yMax}".format(xMin=xmin, xMax=xmax, yMin=ymin, yMax=ymax)
  77.         vectorgrid = runalg('qgis:vectorgrid', gridExtent , 20000, 20000, 0, None)
  78.         progress.setPercentage(50)
  79.         gridCentroid = runalg('saga:polygoncentroids', vectorgrid['OUTPUT'], False, None)
  80.         if gridCentroid is None :
  81.             err =  "error : Saga must be installed"
  82.             raise Exception(err)
  83.         else:
  84.             runandload('saga:polygoncentroids', vectorgrid['OUTPUT'], False, self.centroid_cell)
  85.             progress.setPercentage(100)
  86.             return gridCentroid['CENTROIDS']
  87.            
  88.     def makeGraph(self, gridCentroid) :
  89.         progress.setText(u'Step 3 : Compute routing graph')
  90.        
  91.         routingPoints = []
  92.         gridCentroidFeats = processing.features(processing.getObject(gridCentroid))
  93.        
  94.         for feat in gridCentroidFeats:
  95.             routingPoints.append(feat.geometry().asPoint())
  96.         progress.setPercentage(30)
  97.        
  98.         for feat in processing.features(self.pointLayer):
  99.             routingPoints.append(feat.geometry().asPoint())
  100.         progress.setPercentage(70)
  101.        
  102.         tiedPoints = self.director.makeGraph(self.graphBuilder, routingPoints)
  103.         self.graph = self.graphBuilder.graph()  
  104.        
  105.         progress.setPercentage(100)
  106.        
  107.         return tiedPoints
  108.  
  109.     """ compute for each grid point a buffer that expands until it intersects a health point. It is us to select the nearest points.
  110.        :return health feature
  111.    """    
  112.     def bufferCentroidIntersection(self, gridCentroidFeatGeom, centroidBufferWriter):      
  113.         defaultBuffer = 100.0
  114.         centroidIntersect = False
  115.         pFeatIntersect = []
  116.         #until there is a valid intersection with the point layers and  the points of the grid
  117.         while centroidIntersect == False :
  118.             bb = gridCentroidFeatGeom.buffer(defaultBuffer,5).boundingBox()
  119.             request = QgsFeatureRequest().setFilterRect(bb)
  120.             intersectedPointFeatures = self.pointLayer.getFeatures(request)
  121.                            
  122.             #if an intersection is found the routing is computed
  123.             firstFeat = True
  124.             for intersectedFeat in intersectedPointFeatures:  
  125.                 pFeatIntersect.append(intersectedFeat)
  126.                 centroidIntersect = True
  127.                 if firstFeat is True:
  128.                     fet = QgsFeature()
  129.                     fet.setGeometry(QgsGeometry.fromPolygon(gridCentroidFeatGeom.buffer(defaultBuffer,5).asPolygon()))
  130.                     centroidBufferWriter.addFeature(fet)    
  131.                     firstFeat = False                
  132.             #in case of no intersection the size of the radius is increased
  133.             defaultBuffer+= defaultBuffer    
  134.         return  pFeatIntersect
  135.        
  136.     def computeRouting(self, gridCentroid, tiedPoints):
  137.         progress.setText(u'Step 4 : Compute routing for each feature')
  138.         progress.setPercentage(0)
  139.        
  140.         centroidBufferWriter = VectorWriter(self.centroidBuffer, None, [QgsField("id", QVariant.Int)], QGis.WKBPolygon, self.networkLayer.crs() )
  141.         trajectoryWriter = VectorWriter(self.perpendicular_roads, None,  [QgsField("id", QVariant.Int)], QGis.WKBLineString, self.networkLayer.crs() )
  142.        
  143.         gridCentroidFeats = processing.features(processing.getObject(gridCentroid))
  144.         nFeat = len(gridCentroidFeats)
  145.        
  146.         i = 0      
  147.         for gridCentroidFeat in gridCentroidFeats:
  148.             progress.setPercentage(int(100 * i / nFeat))
  149.             i+=1
  150.             gridCentroidFeatGeom = gridCentroidFeat.geometry()
  151.             intersectedPointFeatures = self.bufferCentroidIntersection(gridCentroidFeatGeom, centroidBufferWriter)
  152.            
  153.             for feat in intersectedPointFeatures :
  154.                 from_point = gridCentroidFeat.geometry().asPoint()
  155.                 from_id = self.graph.findVertex(from_point)
  156.                 to_id     = self.graph.findVertex(feat.geometry().asPoint())
  157.                
  158.                 if from_id != -1:
  159.                     (tree, cost) = QgsGraphAnalyzer.dijkstra(self.graph, from_id, 0)
  160.                     if tree[to_id] == -1:
  161.                         print "Path not found"
  162.                     else:
  163.                         # collect all the vertices between the points
  164.                         route_points = []
  165.                         curPos = to_id
  166.                         while curPos != from_id:
  167.                             route_points.append(
  168.                                 self.graph.vertex(self.graph.arc(tree[curPos]).inVertex()).point()
  169.                             )
  170.                             curPos = self.graph.arc(tree[curPos]).outVertex()
  171.                         route_points.append(from_point)
  172.                         trajectoryWriter.addFeature(route_points)
  173.                 else:
  174.                     #Do something ?
  175.                     pass
  176.        
  177.         del centroidBufferWriter
  178.         del trajectoryWriter
  179.         return
  180.  
  181. ghAccessibility(points, network, perpendicular_roads, centroid_cell, centroid_buffer)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement