7 votos

Ajuste de los estilos de los mapas de flujo en QGIS 2

En un proyecto, estoy tratando de adoptar estilos maravillosos para los mapas de flujo creados por @underdark.

En este momento tengo la siguiente salida

Flow_map

El Shapefile fue creado con el uso de Mapas de flujo (Oursins) Plugin.

Las líneas tienen diferentes direcciones, es decir, el punto de partida de la primera es el punto de llegada de la segunda y viceversa. Así que, básicamente, la tabla incluye líneas con ambas direcciones pero sin ninguna descripción de las mismas.

Sample_of_AT


Sin embargo, me encontré con varios problemas

1. Variación del tamaño de los búferes

Los búferes alrededor de los puntos heredarán los parámetros de una capa diferente, es decir, no tendrán el mismo tamaño.

¿Cómo hacer que respondan al tamaño de los radios de los círculos? ¿Existe algún tipo de factor de escala, para que mis topes "dinámico" ?

difference(
  difference(
    $geometry,
    buffer(start_point($geometry), 500)
  ),
  buffer(end_point($geometry), 500)
)

Tal vez yo para aplicar layer_property() o dbvaluebyid() o represent_value() si quiero extraer el valor dinámico de una capa diferente?

Sé que los valores del buffer en la expresión anterior sólo producen resultados apropiados para conjuntos de datos de líneas que utilizan un CRS en metros y tendrán que ser ajustados para otras unidades.

2. Asignación adecuada de flechas

Estoy utilizando una expresión para Arrow type > Plain

CASE
    WHEN x(start_point($geometry)) - x(end_point($geometry)) < 0 THEN 1
    ELSE 2
END

pero aún así, no puedo asignar correctamente las mitades naranjas de las flechas en el lado opuesto de los azules.

3. La anchura de las flechas

Quiero ajustar el ancho de línea según los valores de un campo "FLUX" . Por esta razón, estoy utilizando una expresión para Arrow width .

scale_linear("FLUX",0,10,0.1,3) * CASE WHEN  "FLUX" > 1000 THEN 1 ELSE 0 END

¿Cómo debo manejar esos temas?


Mi salida deseada debería ser así, las líneas curvas pueden ser ignoradas.

Desired_output


Referencias:

0 votos

Pensando en voz alta: ¿Podrías reducir a la mitad el ancho de tus flechas y colocarlas en uno u otro lado de tu línea? Como CASE WHEN x(start_point($geometry)) - x(end_point($geometry)) < 0 THEN -0.5 ELSE 0.5 END introducido como valor "offset" (o utilizar 1 en lugar de 0.5 ). ¿O es que no es deseable para el estilo que pretende?

0 votos

Desgraciadamente, no tanto, tengo que tener un mapa de buen aspecto para seguir investigando. Su idea tiene sentido, pero no es lo que sueño.

0 votos

¿Qué pasa con la dirección y la anchura de las flechas? Ayudaría que añadieras una imagen de cómo quieres que sean las flechas.

3voto

Albert C Puntos 428

1. Variar el tamaño de los buffers

Te recomendaría unir los atributos de ambas capas en lugar de buscar las propiedades de las capas. Estas son las expresiones que he utilizado en este ejemplo :

Tamaño de la capa de puntos:

scale_exp("attributeBuffer", minTotalFlux, maxTotalFlux, @min, @max, exponent)

Generador de geometría de la capa de líneas:

