1+ from PyQt4 .QtGui import *
2+ from qgis .core import *
3+ from qgis .gui import *
4+ from .. import pgRoutingLayer_utils as Utils
5+
16
27class FunctionBase (object ):
38
49 # the mayority of the functions have this values
510 exportButton = True
611 exportMergeButton = True
712 exportEdgeBase = False
13+ commonControls = [
14+ 'labelId' , 'lineEditId' ,
15+ 'labelSource' , 'lineEditSource' ,
16+ 'labelTarget' , 'lineEditTarget' ,
17+ 'labelCost' , 'lineEditCost' ,
18+ 'labelReverseCost' , 'lineEditReverseCost' ]
19+ commonBoxes = [
20+ 'checkBoxUseBBOX' ,
21+ 'checkBoxDirected' ,
22+ 'checkBoxHasReverseCost' ]
23+ astarControls = [
24+ 'labelX1' , 'lineEditX1' ,
25+ 'labelY1' , 'lineEditY1' ,
26+ 'labelX2' , 'lineEditX2' ,
27+ 'labelY2' , 'lineEditY2' ]
28+
829
930 @classmethod
1031 def getName (self ):
1132 return ''
1233
1334 @classmethod
1435 def getControlNames (self , version ):
15- return [ '' ]
36+ return self .commonControls + self .commonBoxes + [
37+ 'labelSourceIds' , 'lineEditSourceIds' , 'buttonSelectSourceIds' ,
38+ 'labelTargetIds' , 'lineEditTargetIds' , 'buttonSelectTargetIds' ,
39+ ]
40+
41+
1642
1743 @classmethod
1844 def isEdgeBase (self ):
@@ -30,6 +56,13 @@ def canExportMerged(self):
3056 def isSupportedVersion (self , version ):
3157 return version >= 2.0 and version < 3.0
3258
59+ @classmethod
60+ def whereClause (self , table , geometry , bbox ):
61+ if bbox == ' ' :
62+ return ' '
63+ else :
64+ return 'WHERE {0}.{1} {2}' .format (table , geometry , bbox )
65+
3366 def prepare (self , canvasItemList ):
3467 pass
3568
@@ -101,6 +134,135 @@ def getExportOneSourceOneTargetMergeQuery(self, args):
101134 """ % args
102135 return query
103136
137+
138+ def getExportManySourceManyTargetMergeQuery (self , args ):
139+ args ['result_query' ] = self .getQuery (args )
140+
141+ args ['with_geom_query' ] = """
142+ SELECT
143+ seq, result.path_name,
144+ CASE
145+ WHEN result._node = %(edge_table)s.%(source)s
146+ THEN %(edge_table)s.%(geometry)s
147+ ELSE ST_Reverse(%(edge_table)s.%(geometry)s)
148+ END AS path_geom
149+ FROM %(edge_table)s JOIN result
150+ ON %(edge_table)s.%(id)s = result._edge
151+ """ % args
152+
153+ args ['one_geom_query' ] = """
154+ SELECT path_name, ST_LineMerge(ST_Union(path_geom)) AS path_geom
155+ FROM with_geom
156+ GROUP BY path_name
157+ ORDER BY path_name
158+ """ % args
159+
160+ args ['aggregates_query' ] = """
161+ SELECT
162+ path_name, _start_vid, _end_vid,
163+ SUM(_cost) AS agg_cost,
164+ array_agg(_node ORDER BY _path_seq) AS _nodes,
165+ array_agg(_edge ORDER BY _path_seq) AS _edges
166+ FROM result
167+ GROUP BY path_name, _start_vid, _end_vid
168+ ORDER BY _start_vid, _end_vid"""
169+
170+ query = """WITH
171+ result AS ( %(result_query)s ),
172+ with_geom AS ( %(with_geom_query)s ),
173+ one_geom AS ( %(one_geom_query)s ),
174+ aggregates AS ( %(aggregates_query)s )
175+ SELECT row_number() over() as seq,
176+ path_name, _start_vid, _end_vid, agg_cost, _nodes, _edges,
177+ path_geom AS path_geom FROM aggregates JOIN one_geom
178+ USING (path_name)
179+ """ % args
180+ return query
181+
182+
183+ def drawManyPaths (self , rows , con , args , geomType , canvasItemList , mapCanvas ):
184+ resultPathsRubberBands = canvasItemList ['paths' ]
185+ rubberBand = None
186+ cur_path_id = str (- 1 ) + "," + str (- 1 )
187+ for row in rows :
188+ cur2 = con .cursor ()
189+ args ['result_path_id' ] = str (row [3 ]) + "," + str (row [4 ])
190+ args ['result_node_id' ] = row [5 ]
191+ args ['result_edge_id' ] = row [6 ]
192+ args ['result_cost' ] = row [7 ]
193+ if args ['result_path_id' ] != cur_path_id :
194+ cur_path_id = args ['result_path_id' ]
195+ if rubberBand :
196+ resultPathsRubberBands .append (rubberBand )
197+ rubberBand = None
198+
199+ rubberBand = QgsRubberBand (mapCanvas , Utils .getRubberBandType (False ))
200+ rubberBand .setColor (QColor (255 , 0 , 0 , 128 ))
201+ rubberBand .setWidth (4 )
202+
203+ if args ['result_edge_id' ] != - 1 :
204+ query2 = """
205+ SELECT ST_AsText(%(transform_s)s%(geometry)s%(transform_e)s) FROM %(edge_table)s
206+ WHERE %(source)s = %(result_node_id)d AND %(id)s = %(result_edge_id)d
207+ UNION
208+ SELECT ST_AsText(%(transform_s)sST_Reverse(%(geometry)s)%(transform_e)s) FROM %(edge_table)s
209+ WHERE %(target)s = %(result_node_id)d AND %(id)s = %(result_edge_id)d;
210+ """ % args
211+ ##Utils.logMessage(query2)
212+ cur2 .execute (query2 )
213+ row2 = cur2 .fetchone ()
214+ ##Utils.logMessage(str(row2[0]))
215+ assert row2 , "Invalid result geometry. (path_id:%(result_path_id)s, node_id:%(result_node_id)d, edge_id:%(result_edge_id)d)" % args
216+
217+ geom = QgsGeometry ().fromWkt (str (row2 [0 ]))
218+ if geom .wkbType () == QGis .WKBMultiLineString :
219+ for line in geom .asMultiPolyline ():
220+ for pt in line :
221+ rubberBand .addPoint (pt )
222+ elif geom .wkbType () == QGis .WKBLineString :
223+ for pt in geom .asPolyline ():
224+ rubberBand .addPoint (pt )
225+
226+ if rubberBand :
227+ resultPathsRubberBands .append (rubberBand )
228+ rubberBand = None
229+
230+
231+ def drawOnePath (self , rows , con , args , geomType , canvasItemList , mapCanvas ):
232+ resultPathRubberBand = canvasItemList ['path' ]
233+ for row in rows :
234+ cur2 = con .cursor ()
235+ args ['result_node_id' ] = row [1 ]
236+ args ['result_edge_id' ] = row [2 ]
237+ args ['result_cost' ] = row [3 ]
238+ if args ['result_edge_id' ] != - 1 :
239+ query2 = """
240+ SELECT ST_AsText(%(transform_s)s%(geometry)s%(transform_e)s) FROM %(edge_table)s
241+ WHERE %(source)s = %(result_node_id)d AND %(id)s = %(result_edge_id)d
242+ UNION
243+ SELECT ST_AsText(%(transform_s)sST_Reverse(%(geometry)s)%(transform_e)s) FROM %(edge_table)s
244+ WHERE %(target)s = %(result_node_id)d AND %(id)s = %(result_edge_id)d;
245+ """ % args
246+ ##Utils.logMessage(query2)
247+ cur2 .execute (query2 )
248+ row2 = cur2 .fetchone ()
249+ ##Utils.logMessage(str(row2[0]))
250+ assert row2 , "Invalid result geometry. (node_id:%(result_node_id)d, edge_id:%(result_edge_id)d)" % args
251+
252+ geom = QgsGeometry ().fromWkt (str (row2 [0 ]))
253+ if geom .wkbType () == QGis .WKBMultiLineString :
254+ for line in geom .asMultiPolyline ():
255+ for pt in line :
256+ resultPathRubberBand .addPoint (pt )
257+ elif geom .wkbType () == QGis .WKBLineString :
258+ for pt in geom .asPolyline ():
259+ resultPathRubberBand .addPoint (pt )
260+
261+
262+
263+
264+
265+
104266 def __init__ (self , ui ):
105267 self .ui = ui
106268 self .minVersion = 2.0
0 commit comments