¿Cómo agregar Dirección y Distancia a la tabla de atributos?

17

cualquiera que pueda ayudar. solo quiero agregar dirección (rumbo: es decir, N 25 35 E) y distancia (longitud: 125 metros) como mi nuevo campo en polilínea / datos de línea. ¿Hay un plug-in para generar estos campos? Intenté usar "exportar / agregar columnas de geometría" en mis datos de línea, pero solo se agregó el valor de "Longitud".

    
pregunta arzandia 27.04.2012 - 09:22

3 respuestas

39

Puede calcular la demora en la Calculadora de campo en QGIS. Esto funciona en coordenadas UTM (métricas) en distancias pequeñas (cientos de km), pero se necesitaría algo más sofisticado para distancias grandes o para grados decimales.

Abra la tabla de atributos para su capa de línea, cambie la edición y haga clic en el botón de la Calculadora de campo para abrir el diálogo:

Creaunnuevocampocomodecimalcon1o2deprecisión.

Pegueestecódigoenelcuadro"Expresión" y haga clic en "Aceptar": (atan((xat(-1)-xat(0))/(yat(-1)-yat(0)))) * 180/3.14159 + (180 *(((yat(-1)-yat(0)) < 0) + (((xat(-1)-xat(0)) < 0 AND (yat(-1) - yat(0)) >0)*2)))

La primera parte calcula la tangente inversa de las diferencias x e y la convierte en grados (180 / pi). La segunda parte agrega 180 o 360 a la figura resultante para dar un rumbo de 0-360 °.

    
respondido por el Simbamangu 29.04.2012 - 12:26
20

No necesitas un plugin. Todo está en la clase QgsPoint de PyQGIS

Si examinas el contenido de una clase de puntos QGIS con la función incorporada de Python dir () en la Consola de Python.

dir(point])
['__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__'
, '__getitem__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__module__', 
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', 
'__str__', '__subclasshook__', '__weakref__', 'azimuth', 
'multiply', 'set', 'setX', 'setY', 'sqrDist', 'sqrDistToSegment', 'toDegreesMinutesSeconds', 'toString', 'wellKnownText', 'x', 'y']

Puedes ver que hay funciones de acimut y sqrDist y después de algunos intentos:

- xy[0].azimuth(xy[1]) or xy[1].azimuth(xy[0]) gives the azimuth direction between two points(in degrees, +/- 180°)
- xy[0].sqrDist(xy[1]) give the square distance between two points (in the unit of the project)

El problema

AsíqueenlaconsoladePython

defselect_all(layer):layer.select([])layer.setSelectedFeatures([obj.id()forobjinlayer])myline=qgis.utils.iface.activeLayer()select_all(myline)foreleminmyline.selectedFeatures():xy=elem.geometry().asPolyline()

ahoraxycontienetodoslosnodos(puntos)delalínea

#firstpointprint"x=%2d y=%2d" % (xy[0].x(),xy[0].y())
x=112935 y=117784
# and others...

Usando todos los puntos de nodo de la línea:

1) punto de acimut i al punto i + 1 (+/- 180 °) (nodos de una línea)

for i in range(len(xy)-1):
     print "x=%2d y=%2d azim=%6.1f azim2=%6.1f" % (xy[i].x(), xy[i].y(), xy[i].azimuth(xy[i+1]), xy[i+1].azimuth(xy[i]))

x=112935 y=117784 azim= 168.4 azim2= -11.6
x=113032 y=117312 azim=-167.5 azim2=  12.5
x=112926 y=116835 azim= 177.3 azim2=  -2.7
x=112943 y=116472 azim= 145.1 azim2= -34.9
[...]

2) distancia euclidiana entre el punto i y el punto i + 1

for i in range(len(xy)-1):
     print "x=%2d y=%2d dist=%6.1f" % (xy[i].x(), xy[i].y(), xy[i].sqrDist(xy[i+1]))

x=112935 y=117784 dist=232533.9
x=113032 y=117311 dist=238243.6
x=112926 y=116835 dist=131839.8
x=112943 y=116472 dist=209268.1
[...]

Después, no es muy difícil agregar estos valores a la tabla de atributos.

Uso esta técnica para analizar los lineamientos (geología) con matplotlib y el complemento Script Runner

    
respondido por el gene 30.04.2012 - 14:46
8

La solución provista por @Simbamangu es bastante efectiva pero no cubre todos los casos. Por ejemplo, aplicar la fórmula con un desplazamiento horizontal anulará el resultado, por lo que debe usar esta fórmula en la Calculadora de campo de QGIS

case
when yat(-1)-yat(0) < 0 or yat(-1)-yat(0) > 0 then 
(atan((xat(-1)-xat(0))/(yat(-1)-yat(0)))) * 180/3.14159 + 
(180 *
(((yat(-1)-yat(0)) < 0) + 
(((xat(-1)-xat(0)) < 0 AND (yat(-1) - yat(0)) >0)*2)
))
when ((yat(-1)-yat(0)) = 0 and (xat(-1) - xat(0)) >0) then 90
when ((yat(-1)-yat(0)) = 0 and (xat(-1) - xat(0)) <0) then 270
end
    
respondido por el Sergio 14.12.2015 - 01:26

Lea otras preguntas en las etiquetas