difference(
  difference($geometry,
  buffer(start_point($geometry), scale_exp("attributeBufferStart", minTotalFlux, maxTotalFlux, (@min/2), (@max/2), exponent),
  buffer(end_point($geometry), scale_exp("attributeBufferEnd", minTotalFlux, maxTotalFlux, (@min/2), (@max/2), exponent)
  )
)

Donde "attributeFromStart" y "attributeFromEnd" son los valores utilizados para amortiguar los puntos. Es necesario utilizar unidades de mapa y no milímetros en el punto, ya que el generador de geometría de líneas trabajará con unidades de mapa. @project_variables se utilizaron para cambiar fácilmente los tamaños en las propiedades del proyecto sin tener que introducir los cambios en cada capa.

2. Asignación adecuada de flechas

Creo que tu problema es el cambio de dirección en dos capas. Tus geometrías de líneas ya tienen direcciones opuestas por lo que ambas deberían ir hacia el mismo lado. Es como los coches, te ciñes a un lado de la carretera, si no, ambos sentidos acabarían usando el mismo carril.

0 votos

Gracias. Su respuesta tiene mucho sentido. Así que, básicamente, sugieres aplicar el join funcionalidad y, a continuación, la gestión de dos capas attributeFromStart y attributeFromEnd en consecuencia, ¿tengo razón? ¿Sabes si puedo extraer de alguna manera esos valores en una expresión determinada? Los estoy calculando con "Value" / ( "Size" ^ 2)) .

0 votos

Creo que has editado la pregunta mientras yo respondía. De todos modos, el difference() es hacer que su línea comience y termine de acuerdo con los valores de sus puntos (los mismos que utiliza para amortiguar la capa de puntos). Para ello, me uní a los valores en mis características de la línea. También tuve algunas @project_variables para poder ajustar fácilmente todos los tamaños (buffers de puntos y comienzo/fin de línea) fácilmente.

0 votos

¿Puede explicar qué quiere decir con @minimum_variable, @maximmum_variable, @minimum_variable2,@maximmum_variable2 ?

3voto

ARUNBALAN NV Puntos 101

1. Variación del tamaño de los búferes

En primer lugar, cambie a Unidad de Mapa .

Con las sugerencias de @Albert, he unido los valores del buffer de una capa para start_point y end_point puntos y, además, he editado los círculos y los he visualizado como marcador simple. Utilizando la fórmula scale_linear("Value", minimum("Value"), maximum("Value"), 1, 6)

El tamaño de búfer requerido obedece a un factor de escala de 2 Obsérvese la diferencia en range_min, range_max entre dos funciones.

difference(
    difference($geometry,
        buffer(start_point($geometry),
        CASE
          WHEN "From_Value" IS NOT NULL THEN scale_linear("From_Value", minimum("From_Value"), maximum("From_Value"), 2, 12)
          ELSE 0
        END
        )
    ),
    buffer(end_point($geometry),
    CASE
      WHEN "To_Value" IS NOT NULL THEN scale_linear("To_Value", minimum("To_Value"), maximum("To_Value"), 2, 12)
      ELSE 0
    END)
)

No olvide comprobar los valores de start_point() , end_point() y min&max tienen que ser los mismos entre las capas de puntos y polilíneas.

2. Asignación adecuada de flechas

La expresión correcta

CASE
  WHEN x(start_point($geometry)) - x(end_point($geometry)) < 0 THEN 2
  WHEN x(start_point($geometry)) - x(end_point($geometry)) > 0 THEN NULL
  ELSE 1
END

El resultado será el siguiente

Arrows_locations

Otra solución puede lograrse con la creación de dos capas a través de un 'Virtual Layer' y luego ajustar los estilos manualmente. Sin embargo, es un método que requiere mucho tiempo.

Capa 1 (mitad izquierda/exterior):

SELECT *
FROM flow_map_sample
WHERE x(ST_StartPoint(geometry)) - x(ST_EndPoint(geometry)) < 0

Capa 2 (mitad derecha/exterior):

SELECT *
FROM flow_map_sample
WHERE x(ST_StartPoint(geometry)) - x(ST_EndPoint(geometry)) > 0

3. La anchura de las flechas

Necesitaba usar:

scale_linear("FLUX", minimum("FLUX"), maximum("FLUX"), 0.1, 3) *
  CASE
    WHEN "FLUX" > 1000 THEN 1
    ELSE 0
  END

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