merge_edges.py

python script file - Theresa Lichtenberger, 2018-10-29 03:06 PM

Download (5 KB)

 
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