3 votos

Crear automáticamente una matriz con todos los nombres de capas visibles en QGIS

¿Cómo puedo obtener un array de todos los nombres de capas visibles de forma automática utilizando expresiones de QGIS? En principio debería funcionar con la variable @map_layers . El uso de la siguiente expresión funciona bien para lo que quiero hacer, pero sólo de forma semimanual:

array (
    layer_property( 
        array_get (
            @map_layers , 
            0
        ), 
       'name'), 
    layer_property( 
        array_get (
            @map_layers , 
            1
        ), 
        'name'
    )
)

Tengo que añadir manualmente un array_get (@map_layers, [index]) para cada capa. Me gustaría más bien iterar y obtener todas las capas visibles de forma automática, independientemente del número de capas visibles. En un primer paso, calculo el número de capas visibles: array_length (array_first (array ( @map_layers ))) (abreviado no_visible en la siguiente expresión).

Donde estoy atascado es en la iteración para crear el nombre de la capa para cada capa visible. He probado la siguiente expresión, pero no devuelve ningún resultado: No feature was found on this layer to evaluate the expression .

array_foreach (
    generate_series(0,[no_visible]),
    layer_property ( 
        array_get (
            @map_layers , 
            @element
        ),
        'name'
    )
)

¿Qué estoy haciendo mal?

Actualización: La expresión en sí parece correcta, aunque la ofrecida por @lejedi76 es más elegante para conseguir el mismo objetivo. Sin embargo, el comportamiento de QGIS es bastante erróneo cuando se utiliza cualquiera de estas expresiones para seleccionar varias capas (raster) a la vez como entrada para una herramienta en modo batch - ver https://gis.stackexchange.com/a/385917/88814 para más detalles.

4voto

Jed Puntos 6

No creo que lo estés haciendo mal. Es un pequeño bug (en el modelo) pero funciona. Acabo de probar en QGIS 3.16.3 estableciendo una variable y funciona.

Por cierto, podrías hacer..:

array_to_string(
  array_foreach ( 
    @map_layers,
    layer_property(@element,'name')
  )
)

Demo

enter image description here

Modelo (.model3)

<!DOCTYPE model>
<Option type="Map">
  <Option name="children" type="Map">
    <Option name="native:setprojectvariable_1" type="Map">
      <Option name="active" type="bool" value="true"/>
      <Option name="alg_config"/>
      <Option name="alg_id" type="QString" value="native:setprojectvariable"/>
      <Option name="color" type="QString" value=""/>
      <Option name="comment" type="Map">
        <Option name="color" type="QString" value=""/>
        <Option name="component_description" type="QString" value=""/>
        <Option name="component_height" type="double" value="60"/>
        <Option name="component_pos_x" type="double" value="464"/>
        <Option name="component_pos_y" type="double" value="392"/>
        <Option name="component_width" type="double" value="100"/>
        <Option name="outputs_collapsed" type="bool" value="true"/>
        <Option name="parameters_collapsed" type="bool" value="true"/>
      </Option>
      <Option name="component_description" type="QString" value="Setting variable with visible layers"/>
      <Option name="component_height" type="double" value="30"/>
      <Option name="component_pos_x" type="double" value="511"/>
      <Option name="component_pos_y" type="double" value="318"/>
      <Option name="component_width" type="double" value="200"/>
      <Option name="dependencies"/>
      <Option name="id" type="QString" value="native:setprojectvariable_1"/>
      <Option name="outputs"/>
      <Option name="outputs_collapsed" type="bool" value="true"/>
      <Option name="parameters_collapsed" type="bool" value="true"/>
      <Option name="params" type="Map">
        <Option name="NAME" type="List">
          <Option type="Map">
            <Option name="source" type="int" value="2"/>
            <Option name="static_value" type="QString" value="Visible_layers"/>
          </Option>
        </Option>
        <Option name="VALUE" type="List">
          <Option type="Map">
            <Option name="expression" type="QString" value="array_to_string(array_foreach ( @map_layer_ids,&#xa;layer_property(@element,'name')))"/>
            <Option name="source" type="int" value="3"/>
          </Option>
        </Option>
      </Option>
    </Option>
  </Option>
  <Option name="designerParameterValues" type="Map">
    <Option name="VERBOSE_LOG" type="bool" value="true"/>
    <Option name="test" type="datetime" value="2021-01-30T18:21:02"/>
  </Option>
  <Option name="groupBoxes"/>
  <Option name="help"/>
  <Option name="modelVariables"/>
  <Option name="model_group" type="QString" value="test"/>
  <Option name="model_name" type="QString" value="visible_layers"/>
  <Option name="parameterDefinitions" type="Map">
    <Option name="test" type="Map">
      <Option name="data_type" type="int" value="0"/>
      <Option name="default" type="invalid"/>
      <Option name="defaultGui" type="invalid"/>
      <Option name="description" type="QString" value="test"/>
      <Option name="flags" type="int" value="0"/>
      <Option name="help" type="QString" value=""/>
      <Option name="max" type="datetime" value=""/>
      <Option name="metadata"/>
      <Option name="min" type="datetime" value=""/>
      <Option name="name" type="QString" value="test"/>
      <Option name="parameter_type" type="QString" value="datetime"/>
    </Option>
  </Option>
  <Option name="parameterOrder"/>
  <Option name="parameters" type="Map">
    <Option name="test" type="Map">
      <Option name="color" type="QString" value=""/>
      <Option name="comment" type="Map">
        <Option name="color" type="QString" value=""/>
        <Option name="component_description" type="QString" value=""/>
        <Option name="component_height" type="double" value="60"/>
        <Option name="component_pos_x" type="double" value="528"/>
        <Option name="component_pos_y" type="double" value="168"/>
        <Option name="component_width" type="double" value="100"/>
        <Option name="outputs_collapsed" type="bool" value="true"/>
        <Option name="parameters_collapsed" type="bool" value="true"/>
      </Option>
      <Option name="component_description" type="QString" value="test"/>
      <Option name="component_height" type="double" value="30"/>
      <Option name="component_pos_x" type="double" value="328"/>
      <Option name="component_pos_y" type="double" value="213"/>
      <Option name="component_width" type="double" value="200"/>
      <Option name="name" type="QString" value="test"/>
      <Option name="outputs_collapsed" type="bool" value="true"/>
      <Option name="parameters_collapsed" type="bool" value="true"/>
    </Option>
  </Option>
</Option>

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