2 votos

Modificación de determinados atributos y creación de un nuevo campo para los datos combinados

Tengo este conjunto de datos combinados con alturas de edificios divididos en varias columnas ''Altura'' ''Edificio_h'' y ''Edificio_L''. Mi objetivo final es combinarlas todas en una nueva columna. Sin embargo, hay varios problemas:

  1. Todas las columnas son cadenas. Soy consciente de la to_real() pero no funciona porque algunos de los valores tienen "m" detrás para indicar que están en metros. ¿Cómo puedo cambiarlos?

  2. Ya he utilizado regexp_replace( "height" , 'm.*', ' ') en la calculadora de campos para deshacerse de la 'm' que hay detrás de los contadores y los puso en un nuevo campo llamado 'sin M', pero ahora sólo los casos que tenían m están en este campo. Además, siguen estando en el campo en el que estaban originalmente, por lo que todavía no puedo aplicar la to_real() .

  3. Quiero utilizar con el campo ''SinM'' para añadir también todos los demás valores.

¿Cómo lo hago?

  1. Luego está ''Edificio_l'' que tiene el número de niveles por edificio. Y así, esta es una forma diferente de expresar la altura del edificio que ''altura'' y ''edificio_h''. Si digo, por ejemplo, que el nivel medio de un edificio es de 3 metros, ¿hay alguna forma de multiplicar el valor de ''edificio_l'' por 3 y ponerlo también en el campo ''sinM''?

  2. El último problema está relacionado con el hecho de que varios edificios tienen un valor en más de una columna. Por ejemplo en ''altura'' y ''edificio_l'', ¿cómo debo manejar esto?

1voto

enkrs Puntos 116

Puede utilizar la calculadora de campo.

  • Calculadora de campo abierto.
  • Seleccione actualizar campo existente, seleccione su campo de destino ("sinM").
  • Vaya al editor de funciones, seleccione nuevo archivo y nombre su nueva función.
  • En el lado derecho escriba este código:
from qgis.core import *
from qgis.gui import *

@qgsfunction(args='auto', group='Custom')

def my_copy(value1, value2, feature, parent):
  value2 = value2.replace("m", "")
  num_value2 = float(value2)
  if num_value1 != NULL:
      pass
  else:
      return float(num_value2)

Para el campo con número de niveles cambiar la sentencia else por:

  else:
      return float(num_value2) * 3
  • Haga clic en cargar y vuelva a la pestaña Expresión.
  • Escriba: mi_copia("su_campo_destino", "su_campo_fuente") En tu caso sustituirías "tu_campo_destino" por "sinM".

Este código comprobará si el campo de destino está vacío, en ese caso copiará el valor del campo de origen.

  • Ejecute esto para cada uno de sus campos fuente, excepto cuando tenga número de niveles. Para ello, sólo tiene que cambiar la última línea de código a :

    devolver valor2 * 3

..para pisos de 3 m de altura..

Tal vez no sea la solución más suave, pero creo que debería funcionar.

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