martes, 1 de enero de 2019

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

En este post se va desarrollar un script que permite crear y actualizar en tiempo de ejecución el campo de un vectorial tipo línea que contendrá el rumbo (grados, minutos y segundos) de los segmentos de recta que constituyen sus rasgos (features). El script es el siguiente:

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
from PyQt4.QtCore import QVariant
import math

layer = iface.activeLayer()

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

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

idx = layer.fieldNameIndex('Bearing')

layer.startEditing()

for feat in layer.getFeatures():
    pt1 = feat.geometry().asPolyline()[0] 
    pt2 = feat.geometry().asPolyline()[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 a continuación, 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: