merge_edges.py
1 |
# name : MergeEdges_script
|
---|---|
2 |
# author: Theresa Lichtenberger
|
3 |
# date : 22.10.2018
|
4 |
# description: merges edges with the same edgeid
|
5 |
# and adds two attributes for speed limits on each lane
|
6 |
|
7 |
from qgis.core import * |
8 |
from PyQt4.QtCore import * |
9 |
from math import degrees |
10 |
|
11 |
#***********Constants*************#
|
12 |
EDGEID = 'edgeid'
|
13 |
FROM = 'from'
|
14 |
TO = 'to'
|
15 |
PRIORITY = 'priority'
|
16 |
LENGTH = 'length'
|
17 |
TIME = 'time'
|
18 |
|
19 |
NODEID = 'nodeID'
|
20 |
COORD_X = 'x'
|
21 |
COORD_Y = 'y'
|
22 |
|
23 |
ID = 'id'
|
24 |
VTO = 'vto'
|
25 |
VFROM = 'vfrom'
|
26 |
NODE1 = 'node1'
|
27 |
NODE2 = 'node2'
|
28 |
#*******************************#
|
29 |
|
30 |
# input parameters
|
31 |
##Edges=vector
|
32 |
##Nodes=vector
|
33 |
|
34 |
inLayerEdges = processing.getObject(Edges) |
35 |
inNodes = processing.getObject(Nodes) |
36 |
|
37 |
crs = inLayerEdges.crs().toWkt() |
38 |
|
39 |
# get field indices for inputlayer
|
40 |
idxEdgeId = inLayerEdges.fieldNameIndex(ID) |
41 |
idxPriority = inLayerEdges.fieldNameIndex(PRIORITY) |
42 |
idxLength = inLayerEdges.fieldNameIndex(LENGTH) |
43 |
idxTime = inLayerEdges.fieldNameIndex(TIME) |
44 |
idxFrom = inLayerEdges.fieldNameIndex(FROM) |
45 |
idxTo = inLayerEdges.fieldNameIndex(TO) |
46 |
|
47 |
idx_id = inNodes.fieldNameIndex(NODEID) |
48 |
idx_x = inNodes.fieldNameIndex(COORD_X) |
49 |
idx_y = inNodes.fieldNameIndex(COORD_Y) |
50 |
|
51 |
# Create output layer and specify geometry type
|
52 |
outLayer = QgsVectorLayer('Linestring?crs=' + crs, 'merged_edges', 'memory') |
53 |
# Set the provider to accept the data source
|
54 |
outdp = outLayer.dataProvider() |
55 |
|
56 |
# define attributes and add them to the vector layer
|
57 |
outdp.addAttributes([QgsField(EDGEID, QVariant.String), |
58 |
QgsField(NODE1, QVariant.String), |
59 |
QgsField(NODE2, QVariant.String), |
60 |
QgsField(PRIORITY, QVariant.Int), |
61 |
QgsField(VTO, QVariant.Double), |
62 |
QgsField(VFROM, QVariant.Double)]) |
63 |
outLayer.updateFields() |
64 |
|
65 |
# get field indices for outputlayer
|
66 |
outEdgeId = outdp.fieldNameIndex(EDGEID) |
67 |
outNode1 = outdp.fieldNameIndex(NODE1) |
68 |
outNode2 = outdp.fieldNameIndex(NODE2) |
69 |
outPriority = outdp.fieldNameIndex(PRIORITY) |
70 |
outVTo = outdp.fieldNameIndex(VTO) |
71 |
outVFrom = outdp.fieldNameIndex(VFROM) |
72 |
|
73 |
listOfEdgeIds = [] |
74 |
count = 0
|
75 |
flag = 0
|
76 |
|
77 |
# loop through edges of inLayerEdges and merge
|
78 |
for feat in inLayerEdges.getFeatures(): |
79 |
|
80 |
# create new edge (line) for outputLayer
|
81 |
newEdge = QgsFeature(outLayer.pendingFields()) |
82 |
|
83 |
currentPriority = feat.attributes()[idxPriority] |
84 |
currentEdgeId = feat.attributes()[idxEdgeId] |
85 |
|
86 |
if currentEdgeId.find('From') == -1: |
87 |
edgeIdTrimmed = currentEdgeId.replace('To', '') |
88 |
else:
|
89 |
edgeIdTrimmed = currentEdgeId.replace('From', '') |
90 |
|
91 |
if edgeIdTrimmed in listOfEdgeIds: |
92 |
# if current edge id already processed -> skip it.
|
93 |
#print "current edgeid already in list. Continue ..."
|
94 |
continue
|
95 |
|
96 |
else:
|
97 |
# if not, find all entries in the graph which share the same current edge id
|
98 |
# and merge them
|
99 |
listOfEdgeIds.append(edgeIdTrimmed) |
100 |
|
101 |
newEdge.setAttribute(EDGEID, edgeIdTrimmed) |
102 |
newEdge.setAttribute(PRIORITY, currentPriority) |
103 |
|
104 |
node1 = feat.attributes()[idxFrom] |
105 |
node2 = feat.attributes()[idxTo] |
106 |
newEdge.setAttribute(NODE1, node1) |
107 |
newEdge.setAttribute(NODE2, node2) |
108 |
|
109 |
# search for specific from_node by nodeID
|
110 |
exp = QgsExpression('nodeID ILIKE \'' + node1 +'\' ') |
111 |
request = QgsFeatureRequest(exp) |
112 |
request.setLimit(1)
|
113 |
|
114 |
for feat2 in inNodes.getFeatures(request): |
115 |
geomFrom = feat2.geometry() |
116 |
print geomFrom
|
117 |
|
118 |
# search for specific to_node by nodeID
|
119 |
exp = QgsExpression('nodeID ILIKE \'' + node2 +'\' ') |
120 |
request = QgsFeatureRequest(exp) |
121 |
request.setLimit(1)
|
122 |
|
123 |
for feat2 in inNodes.getFeatures(request): |
124 |
geomTo = feat2.geometry() |
125 |
print geomTo
|
126 |
|
127 |
# find all entries in the graph with current edge id
|
128 |
exp = QgsExpression('id ILIKE \'' + edgeIdTrimmed + '%\' ') |
129 |
request = QgsFeatureRequest(exp) |
130 |
|
131 |
# loop through all egdes with the same current edgeids
|
132 |
for feat1 in inLayerEdges.getFeatures(request): |
133 |
|
134 |
tempEdgeId = feat1.attributes()[idxEdgeId] |
135 |
|
136 |
length = feat1.attributes()[idxLength] |
137 |
time = feat1.attributes()[idxTime] |
138 |
velocity = (length / time) * 3.6
|
139 |
|
140 |
if tempEdgeId.find("From") is not -1: |
141 |
#print("Python found the string From!")
|
142 |
newEdge.setAttribute(VFROM, velocity) |
143 |
elif tempEdgeId.find("To") is not -1: |
144 |
#print("Python found the string To!")
|
145 |
newEdge.setAttribute(VTO, velocity) |
146 |
else:
|
147 |
print("Python did NOT find the substring!")
|
148 |
|
149 |
|
150 |
print "heyho" |
151 |
newEdge.setGeometry(QgsGeometry.fromPolyline([geomFrom.asPoint(),geomTo.asPoint()])) |
152 |
# add the feature to the layer
|
153 |
(res, outFeats) = outdp.addFeatures([newEdge]) |
154 |
|
155 |
|
156 |
# Add the layer to the Layers panel
|
157 |
QgsMapLayerRegistry.instance().addMapLayer(outLayer) |
158 |
print "Done ... " |
159 |
|
160 |
|
161 |
|
162 |
|
163 |
|