4 votos

Colocando etiquetas definidas por datos tanto por expresión como manualmente

En mi proyecto de capas (QGIS 3.6.2) uso de datos definido por la colocación de la etiqueta. Estoy tratando de configurar la colocación de la siguiente manera:

  • De forma predeterminada, la ubicación elegida en la Configuración de la Etiqueta se utiliza (en mi caso, "en torno al centro de gravedad").
  • Si X e y se rellenan los campos (es decir, la etiqueta ha sido colocado manualmente), estos valores se utilizan.
  • Tengo un booleano/T F campo llamado "UsePOS" en mis datos; si está activado (true), y si los campos X e y son nulos, entonces el X/Y colocación utiliza un cálculo del punto (en mi caso, un punto en la superficie). Si es false, null campos X e y son utilizados (es decir, que la ubicación predeterminada).

Aquí es lo que he intentado: en la Configuración de la Etiqueta, he definido el X colocación con la siguiente expresión...

if( "X" is not NULL,
    "X",
    if( "UsePOS",
        x(  point_on_surface(  $geometry  )  ),
        "X"
      )
  )

...y el campo Y con una expresión similar. Esto funcionó a la perfección como era de esperar-por defecto, la etiqueta se coloca en el centro de gravedad; si la casilla está marcada, salta al punto en la superficie, y si no hay datos en el X/Y, a continuación, la etiqueta se fija allí.

Sin embargo, el problema surge cuando intento colocar manualmente una etiqueta. En ese caso, debido a que el X/Y de la colocación no está directamente definida por el X/Y campos, QGIS invoca auxiliares de almacenamiento, que no es lo que yo estoy utilizando para la colocación de la etiqueta, y que parece que no puede ser suprimida (ver mi comentario en este hilo).

Así que supongo que 1) necesito asignar directamente la colocación de la etiqueta para mi X/Y campos, 2) necesito para usar una expresión en la Calculadora de Campo para rellenar los campos, y 3) los campos deben ser virtual, por lo que responden dinámicamente a si que me mueva manualmente la etiqueta, si la casilla de verificación está marcada, etc. Sin embargo, al escribir la expresión anterior en la Calculadora de Campo causas de QGIS se bloquee cuando la etiqueta se mueve manualmente, o cuando marque la casilla de verificación (que yo esperaba, ya que no creo que un campo virtual puede hacer referencia a sí mismo).

La pregunta es, ¿cuál es la forma correcta de configurar lo que yo quiero, así que todavía puedo mover manualmente las etiquetas, sólo el uso de datos definidos por el etiquetado y no auxiliar de almacenamiento?

2voto

Steve Holden Puntos 1

La solución más eficaz que he encontrado (EDIT: ya no más; ver el "valor predeterminado" método para una solución plenamente funcional) utiliza la regla basada en el etiquetado.

En primer lugar, es necesario rellenar todos los de X/Y de los campos con las etiquetas' actual (es decir, por defecto) la posición, usando x($geometry) y y($geometry). A continuación, cree una regla donde "X" is not null , y para definir su reemplazar la colocación de uso de los campos X e y.

Para la segunda regla, el caso MÁS, definir el reemplazo de colocación mediante la expresión:

if("UsePOS",
   x(point_on_surface($geometry)),
   "X"
   )

Para utilizar esta colocación, marque "UsePOS" y desanclar la etiqueta (por lo tanto la supresión de los valores de X e y). Una imperfección se plantea si desea volver a mover esta etiqueta de forma manual, ya que volverá a invocar de almacenamiento auxiliar (que, si usted lo permite, entonces re-definir todas las etiquetas de la colocación de la auxiliar de campos), y usted no puede usar el Pin/Desanclar herramienta para re-establecer su X/Y valores, por lo que tendrás que rellenar manualmente los de nuevo.

1voto

Gadget Puntos 81

Una vez que usted coloque manualmente una etiqueta, QIS le pedirá que seleccione el campo que desea utilizar como clave principal entre la capa de la propia tabla y el almacenamiento auxiliar. He creado un virtual campo "ID" (simplemente se calcula como el "$id") y se utiliza como una clave principal.

elect primary key

Una vez hecho esto, QGIS hará dos nuevos campos disponibles para usted:

  1. "auxiliary_storage_labeling_positionx" y
  2. "auxiliary_storage_labeling_positiony"

auxiliary_storage_labeling_position

En ese punto se puede utilizar de forma adecuada el lugar de las etiquetas. Para facilitar las cosas, he creado un auxiliar de campo virtual ("xlabel") que median en el que de coordenadas (auto, colocado manualmente o asignar de forma numérica) para su uso.

fields

La selección de "xlabel" (y "ygeom" porque se necesitan dos coordenadas, de lo contrario no se dibujar las etiquetas correctamente) para la colocación en el cuadro de diálogo Etiquetas hará el truco.

campos relevantes aquí:

  • xnum: [opcional] numérica coordinar, introducir manualmente en el campo
  • UsePos2: boolean-como bandera [0/1] [opcional], introducir manualmente en el campo
  • xman: campo virtual que reproduce "auxiliary_storage_labeling_positionx", para hacer las cosas más claras. Calcula automáticamente a partir de la colocado manualmente la etiqueta (si la etiqueta se ha movido manualmente).
  • xgeom: las coordenadas de la función. Calcula automáticamente.
  • X: la coordenada x para almacenar el arbitraje valor entre xman, xnum, o xgeom. Este es un intermedio de campo y se calcula automáticamente.
  • xlabel: el valor final de la etiqueta. El uso de este en la "Colocación" de la opción.

Después de mover manualmente las etiquetas, xman se actualiza, y dependiendo UsePos y xnum, también xlabel será actualizado.

Fianlly, seleccione xlabel en la Placement panel -> Data defined -> Coordinate X.

Label Placement

;)

1voto

matzeri Puntos 176

El punto es, que no se puede utilizar data defined override posicionamiento con una expresión Y uso move labels función en el mismo tiempo. Usted sólo puede hacer cualquiera de ellos. (O introducir coordenadas manualmente sin el uso de la move label característica).

Sé que esto no es una solución satisfactoria, pero si desea utilizar el move label función, es necesario quitar primero la expresión a partir de los datos definidos anular y el uso sólo de sus campos "X" o "Y". A continuación, habilitar edit mode de su capa, mover las etiquetas, guardar la capa y escriba su expresión de nuevo en data defined override.

Creo que de fondo es, que QGIS puede guardar las coordenadas en las expresiones. Sólo en los campos. Es por eso que se está tratando de utilizar auxiliar de almacenamiento como es el no reconocimiento de la expresión como de campo.

Puede que desee hacer una petición, pero me imagino (no estoy en desarrollo de software), la implementación de esta podría no ser la tarea más fácil.

1voto

Steve Holden Puntos 1

He encontrado una solución eficaz, el uso de la expresión-define los valores por defecto para los campos X e y.

En Propiedades de la Capa, a partir de los Atributos de Formulario de panel, he puesto el valor por defecto de X mediante la expresión:

if( "UsePOS" ,
x( point_on_surface( $geometry ) ),
"X" )

...y de la misma manera para Y. también me he fijado tanto en "aplicar defecto en la actualización"; de esta manera, QGIS siempre comprueba si "UsePOS" está seleccionado, y si es así, calcula X e y de acuerdo con el punto en la superficie. Si "UsePOS" no está seleccionada, QGIS utiliza el valor que ya se entró en X o Y, si alguna, lo que me permite ajustar manualmente la colocación de la etiqueta.

Hay una sutil diferencia en que esta solución de la cuestión como originalmente planteados. Tenía la intención de manual de colocación para reemplazar el POS o el centroide de la opción-de hecho, ahora me doy cuenta, en lugar de utilizar una expresión basada en datos definidos por el anular de la colocación, lo que realmente quería era una expresión basada en datos definidos por defecto de colocación (que QGIS no ofrece). Pero en esta solución, el POS opción anula el manual de colocación, lo que significa que es necesaria la verificación de las naciones unidas "UsePOS" antes de mover manualmente la etiqueta.

EDIT: Que diferencia puede ser fácilmente superado por el cambio de la expresión. Por ejemplo, la siguiente expresión no sólo permite la selección manual de la ubicación para anular la selección de "UsePOS", sino que también introduce una mayor reemplazar llamado "HCen" y "VCen", que bloquea el X o Y coordinar, o ambos, para el centro geométrico de la función. Puedo usar esto como una forma rápida de "complemento" de la etiqueta a la característica del punto medio, y como una manera de mover la etiqueta hacia arriba y hacia abajo, pero no de lado a lado (o viceversa) por el bloqueo solo X o Y coordinar. (NOTA: Esta es la expresión para la X de campo; para la Y de campo, basta con sustituir cada "x" por "y" en la expresión, y la transposición de la "HCen" y "VCen".)

if( "HCen",
    ( x_min( $geometry ) + x_max( $geometry ) ) / 2,
    if( "X" is not NULL AND "X" != x( point_on_surface( $geometry ) ),
        "X",
        if( "UsePOS",
            x( point_on_surface( $geometry ) ),
            if( "VCen",
                x( $geometry ),
                NULL
            )
        )
    )
)

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