29 votos

¿Dibujar líneas onduladas, onduladas en QGIS?

¿Hay una función QGIS o plugin para dibujar línea ondulación?

He utilizado la herramienta Spline para dibujar manualmente algunas olas, pero es mucho tiempo. Si es posible, me gustaría dibujar algo como:

enter image description here

Inkscape Function Plotter ( sin(x) curva).

26voto

Braiam Puntos 120

Respuesta corta: se puede obtener usando una costumbre SVG. Véase la parte inferior de este post para uno.

Respuesta larga:

Yo creo que es mejor para representarlo que modificar la geometría de línea. Si desea mover un borde o hacer otras acciones en la geometría, sería una pesadilla para administrar si las ondas son parte de la geometría en lugar de sólo una representación de una línea recta.

Se puede jugar con el estilo de línea de marcador. Hay una manera fácil de obtener cerca de lo que usted necesita, y con un poco más de esfuerzo, es probable que sea posible para obtener exactamente. enter image description here

Para conseguir esto, el estilo de la línea con dos líneas de Marcador. Cada línea de Marcador está hecho de un Simple Marcador, el medio círculo. La 1ª es girado por 180. Ambos se establecen en transparente.

En la línea de Marcador, instruir a uno de ellos a ser compensado por lo que los dos símbolos no están dibujados de frente el uno del otro, pero al lado del otro. Si utiliza offest = 1/2 * tamaño del intervalo, la salida será una curva sinusoidal. Le sugiero que jugar con el intervalo de tamaño, desplazamiento y tamaños de los símbolos.

La principal limitación de este enfoque es el diámetro de la línea de la mitad de los círculos, que suma a la línea original. Si el fondo es blanco (o de cualquier color liso), se podría añadir una 3ª línea simple de usar el color de fondo.

enter image description here

enter image description here

enter image description here

enter image description here

** EDIT **

Otra opción para deshacerse de la línea de centro es crear un nuevo SVG símbolo. He modificado la mitad de la curva, sólo viviendo la parte redondeada de la parte. Funciona, aunque un 1/2 elipse puede ser más atractivo. La captura se realizó mediante el símbolo de tamaño 10, el intervalo 4, desplazamiento de 2.

enter image description here

guarde el código siguiente en un archivo de half_circle_line.svg y asegúrese de que la ruta para el archivo svg se establece en QGIS // Settings / Options / System / SVG Paths

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="11.2889mm" height="11.2889mm"
 viewBox="0 0 32 32"
 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"  version="1.2" baseProfile="tiny">
<title>Qt Svg Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >

<g fill="#ffffff" fill-opacity="0" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="MS Shell Dlg 2" font-size="8.25" font-weight="400" font-style="normal" 
>
<path vector-effect="non-scaling-stroke" fill-rule="evenodd" d="M19.1181,16 C19.1181,16 19.1181,14.2779 17.7221,12.8819 16,12.8819 C14.2779,12.8819 12.8819,14.2779 12.8819,16"/>
</g>
</g>
</svg>

22voto

Geoffrey Puntos 228

Yo propongo una solución con PyQGIS. Se debe trabajar tanto para Linestring y MultiLineString capas.

Esta solución se basa en la creación de anillos semicirculares, por lo que es necesario establecer un valor para el diámetro (es decir, el step variable en el código de abajo). El paso que usted elija no ser el verdadero paso de usa porque es ajustado sobre la base de la longitud de la línea (pero sería muy similar al valor establecido inicialmente). Usted necesita hacer algunos intentos antes de encontrar el mejor valor para el step variable.

El código también se requiere un segundo parámetro (opcional) (llamado crv_angle), lo que ayuda a la disminución o el aumento de la curvatura de los anillos (he realizado un par de pruebas, así que me sugieren dejando a 45 grados como ángulo predeterminado ya que esto podría llevar a un verdadero anillos circulares).

Usted sólo necesita ejecutar este código desde la Consola de Python:

from math import sin, cos, radians

step = 3 # choose the proper value (e.g. meters or degrees) with reference to the CRS used
crv_angle = 45 # degrees

def segment(polyline):
    for x in range(0, len(polyline) - 1):
        first_point = polyline[x]
        second_point = polyline[x +1]
        seg = QgsGeometry.fromPolyline([first_point, second_point])
        tmp_azim = first_point.azimuth(second_point)
        len_feat = seg.length()
        parts = int(len_feat/step)
        real_step = len_feat/parts # this is the real step applied

        points = []
        current = 0
        up = True

        while current < len_feat:
            if up:
                round_angle = radians(90 - (tmp_azim - crv_angle))
                up = False
            else:
                round_angle = radians(90 - (tmp_azim + crv_angle))
                up = True
            first = seg.interpolate(current)
            coord_x, coord_y = (first.asPoint().x(), first.asPoint().y())
            p1=QgsPointV2(coord_x, coord_y)
            dist_x, dist_y = ((real_step*sin(rad_crv_angle))* cos(round_angle), (real_step*sin(rad_crv_angle)) * sin(round_angle))
            p2 = QgsPointV2(coord_x + dist_x, coord_y + dist_y)
            points.extend([p1, p2])
            current += real_step

        second = seg.interpolate(current + real_step)
        p3=QgsPointV2(second.asPoint().x(), second.asPoint().y())
        points.append(p3)

        circularRing = QgsCircularStringV2()
        circularRing.setPoints(points) # set points for circular rings
        fet = QgsFeature()
        fet.setGeometry(QgsGeometry(circularRing))
        prov.addFeatures([fet])

layer = iface.activeLayer() # load the input layer as you want
crs = layer.crs().toWkt()
rad_crv_angle = radians(crv_angle)

# Create the output layer
outLayer = QgsVectorLayer('Linestring?crs='+ crs, 'wiggly_line' , 'memory')
prov = outLayer.dataProvider()
fields = layer.pendingFields()
prov.addAttributes(fields)
outLayer.updateFields()

for feat in layer.getFeatures():
    geom = feat.geometry()
    polyline = geom.asPolyline()
    segment(polyline)

# Add the layer to the Layers panel
QgsMapLayerRegistry.instance().addMapLayer(outLayer)

y va a crear una nueva línea de capa de memoria con el resultado esperado:

enter image description here

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