miércoles, 2 de enero de 2019

Añadiendo nuevo campo con rumbos (bearings), en grados, minutos y segundos, mediante PyQGIS 3

En el post anterior se trató un tema similar pero con la versión anterior de QGIS. No obstante, el código allí presentado no funciona en QGIS 3 a menos que realicemos algunas pocas modificaciones que incluimos en el script a continuación:

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import math

layer = iface.activeLayer()

myField = QgsField( 'Bearing', QVariant.String)

layer.dataProvider().addAttributes([myField])
layer.updateFields()

fields = layer.fields()

idx = fields.indexFromName('Bearing')

layer.startEditing()

for feat in layer.getFeatures():
    pt1 = feat.geometry().asMultiPolyline()[0][0]
    pt2 = feat.geometry().asMultiPolyline()[0][1]
    az = pt1.azimuth(pt2)
    if az < 0:
        az += 360
    minutes = az%1.0*60
    seconds = minutes%1.0*60
    string = str(int(math.floor(az))) + "\xb0 " + str(int(math.floor(minutes))) + "' " + str(seconds) + "''"

    feat[idx] = string
    layer.updateFeature( feat )

layer.commitChanges()

Después de ejecutado el script anterior, en la imagen siguiente, se puede observar el nuevo campo creado, 'Bearing', que contiene la información esperada.


Para efectos de comparación, los mismos valores se determinan mediante una expresión empleando el Field Calculator, tomada de aquí, y que se incluye a continuación:

concat(floor(degrees(azimuth(start_point($geometry), end_point($geometry)))), '° ', 
floor(degrees(azimuth(start_point($geometry), end_point($geometry)))*60 % 60), ''' ',
degrees(azimuth(start_point($geometry), end_point($geometry)))*3600 % 60, '''')

Los valores coinciden de acuerdo al nivel de precisión empleado en cada caso.

No hay comentarios: