2 votos

Prueba si la capa existe usando una expresión en QGIS

¿Existe una forma de probar si una capa (nombre) existe en QGIS para escribir una expresión condicional?

Mi problema particular es que estoy tratando de rotar un objeto de punto (una puerta), usando una expresión definida por datos.

Si la capa 'road' existe (una capa de línea), usaré el ángulo del segmento de carretera más cercano (usando el enfoque discutido aquí: Encontrar el ángulo del segmento de geometría de línea más cercano al punto).

Si la capa 'road' no existe, usaré el campo "symbolrotation" en la capa de punto.

El desafío es que aunque la capa se llame 'road' en el Panel de Capas, tendrá un ID de capa similar a 'road_b3cb9198_b4d5_4e05_b465_ed2e1c291774'. Por lo que comprobar si 'road' existe en la variable @layer_ids probablemente no funcione.

¿Existe alguna forma alternativa?

3voto

chhh Puntos 1154

Crea un array con todos los nombres de capa en un proyecto con la variable @layers() (todas las capas de mapa en el proyecto actual como una lista) y la función layer_property(), luego prueba si un cierto nombre de capa (aquí: 'road') existe en el array con array_contains(). Usa esta expresión:

array_contains (
    array_foreach (
        @layers,
        layer_property (@element,'name')),
    'road' -- nombre de la capa que estás buscando
)

3voto

Dror Bogin Puntos 118

Puedes utilizar is_layer_visible, debería devolver false si la capa no es visible o si no existe tal capa en el proyecto.

Ejemplo:

is_layer_visible('road')

añádelo como condición en tu expresión CASE o if.

En el ejemplo siguiente simplemente cambio el tamaño de los puntos si la capa existe:

if( is_layer_visible('road'),10,2)

ya que la capa road existe y es visible, los puntos se redimensionan a 10 y no a 2.

introducir descripción de la imagen aquí

Nota importante

Utilizar un nombre de capa simple y no IDs puede llevar a resultados incorrectos si dos o más capas comparten el mismo nombre (normalmente se hace por razones cartográficas en diferentes escalas)

3voto

chhh Puntos 1154

Si el problema es solo la discrepancia entre @layer_id y el nombre de la capa, puedes usar el operador ~ para realizar una coincidencia de expresión regular:

@layer_id ~ 'point'

O, si no es solo la capa actual, sino todas las capas:

array_sum (
    array_foreach (@layer_ids, @element ~ 'road')
)>0

Porque 'road_b3cb9198_b4d5_4e05_b465_ed2e1c291774' ~ 'road' devuelve verdadero (el nombre de la capa road está contenido en la cadena de identificación de capa más larga).

introduce la descripción de la imagen aquí

2voto

chhh Puntos 1154

Puedes usar la función try() junto con cualquier otra función que utilice el nombre de una capa como argumento (por ejemplo, overlay_nearest()): si la capa no se encuentra, la función devuelve un error. try() devuelve si la expresión encerrada no contiene errores. Así obtienes el resultado deseado usando esta expresión:

try (overlay_nearest ('road')) is TRUE

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