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:
Publicar un comentario