5 votos

Añadir polilíneas de forma programada a partir de puntos existentes en QGIS

Estoy usando QGIS 2.18 y necesito ayuda para encontrar un python script o una herramienta que me permita dibujar programáticamente una línea desde los puntos GPS existentes (a veces hasta 500 o más) que tenga una longitud de 250 pies en un rumbo listado en un campo de atributo de acimut para cada punto.

0 votos

Para crear estas líneas como características reales de la línea es probable que tenga que escribir su propio python script. Yo escribí un script que puedes modificar aquí gis.stackexchange.com/a/226117/56050 o al menos utilizarlo como guía para empezar. Si encuentro el tiempo podría escribir algo para esta situación específica, pero la documentación de QGIS está abajo ahora mismo y no estoy que familiarizado con PyQGIS.

5voto

Derecho Puntos 1122

Si no necesita realmente una geometría y sólo necesita dibujar las líneas como se describe, puede utilizar el constructor de geometría de QGIS.

Si necesitas las geometrías, tengo otra respuesta en esta misma pregunta que muestra cómo generar las geometrías usando un python script aquí .

enter image description here

Dentro del editor de expresiones necesitarías algo así

make_line($geometry, make_point($x + 250*cos(radians("azimuth")), $y + 250*sin(radians("azimuth"))))

Desglosando...

make_line toma dos puntos y crea una línea

$geometry la geometría actual. Si tiene una capa de puntos, este es el punto actual

make_point crea un punto con una x y una y dadas

$x el valor x de la geometría actual.

$y el valor y de la geometría actual.

250*cos(radians("azimuth")) Desplazamiento x calculado a partir del acimut. Esto supone que está utilizando un sistema de coordenadas proyectadas, la distancia es de 250 unidades (cualquiera que sean las unidades de su sistema de coordenadas. Para la mayoría serían metros), y el acimut se almacena en un atributo llamado acimut y se almacena en grados, y la forma en que está escrito es utilizando un sistema de coordenadas matemáticas, por lo que 0 grados es el Este aumentando en sentido contrario a las agujas del reloj, por lo que el Norte es 90, el Oeste es 180, etc.

A continuación se muestra un ejemplo de salida.

enter image description here

2voto

Derecho Puntos 1122

Pude modificar mi script para crear las geometrías que buscabas hacer. La distancia debe estar en las unidades de tu sistema de coordenadas. Yo sugeriría transformar a un sistema de referencia de coordenadas proyectado apropiado que utilice pies o metros.

Para utilizar este código, abra la caja de herramientas de Processing, luego expanda Scripts y luego expanda Herramientas. Seleccione "Crear nuevo script" y copie y pegue el código de abajo en la ventana script (tenga cuidado al copiar y pegar código python ya que los espacios en blanco son sintácticamente significativos. Si tienes problemas pon el código en un editor de texto que muestre los espacios en blanco y asegúrate de que se ha copiado correctamente). Guárdalo donde quieras y hay un botón de ejecutar script en la parte superior de la ventana. Después de guardarlo puedes "Añadir script desde el archivo" y tener permanentemente el script bajo "Scripts de usuario".

##input_layer=vector
##distance=number
##output_layer=output vector

from qgis.core import QgsWKBTypes, QgsField, QgsVectorFileWriter, QgsFeature, QgsGeometry, QgsPoint
from PyQt4.QtCore import QVariant

def addLines( geometry, writer, inFeature ):
    coordinateSequence = geometry.coordinateSequence()
    for rings in coordinateSequence:
        for points in rings:
            for point in points:
                feature = QgsFeature( fields )
                azimuth = inFeature.attribute('azimuth')
                simplePoint = QgsPoint(point.x(), point.y())
                pointAtAngle = simplePoint.project(distance, azimuth)
                lineGeometry = QgsGeometry.fromPolyline([simplePoint, pointAtAngle])
                feature.setGeometry( QgsGeometry( lineGeometry ) )
                type = lineGeometry.wkbType()
                attributes = inFeature.attributes()
                feature.setAttributes( attributes )
                writer.addFeature( feature )
    return

inlayer = processing.getObject( input_layer )
provider = inlayer.dataProvider()
fields = provider.fields()
geomType = QgsWKBTypes.Type(inlayer.wkbType())
outputGeomType = QgsWKBTypes.MultiLineString

writer = QgsVectorFileWriter( output_layer, 'UTF-8', fields,  outputGeomType , inlayer.crs() )

features = inlayer.getFeatures()
featureCount = inlayer.featureCount()
featureIndex = 0

for f in features:
    percent = ( featureIndex/float( featureCount ) ) * 100
    progress.setPercentage( percent )
    g = f.geometry().geometry()
    addLines( g, writer, f )
    featureIndex +=1

del writer

0voto

Frank Lowney Puntos 11

Busque el uso de https://plugins.qgis.org/plugins/qchainage/

Una vez que instales el plugin deberías poder crear esas líneas.

Este plugin toma las características de las líneas y crea una nueva capa de puntos en distancias proporcionadas sobre estas Líneas. Opcionalmente se puede establecer el punto inicial (distancia desde el inicio de la línea) y el punto final (parada antes de llegar al final de la línea) y etiquetar automáticamente los nuevos puntos con las distancias.

0 votos

Gran herramienta, pero según entiendo esta herramienta coloca los puntos a lo largo de una línea, necesito dibujar una línea que comienza en el punto gps que es 250 pies de largo y en una dirección que aparece en el campo de acimut del punto gps. Básicamente, una línea de 250 pies de largo que comience en el punto y se dibuje en un ángulo de 75 grados.

0voto

DBM Puntos 51

Si no quieres usar expresiones puedes usar el renderizador de campos vectoriales para tus propósitos. He creado un conjunto de datos de muestra de cinco puntos con un bearing atributo...

enter image description here

...y con la calculadora de campos añadió un atributo length que define como 2500m para cada característica (puede utilizar diferentes valores de longitud para cada uno o utilizar la velocidad del GPS para la longitud):

enter image description here

enter image description here

Luego en Layer properties | Point Style añadí una capa de símbolos de tipo 'vector field renderer' en la que se pueden definir atributos para la longitud y el ángulo:

enter image description here

lo que resulta en

enter image description here

0 votos

¡Esto funciona muy bien! Gracias Me gustaría ser capaz de generar estos como características de la línea eventualmente cualquier sugerencia.

0 votos

@EdHawkins Mi respuesta a continuación genera características de la línea

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X