9 votos

¿Crear una etiqueta con el formato " 1.000' " a partir de un campo numérico?

Esta pregunta se basa en una pregunta anterior que encontré en gis.stackexchange: ¿Cómo editar fácilmente los datos de los atributos mediante expresiones regulares?

¿Quizás alguien pueda indicarme la dirección correcta?

Tengo un shapefile vectorial de curvas de nivel. En la tabla de atributos ya he convertido un campo llamado FEET que consiste en datos enteros que contienen valores de elevación a un campo de cadena llamado Label. Además, he añadido con éxito un ' al final de la cadena para que cuando los datos se etiqueten se lean como pies.

Lo siguiente que estoy intentando hacer es insertar una coma entre los dos primeros valores de la cadena sólo si la longitud de la cadena es mayor que 4, o sea que sólo aparecerá una coma entre los dígitos de miles y centenas en el campo Etiqueta. La longitud tiene que ser mayor que 4 porque también estoy contando los '

Mi código hasta ahora es:

case when  length( "Label") >4  then regexp_replace( "Label", '^([0-9])+([0-9]{3}\')$','$1 , $2') else "Label" end

sin embargo la función regexp_replace no parece aceptar las variables de grupo $1 $ 2 en el tercer parámetro de la función.

He mirado http://docs.python.org/2/library/re.html ya que el regex de la calculadora de campos se basa, según tengo entendido, en el uso de regex de python, pero no he podido averiguarlo. Tal vez lo que estoy tratando de hacer no es posible todavía con esta función en la calculadora de campo en QGIS 1.8 en mac OSX. O más bien mi sintaxis es incorrecta ya que soy un programador novato y algo nuevo en las expresiones regulares.

0 votos

¿Tiene que ser codificado - no sería una manera simple de (en Excel, o similar) crear una nueva columna que tenía la etiqueta en ella formados como usted quería - todo lo que tendría que utilizar es un comando de concatenación pocos.

0 votos

Sí, esa sería una forma de resolver el problema, sin embargo estoy tratando de resolverlo desde dentro de QGIS o con python.

0 votos

@chrishenrick - ¿te ha resuelto mi respuesta?

9voto

Ken J Puntos 116

QGIS ha creado una función llamada format_number para abordar esto. Simplemente format_number(12345,0) para conseguir 12,345 .

0 votos

Son buenas noticias. Aunque parte de mi pregunta tiene que ver con añadir un ' al final del número para representar "pies". ¿Podría hacer lo siguiente en QGIS con esta función? format_number(12345,0) + "'"

0 votos

Creo que la respuesta sería concat(tostring(format_number(12345,0)), "'") . Primero tendría que convertir el número formateado en una cadena utilizando la función tostring y luego utilizar la función concat para adjuntar el ' al final.

0 votos

Tiene sentido, esto es lo que publiqué en mi respuesta anterior y funcionó: concat( format_number( "Field_name" , 0) , '\'')

8voto

user16381 Puntos 21

Usando dos funciones de cadena en la calculadora de QGIS en la versión 2.6 de Mac OS X pude lograr esto. Aquí están los pasos:

  1. Usando la calculadora de campos cree un nuevo campo que sea de tipo cadena con un ancho relevante.

  2. Ejecute la siguiente expresión para establecer el valor del campo:
    concat( format_number( "Field_name" , 0) , '\'')

Esto creó una columna con una cadena formateada como yo quería, así que por ejemplo el número 2000 tendría el siguiente formato 2,000' con la parte final ' que significa pies.

3voto

ravenspoint Puntos 8840

En QGIS, la función "format_number" del menú de cadenas de la calculadora de campos reformatea los números con separadores y decimales específicos de la localidad.

0 votos

Ver mi comentario en la respuesta de Minh Mai.

3voto

Puedes hacer la agrupación de dígitos fácilmente en Python. Aquí hay una función que he utilizado, que creo que encontré en StackOverflow:

def digitgroup(n, sep = ','):
    if n == "": n = 0
    s = str(n)[::-1]
    groups = []
    i = 0
    while i < len(s):
        groups.append(s[i:i+3])
        i += 3
    return sep.join(groups)[::-1]

0 votos

Gracias por la sugerencia, dmahr. Sin embargo, no tengo claro cómo implementar esta función en QGIS. He intentado cortar y pegar esta función en la expresión de la calculadora de campo y establecer n a mi nombre de campo, pero sin suerte. ¿Existe una forma de implementar el scripting de python en QGIS fuera de la calculadora de campo?

1voto

Marc Puntos 230

Es un poco más complicado que eso en QGis. Según este artículo En este caso, tienes que crear tu propia definición de función en Python, y luego importarla a QGis (esto puede hacerse automáticamente al iniciar). ¡Esto puede parecer complicado, pero sólo tienes que hacerlo una vez y siempre estará ahí!

Esta es la función que utilicé, basada en la de dmahr arriba. No estoy seguro de cómo trata las cadenas, ya que he modificado un poco el código.

from qgis.utils import qgsfunction
from qgis.core import QGis

@qgsfunction(2, "Python") # number of arguments
def thousands_separator(values, feature, parent): # values are the arguments passed in
    # this is the documentation for your function which you will see in QGis
    """
    Adds a separator to values over 1000\n        
    Parameters: (n, sep) \n                   
    n = expression_field \n
    sep = desired separator (default is ",")
    """ 
    number = values[0]                        # the first argument (which in the
    separator = values[1]                     # labelling case is a field name
    if separator == '':
        separator = ','
    s = str(number)[::-1]
    groups = []
    i = 0
    while i < len(s):
        groups.append(s[i:i+3])
        i += 3
    return separator.join(groups)[::-1]

A continuación, guarda eso en .qgis/python, importa el archivo en QGis usando la consola, entonces aparecerá en las funciones "Python" en la herramienta de etiquetas.

La expresión que he utilizado es miles_comma( "[nombre_campo]" ,',')

0 votos

Además, no he visto qué versión estás usando - deberías actualizar a la 2.0 para que esto funcione

0 votos

Hola, gracias y perdón por la tardanza en la respuesta. Estoy en la v2.6 Mac OS X 10.9.5 ¿Dónde coloco exactamente el archivo python? Supongo que en algún lugar de /Applications/QGIS.app/Contents/Resources/python/ ?

0 votos

Vea mi respuesta más abajo para una solución mucho más simple. Sin embargo, no sé qué versión se necesita para que funcione.

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