Registro de cambios para QGIS 3.4 LTR

image0

La primera versión a largo plazo (LTR) de QGIS 3. QGIS 3.4 recién lanzado. Después de cinco lanzamientos de puntos de consolidación (3.4.5), reemplazará el LTR anterior en los repositorios de paquetes en febrero de 2019 (ver:ref:calendario de lanzamientos<QGIS-release-schedule>). Este es un gran avance para el proyecto: nuestro primer lanzamiento a largo plazo basado en la plataforma 3.x. Para los usuarios que pasan de la LTR 2.18, hay una gran lista de nuevas funcoinalidades y cambios impactantes en esta nueva versión de LTR. Tenga en cuenta que los complementos 3.x son incompatibles con los complementos 2.x, por lo tanto, revise cuidadosamente su uso de complementos y, si es posible, ayude a migrar los complementos antiguos a la nueva plataforma. Si aún no lo ha hecho, eche un vistazo a los registros de cambios de la:ref:Versión 3.0<changelog30> y:ref:Versión 3.2<changelog32> para comprender el alcance total de los cambios en la versión 3.4.

Gracias

Nos gustaría agradecer a los desarrolladores, documentadores, evaluadores y a todas las personas que ofrecen su tiempo y esfuerzo como voluntarios (o financian a las personas que lo hacen). ¡Desde la comunidad de QGIS esperamos que disfrutes este lanzamiento! Si desea donar tiempo, dinero o involucrarse de otra manera para hacer QGIS más asombroso,QGIS ¡vaya a qgis.org y eche una mano!

QGIS es apoyado por donantes y miembros de apoyo. Puede ver una lista actual de donantes que han realizado contribuciones financieras grandes y pequeñas para el proyecto en nuestra:ref:lista de donantes<list_of_donors>. Si desea convertirse en miembro oficial de sostenimiento, visite:ref:nuestra página de miembros de apoyo<QGIS_sustaining_memberships> para obtener más detalles. El soporte de QGIS nos ayuda a financiar nuestras seis reuniones mensuales de desarrolladores, mantener la infraestructura del proyecto y financiar los esfuerzos de corrección de errores. A continuación se proporciona una lista completa de los seguidores actuales. ¡Muchas gracias a todos nuestros soportes!

QGIS es un software libre y no tiene obligación de pagar nada para usarlo - de hecho, queremos motivar a las personas a lo largo y ancho para que lo usen, independientemente de cuál sea su estado financiero o social - creemos que empoderando a las personas con herramientas para la toma de decisiones espacial dara como resultado una mejor sociedad para toda la humanidad.

image1

General

Prestación: Flatpak

QGIS ahora está disponible como una aplicación flatpak en flathub Flatpak (anteriormente xdg-app) es una utilidad de software para implementación de software, administración de paquetes y virtualización de aplicaciones para Computadoras de escritorio Linux. Permite a los usuarios instalar diferentes versiones de QGIS en Linux sin tener que volver a compilar o usar Docker. Es un paquete completo con todas las bibliotecas incluidas, y utiliza sus propias ubicaciones de perfil de usuario. Por lo tanto, necesitará algo de espacio en disco y nuevos hábitos para trabajar con flatpak, ¡pero es genial!

image28

Esta prestación fue fundada por Aleix Pol

Esta prestación fue desarrollada por Aleix Pol

Prestación: Archivos SVG pueden ser embebidos en proyectos y símbolos

Permite imágenes SVG para simbología, etiquetas, etc para ser directamente embebidas en un archivo de proyecto (o estilo QML, o plantilla impresa QPT!) mediante codificación del SVG como una cadena estádar base64.

Adicionálmente, archivos embebidos pueden ser extraidos de proyectos y símbolos y grabados de nuevo a archivos SVG basada en disco.

Esta prestación fue fundada por SMEC/SJ

Esta prestación fue desarrollada por Nyall Dawson

Prestación: aceleración basada en OpenCL

Esta prestación fue fundada por QGIS.org

Esta prestación fue desarrollada por Alessandro Pasotti

Expresiones

Prestación: Nuevas funciones de expresión y variables

Muchas nuevas funciones de expresión han sido añadidas en QGIS 3.4. Estas incluyen muchas funciones manejables con las que trabajar y manipular matrices y objetos de mapa(diccionario).

  • json_to_map: Convierte un valor de cadena codificado JSON en un objeto de tipo mapa (diccionario)
  • map_to_json: Convierte un objeto de tipo mapa (diccionario) en un valor de cadena codificado JSON
  • hstore_to_map: Convierte un valor de hstore en un objeto de tipo mapa (diccionario)
  • map_to_hstore: Convierte un objeto de tipo mapa (diccionario) en un valor hstore
  • array_foreach : Recorre una matriz y ejecuta una expresión en cada elemento de la matriz, devolviendo una nueva matriz que contiene cada valor calculado
  • array_filter : Filtra una matriz de acuerdo con una expresión
  • raster_value: Devuelve un valor muestreado de una capa ráster en un punto especificado
  • to_dms: Convierte un valor numérico en una cadena formateada en grados, minutos y segundos
  • to_dm: Convierte un valor numérico en una cadena formateada en grados y minutos
  • line_substring: Devuelve la parte de la geometría de una línea (o curva) que se encuentra entre las distancias de inicio y fin especificadas (medidas desde el principio de la línea). Los valores Z y M se interpolan linealmente de los valores existentes.
  • generate_series(start,stop,step): Crea una matriz que contiene una secuencia de números.

Además, algunas nuevas variables también se han puesto a disposición para su uso dentro de las expresiones QGIS:

  • @canvas_cursor_point: Contiene un valor de punto que representa la posición actual del cursor del mouse dentro del lienzo del mapa principal
  • @map_layers: Contiene una matriz de todas las capas que son visibles dentro del mapa.
  • @map_layer_ids: Contiene una matriz de todos los ID de capa para capas visibles dentro del mapa

image2

Esta prestación fue desarrollada por Etienne Trimaille, Matteo Ghetta, Matthias Kuhn, Mathieu Pellerin, Nyall Dawson

Prestación: Autocompletado de código para el generador de expresiones

Autocompletado de código en el editor de expresiones.

  • Las variables, los nombres de funciones y los nombres de campo se proponen e insertan automáticamente al escribir expresiones
  • Los parámetros de la función se muestran al llenarlos

image3

Esta prestación fue fundada por OPENGIS.ch

Esta prestación fue desarrollada por Matthias Kuhn (OPENGIS.ch)

Herramientas de Mapa

Prestación: Identificar o seleccionar entidades basadas en un polígono existente

A menudo es útil seleccionar/identificar entidades que están cerradas por un polígono existente. Para esto, los usuarios pueden usar las herramientas «Seleccionar entidades por polígono» e «Identificar entidades por polígono», pero fue necesario rastrear manualmente el polígono de interés. Esta nueva función permite al usuario hacer clic derecho en el mapa y elegir una entidad de polígono existente en esa ubicación desde el menú emergente: ese polígono se usará como entrada para la selección o identificación.

image4

Esta prestación fue fundada por Leicestershire County Council

Esta prestación fue desarrollada por Peter Petrik (Lutra Consulting)

Interfaz de Usuario

Prestación: Auto selección de archivos exportados en el administrador de archivos

Cada vez que un elemento de la barra de mensajes se vincula a un archivo creado (por ejemplo, después de exportar un diseño o capa de mapa), el enlace ahora abrirá directamente la carpeta que contiene este archivo dentro del navegador de archivos del sistema operativo y preseleccionará el archivo creado. ¡Es un atajo súper práctico que acelera las operaciones de archivo después de una exportación desde QGIS!

image5

Esta prestación fue fundada por North Road

Esta prestación fue desarrollada por Nyall Dawson (North Road)

Prestación: Nueva opción «Abrir >Directorio» para proyectos deshabilitados en la página de bienvenida

Esta nueva opción de click-derecho en el menu contextual para entradas deshabilitadas en la página de bienvenida permite a los usuarios abrir la ruta existente cerrada a la localización del proyecto original en su administrador de archivos, para ayudar a reubicar proyectos faltantes/movidos/renombrados.

Esta prestación fue fundada por North Road

Esta prestación fue desarrollada por Nyall Dawson (North Road)

Prestación: Mejoras UX para Capas temporales Scratch

Las capas temporales Scratch en QGIS pueden ser muy útiles cuando se necesita una capa «desechable», como cuando se procesan previamente los datos en varios pasos. Sin embargo, pueden ser una trampa para usuarios desinformados que pueden no darse cuenta de que el contenido de la capa se perderá permanentemente cuando se cierre el proyecto QGIS actual. En consecuencia, se ha agregado un nuevo ícono indicador que aparece junto a cualquier capa temporal scratch en el árbol de capas, lo que deja en claro de inmediato qué capas son temporales solamente.

También es mucho más fácil hacer la transición de estas capas temporales a formatos permanentes basados en disco. Puede hacer clic en el nuevo icono indicador o seleccionar «Hacer permanente» en el menú contextual de la capa. QGIS solicitará una ubicación para guardar la capa temporal y luego la reemplazará en su lugar (manteniendo la misma ID de capa, estilo, configuración de formulario, etc.).

image6

Esta prestación fue fundada por North Road

Esta prestación fue desarrollada por Nyall Dawson (North Road)

Prestación: Mejoras en el administrador de tareas

El widget del administrador de tareas QGIS (que se muestra en la barra de estado cada vez que se ejecuta una tarea en segundo plano) ahora muestra un tiempo estimado restante y el tiempo de finalización para las tareas en segundo plano de larga ejecución. Este tiempo estimado de llegada se calcula utilizando una interpolación lineal simple basada en el tiempo transcurrido de la tarea y el progreso actual, y permite a los usuarios saber si solo tienen tiempo para preparar un café instantáneo en la cocina de la oficina o dar una vuelta a la manzana a por un café hecho por un buen barista antes de que se complete esa larga tarea de procesamiento …

Además, QGIS utiliza los mecanismos de informes de progreso del sistema operativo estándar en más plataformas y ocasiones en QGIS 3.4. Algunas tareas de ejecución prolongada (que no se ejecutan en segundo plano), como las exportaciones de atlas, ahora muestran su progreso a través del mecanismo del sistema operativo y arrojan notificaciones útiles de finalización.

Esta prestación fue fundada por North Road

Esta prestación fue desarrollada por Nyall Dawson (North Road)

Prestación: Mejoras del administrador de estilos

El cuadro de diálogo Administrador de estilo QGIS (que permite a los usuarios configurar y administrar sus propias bibliotecas de símbolos y rampas de color) ahora se abre de forma no modal, por lo que ahora se puede usar junto con la ventana principal de QGIS (al igual que el cuadro de diálogo Administrador de diseño y el Diseñador de diseño de impresión ventanas).

También hemos mejorado la vista previa de los símbolos dentro del Muelle de Estilos de Capa, agregando una opción para cambiar entre una vista de icono grande y una vista de lista detallada de símbolos. Al pasar el cursor sobre los símbolos (¡y los colores!) Ahora se muestra una vista previa grande del símbolo. Finalmente, hemos creado listas de símbolos más amigables con alta resolución.

Esta prestación fue fundada por North Road

Esta prestación fue desarrollada por Nyall Dawson (North Road)

Prestación: pulido de la Interfaz y experiencia de panel de navegador

Se realizaron toneladas de trabajo para esta versión para mejorar la interfaz de usuario y la experiencia del panel del navegador, incluidas las correcciones de HiDPI, las mejoras del conjunto de datos vectoriales/ráster comprimidos y un conjunto de iconos actualizado.

También se ha agregado funcionalidad, incluida la capacidad de crear un nuevo directorio directamente desde el menú contextual del navegador. El navegador ahora también muestra una gama más completa de opciones para las conexiones de SQL Server, que coinciden con las opciones que ya estaban disponibles para otras conexiones de bases de datos.

image8

Esta prestación fue desarrollada por Mathieu Pellerin (iMHere Asia), Nyall Dawson (North Road)

Prestación: Gráfico QML y widget de dibujos

En QGIS 3.4 se ha agregado un nuevo tipo de widget de formulario de capa vectorial para mostrar elementos gráficos atractivos e interactivos como gráficos o dibujos técnicos en el formulario de atributos. El widget tiene una configuración flexible, que incluye plantillas de ejemplo y soporte de expresión.

image9

Esta prestación fue fundada por QGIS Project

Esta prestación fue desarrollada por David Signer and Matthias Kuhn (OPENGIS.ch)

Simbología

Prestación: Estilizado de capa de malla

  • Agregar conjuntos de datos a la capa de malla desde el panel de propiedades
  • Panel de información y fuente en el panel de propiedades
  • Selección del conjunto de datos activo (propiedades o panel de estilo)
  • Estilo de contornos/escalares (propiedades o panel de estilo)
  • Estilo del marco de malla (propiedades o panel de estilo)
  • Diseño de flechas vectoriales (propiedades o panel de diseño)

Esta prestación fue fundada por Lutra Consulting

Esta prestación fue desarrollada por Peter Petrik (Lutra Consulting)

Prestación: Exportación e Importación parcial QML

Al exportar e importar estilos hacia y desde archivos .qml, ahora es posible seleccionar un subconjunto de secciones. Esto permite guardar y restaurar partes de una configuración de capa mientras se omiten otras. Por ejemplo, es posible exportar solo la simbología de una capa y al importar este archivo de estilo QML a una capa, cualquier configuración en los formularios y widgets u otras propiedades no se ve afectada. También es posible manejar solo secciones individuales de un estilo cuando se usa copiar/pegar.

image10

Esta prestación fue fundada por qwat group

Esta prestación fue desarrollada por Denis Rouzaud (OPENGIS.ch GmbH)

Digitalizando

Prestación: Mejoras en el rastreador GPS

QGIS 3.4 extiende el soporte de rastreo GPS incorporado, agregando parámetros de «intervalo de adquisición» y «umbral de distancia». Estas opciones se pueden usar para mantener el cursor estacionario cuando el receptor está en condiciones estáticas.

Esta prestación fue fundada por Andrea Rossi

Esta prestación fue desarrollada por Andrea Rossi

Prestación: Mayor elección de ángulos en el muelle de digitalización avanzada

Se han añadido opciones para permitir pinzar a 5/10/15/18/22.5 grados en el modo de construcción.

image11

Esta prestación fue fundada por lbartoletti

Esta prestación fue desarrollada por lbartoletti

Prestación: Herramienta vértices puede trabajar solo en la capa actual

El nuevo vértice es mucho más productivo ahora. Puede mover vértices de todas las capas editables a la vez, lo cual es excelente para preservar la topología de capas cruzadas. Sin embargo, en muchos casos, muchos de nosotros no queremos modificar todas las capas a la vez. Agregamos una variación de la herramienta de mapa de vértices solo para eso.

image12

Esta prestación fue fundada por Oslandia

Esta prestación fue desarrollada por Paul Blottiere (Oslandia)

Prestación: Añadir herramientas de mapa de línea inversa

¡Una característica muy esperada! ¡No más complementos o algoritmos externos para invertir la dirección de una línea!

image13

Esta prestación fue fundada por OSLANDIA

Esta prestación fue desarrollada por Loïc Bartoletti

Prestación: Precisión geométrica

Las capas vectoriales tienen una opción de configuración de precisión. La precisión define cuán precisa se debe guardar la ubicación de los nodos. Cada nodo de geometrías nuevas o editadas se ajusta a una cuadrícula de esta resolución. Mientras se digitaliza, se muestra la cuadrícula para guiar al usuario.

image14

Esta prestación fue fundada por Kanton Solothurn

Esta prestación fue desarrollada por Matthias Kuhn (OPENGIS.ch)

Prestación: Borrar automáticamente nodos duplicados

Al agregar o editar geometrías en una capa vectorial, QGIS puede eliminar automáticamente nodos duplicados de las geometrías. Esta opción es configurable en la pestaña de digitalización de capas vectoriales.

Esta prestación fue fundada por Kanton Solothurn

Esta prestación fue desarrollada por Matthias Kuhn (OPENGIS.ch)

Prestación: Verificar la validez geométrica

Se puede verificar la validez de cada geometría nueva o editada si esta opción está activada. Esto permite comunicarse de forma transparente con un usuario cuando hay geometrías erróneas producidas por la sesión de edición actual.

image15

Esta prestación fue fundada por Kanton Solothurn

Esta prestación fue desarrollada por Matthias Kuhn (OPENGIS.ch)

Prestación: Pruebas de topología mientras se edita

Las comprobaciones de topología se pueden activar en una capa. En geometrías recién agregadas y editadas, se pueden ejecutar comprobaciones de topología. Las verificaciones se ejecutarán cuando se guarde la capa o al hacer clic en el botón de verificación de topología en el panel de validación de geometría.

Las siguientes pruebas están disponibles:

  • Huecos
  • Superposiciones
  • Vértices perdidos en polígonos vecinos

Esto se basa en la funcionalidad del complemento de comprobación de geometría implementado por Sourcepole.

image16

Esta prestación fue fundada por Kanton Solothurn

Esta prestación fue desarrollada por Matthias Kuhn (OPENGIS.ch)

Administración de datos

Prestación: Traducción de proyectos QGIS

Al igual que QGIS y los complementos, los proyectos se traducen con el proceso de traducción Qt. Significa que realiza la traducción de acuerdo con un archivo fuente de traducción compilado Qt (archivo .qm). Cuando el usuario abre un proyecto, QGIS busca un archivo .qm que se encuentre en la misma carpeta que el archivo .qgs, que tenga el mismo nombre que el archivo .qgs y que tenga el idioma -code como postfix del idioma de los usuarios (el idioma configurado en la configuración de QGIS). Para crear la traducción, en la configuración del proyecto, hay una opción para generar el archivo .ts, que puede ser editado por programas como Qt Linguist o Transifex.

Mas información en este blog

Esta prestación fue fundada por QGIS Usergroup Switzerland and QGEP Project

Esta prestación fue desarrollada por David Signer (OPENGIS.ch)

Prestación: Cambiar el modo de acoplamiento de la tabla de atributos bajo demanda

Se ha agregado un botón a la barra de herramientas de la Tabla de atributos para cambiar entre el modo acoplado y el modo de ventana a pedido. Anteriormente, los usuarios tenían que cambiar una opción en el cuadro de diálogo de configuración y abrir una nueva tabla para cambiar entre el modo acoplado/desacoplado, pero eso es doloroso si decide después que una tabla ya está abierta que desea acoplarla/desacoplarla. …!

image17

Esta prestación fue fundada por North Road

Esta prestación fue desarrollada por Nyall Dawson (North Road)

Prestación: Nuevo filtro de localización para buscar en todas las capas

Se ha agregado un nuevo filtro de localización que permite a los usuarios buscar en todas las capas de su proyecto, por la expresión de visualización de la capa.

El filtro se puede activar utilizando el prefijo “af” o convirtiéndolo en una búsqueda predeterminada a través de las opciones de QGIS -> Localizador -> Características en toda la capa. Las expresiones de visualización se definen en las propiedades de la capa vectorial en la pestaña de visualización. Las capas individuales se pueden marcar como no buscables en el cuadro de diálogo Propiedades del proyecto, en la pestaña Orígenes de datos.

image18

Esta prestación fue fundada por Opengis.ch

Esta prestación fue desarrollada por Denis Rouzaud

Prestación: Capas no borrables(requeridas) resaltadas en el árbol de capas

Se muestra un nuevo icono indicador «bloqueado» para cualquier capa marcada como «requerida» dentro del proyecto actual. Este icono brinda a los usuarios comentarios instantáneos de que una capa en particular no se puede eliminar del proyecto.

Las capas requeridas se configuran a través del cuadro de diálogo Propiedades del proyecto, pestaña Orígenes de datos.

image19

Esta prestación fue fundada por Arpa Piemonte (Dipartimento Tematico Geologia e Dissesto) dentro del proyecto ERIKUS

Esta prestación fue desarrollada por Martin Dobias (Lutra Consulting) y Faunalia

Prestación: Agregar capa ráster a un Geopackage existente

Mientras salvamos una capa ráster a una base de datos de GeoPackage, ahora es posible adjuntar la capa a un archivo existente.

image20

Esta prestación fue fundada por Borys Jurgiel

Esta prestación fue desarrollada por Borys Jurgiel

Widgets y Formularios

Prestación: Formularios Drill-Down(en cascada) en Widgets de Relación de Valores

Nuevas funciones y lógica en los «Widgets de relación de valor» de QGIS, permiten la implementación de filtros complejos y dinámicos dentro de los formularios de atributos QGIS. La funcionalidad se puede utilizar para implementar formularios de «desglose» dentro de QGIS, donde los valores disponibles en un campo dependen de los valores de otros campos:

image21

Esta prestación fue fundada por QGIS community through crowd-funding

Esta prestación fue desarrollada por Alessandro Pasotti (with North Road)

Compositor de Mapa

Prestación: Elementos de Mapa 3D

Esta prestación permite a los usuarios añadir su vista de mapa 3D a la impresora de diseño.

image22

Esta prestación fue fundada por QGIS community through crowd-funding

Esta prestación fue desarrollada por Lutra Consulting

Procesamiento

Prestación: Nuevo modo «Edit in place»

Gracias a una gran cantidad de generosos patrocinadores, un modo de «edición in situ» financiado mediante crowdfunding se agregó a Processing para 3.4. Cuando una capa vectorial está activa y es editable, este modo permite a los usuarios ejecutar algoritmos adecuados directamente en las entidades de la capa, modificando sus atributos y geometrías en el lugar. Todas las ediciones se agregan al «búfer de edición» de la capa, para que pueda deshacer y rehacer fácilmente los cambios antes de guardarlos nuevamente en la fuente de datos.

Para aquellos usuarios avanzados que realizan ediciones de datos frecuentes, esta funcionalidad también se expone a través de la «Barra de localización» de QGIS 3.0 (esa barra de «escritura para ubicar» que se encuentra en la esquina inferior izquierda). Si escribe ‘ef’ («funciones de edición») seguido del nombre de la operación correspondiente, podrá realizar las ediciones directamente a través del teclado. P.ej.

  • Seleccione un montón de características de línea
  • Presione Ctrl+K (activa la barra de localización)
  • Escriba «ef reverse»
  • Presione enter - ¡las entidades de línea seleccionadas serán invertidas inmediatamente!

image23

Esta prestación fue fundada por Campaña de Crowdfunding

Esta prestación fue desarrollada por North Road

Prestación: Almacenar modelos dentro del proyecto

Algunos modelos de procesamiento están tan intrínsecamente vinculados a la lógica dentro de un proyecto en particular que no tienen significado (o están totalmente rotos) fuera de ese proyecto (por ejemplo, modelos que dependen de la presencia de capas de mapa, relaciones, etc.). En consecuencia, desde QGIS 3.4, los modelos de procesamiento se pueden almacenar dentro de los archivos de proyecto QGIS. Todos los modelos almacenados dentro de un proyecto estarán disponibles tan pronto como se abra ese proyecto. Esto también evita abarrotar al proveedor de modelos «globales» con modelos que no tienen sentido, y facilita la distribución de un solo proyecto con todos los modelos relevantes incluidos.

Los modelos se almacenan dentro de los proyectos haciendo clic en el nuevo botón «Incrustar en el proyecto» en la barra de herramientas del diálogo Modelador. Los modelos se pueden eliminar de un proyecto desde el menú contextual del modelo en la caja de herramientas.

Esta prestación fue fundada por North Road

Esta prestación fue desarrollada por Nyall Dawson (North Road)

Prestación: Muestra de valores ráster

Un nuevo algoritmo se ha añadido para muestreo de valores de capas ráster en ubicaciones puntuales.

image24

Esta prestación fue fundada por Faunalia

Esta prestación fue desarrollada por Matteo Ghetta (Faunalia)

Prestación: Nuevo algoritmo «Raster pixels to polygons»

Este algoritmo convierte una capa ráster en una capa vectorial, con una entidad de polígono correspondiente a cada píxel del ráster y un único campo que contiene el valor de banda del ráster.

Esta prestación fue fundada por SMEC/SJ

Esta prestación fue desarrollada por Nyall Dawson

Prestación: algoritmo de agrupamiento K-Means

QGIS 3.4 agrega un algoritmo nativo de «agrupación de k-means». Basado en un puerto de la función ST_ClusterKMeans de PostGIS, este algoritmo agrega un nuevo campo de ID de clúster a un conjunto de entidades de entrada que identifica el clúster de la característica en función de un enfoque de agrupación de k-means. Si se utilizan geometrías sin puntos como entrada, la agrupación se basa en el centroide de las geometrías de entrada.

Esta prestación fue fundada por North Road

Esta prestación fue desarrollada por Nyall Dawson (North Road)

Prestación: algoritmo de agrupación espacial dbscan

Este nuevo algoritmo nativo implementa una aproximación optimizada de agrupación por barrido basado en la densidad DBSCAN para agrupar entidades puntuales 2D.

Esta prestación fue fundada por North Road

Esta prestación fue desarrollada por Nyall Dawson (North Road)

Prestación: Algoritmos mejorados

Algunas mejoras diversas a algoritmos existentes de procesamiento incluyen:

  • El algoritmo «Dirección inversa de línea» ahora funciona con entradas de geometría MultiLineString
  • Extender líneas: añadido soporte para distancias inicial y final dinámicas (definidos por datos)
  • Compensación de líneas: soporte para compensación dinámica de distancia
  • Los algoritmos Unir por valor de campo y Unir por localización ahora puede exportar opcionalmente registros no coincidentes
  • «Unir por valor de campo*: tambien informa recuentos de entidades coincidentes/no coincidentes

Esta prestación fue fundada por North Road

Esta prestación fue desarrollada por Nyall Dawson (North Road)

Prestación: Algoritmos para filtrar vértices por M y filtrar vértices por Z

Se agregaron dos nuevos algoritmos para filtrar vértices de línea/polígono por sus valores M o Z. Se puede ingresar un valor M/Z mínimo y máximo, y si los vértices caen fuera de estos rangos, se descartarán de la geometría de salida. Los valores de filtro mínimo y máximo también se pueden definir con datos, por lo que pueden variar según la entidad.

Esta prestación fue fundada por North Road

Esta prestación fue desarrollada por Nyall Dawson (North Road)

Prestación: algoritmos «matriz de entidades trasladadas»

Este nuevo algoritmo crea copias de entidades en una capa, creando múltiples versiones trasladadas (desplazamiento) de una entidad. Cada copia es desplazada por una pequeña cantidad en el eje x/y/z/m.

Esta prestación fue fundada por North Road

Esta prestación fue desarrollada por Nyall Dawson (North Road)

Prestación: Algoritmo de «matriz de líneas de desplazamiento» (paralelas)

Este nuevo algoritmo crea copias de una entidad lineal en una capa, mediante la creación de múltiples versiones paralelas de cada entidad. Cada copia es desplazada en una distancia preestablecida.

Esta prestación fue fundada por North Road

Esta prestación fue desarrollada por Nyall Dawson (North Road)

Prestación: Elección de unidades para distancias no graduadas/desconocidas

Cuando un algoritmo tiene un parámetro de distancia en metros/pies/etc (p.ej. distancias no geográficas), se ha añadido un combo box permitiendo elegir el tipo de unidad.

(QGIS no expone esto (y no debería nunca) para distancias en grados; depende de los usuarios en esta situación elegir una proyección local adecuada y reproyectar sus datos para que coincidan).

Esta prestación fue fundada por North Road

Esta prestación fue desarrollada por Nyall Dawson

Prestación: Algoritmos «solapar características a z/m»

Estos dos nuevos algoritmos pueden establecer el vértice z o m de una geometría a valores muestreados desde una banda ráster. Los valores se pueden escalar opcionalmente usando un valor de escala (definido por datos).

Esta prestación fue fundada por North Road

Esta prestación fue desarrollada por Nyall Dawson (North Road)

Prestación: Algoritmo «pixels de ráster a puntos»

Un nuevo algoritmo «pixels a puntos» fue añadido en QGIS 3.4, el cuál crea una entidad de punto en el centro de cada pixel. pixels sin datos son omitidos.

Esta prestación fue fundada por North Road

Esta prestación fue desarrollada por Nyall Dawson (North Road)

Prestación: algoritmo de subcadena de línea

Este nuevo, muy solicitado, algoritmo devuelve la porción de una línea (o curva) que cae dentro de las distancias inicial y final (medida desde el comienzo de la línea). Los valores Z y M son interpolados linealmente desde valores existentes.

Esta prestación fue fundada por North Road

Esta prestación fue desarrollada por Nyall Dawson (North Road)

Prestación: Algoritmo «interpolar punto en línea»

Este nuevo algorimto crea una geometría puntual interpolada a una distancia fija en la geometría lineal (o límite de polígono). Son completamente admitidas entradas de geometrías curvas. Valores Z o M son linealmente interpoladas a partir de valores existentes.

Esta prestación fue fundada por North Road

Esta prestación fue desarrollada por Nyall Dawson (North Road)

Prestación: casco cócavo k-vecino

Esta prestación fue fundada por https://qgis.org

Esta prestación fue desarrollada por Detlev Neumann, Rudi von Staden

Prestación: Las secuencias de comandos de Python que implementan algoritmos ahora ejecutan el algoritmo al arrastrar y soltar y al hacer doble clic en el navegador

Cuando sea apropiado, los scripts ahora iniciarán un diálogo de algoritmo de procesamiento cuando:

  • Arrastrar y soltar un script de Python en la ventana principal
  • Uso de la acción de ejecutar script del panel derecho del panel del navegador

image25

Esta prestación fue fundada por iMhere Asia

Esta prestación fue desarrollada por Mathieu Pellerin

Prestación: Nuevo algoritmo de reordenamiento de banda de GDAL

Se agregó un nuevo algoritmo “Reorganizar banda” del proveedor GDAL a la caja de herramientas de procesamiento. El algoritmo permite generar rásteres que continúan un subconjunto de las bandas de un ráster de entrada dado y ofrece la posibilidad de reordenar las bandas.

image26

Esta prestación fue fundada por iMHere Asia

Esta prestación fue desarrollada por Mathieu Pellerin

Prestación: Valores «Precalculados» para los parámetros del algoritmo del modelo

Una nueva opción está presente para todos los parámetros de uso de una «expresión precalculada». Esta expresión se evalúa una vez antes de que el algoritmo hijo se ejecute y se use durante la ejecución de ese algoritmo.

Esta prestación fue fundada por QGIS

Esta prestación fue desarrollada por Nyall Dawson (North Road)

Prestación: algoritmo para «Categorizar una capa usando un archivo de estilo XML»

Este nuevo algoritmo ajusta el renderizado de una capa vectorial a un renderizado categorizado utilizando símbolos coincidentes de una base de datos de estilos.

Se utiliza una expresión especificada (o nombre de campo) para crear categorías para el renderizador, con QGIS creando una categoría para cada valor único dentro de la capa. Cada categoría se corresponde individualmente con los símbolos que existen dentro de la base de datos de estilo XML QGIS especificada. Siempre que se encuentre un nombre de símbolo coincidente, el símbolo de la categoría se establecerá a este símbolo coincidente.

La coincidencia no distingue entre mayúsculas y minúsculas de forma predeterminada, pero se puede distinguir entre mayúsculas y minúsculas si es necesario. Opcionalmente, los caracteres no alfanuméricos tanto en el valor de la categoría como en el nombre del símbolo se pueden ignorar mientras se realiza la coincidencia. Esto permite una mayor tolerancia al combinar categorías con símbolos.

Si lo desea, también se pueden generar tablas que contengan listas de las categorías que no pueden coincidir con los símbolos y símbolos que no coinciden con las categorías.

image27

Esta prestación fue fundada por North Road

Esta prestación fue desarrollada por Nyall Dawson (North Road)

Prestación: Nuevo algoritmo de modo para pinzar geometrías

El nuevo modo «Ajustar a los nodos de anclaje (solo una capa)» asegura que cualquiera de los dos vértices de la capa vectorial estén al menos a la distancia dada por el valor umbral.

Este algoritmo es útil cuando se realizan operaciones de superposición de vectores como intersección, unión o diferencia para evitar posibles errores topológicos causados por errores numéricos si las coordenadas están muy cerca una de la otra. Después de ejecutar el algoritmo, algunas geometrías previamente válidas pueden volverse inválidas y, por lo tanto, puede ser útil ejecutar el algoritmo Fix geometries después.

Esta prestación fue fundada por InaSAFE DFAT

Esta prestación fue desarrollada por Martin Dobias (Lutra Consulting)

Proveedores de datos

Prestación: complemento de método de autenticación OAuth2

  • Soporta código de autenticación, implícito y propietario del recurso de concesión del flujo
  • Permite par conexiones preconfiguradas, lectura para localizaciones por defecto
  • Ofrece almacenamiento en caché de la toma de acceso más allá de los reinicios de QGIS
  • Guardar/cargar configuraciones

Esta prestación fue fundada por Monsanto Company

Esta prestación fue desarrollada por Larry Shaffer, Alessandro Pasotti

Prestación: capa de malla: Nuevo soporte de formato de capa de malla

Las capas de malla representan datos en una cuadrícula de tamaño variable con componentes adicionales (por ejemplo, tiempo y vector). Con la introducción de MDAL, los usuarios pueden cargar los siguientes formatos directamente en QGIS y explorar todos los demás componentes:

  • GRIB
  • XMDF
  • Netcdf

image29

Esta prestación fue fundada por Lutra Consulting

Esta prestación fue desarrollada por Lutra Consulting

Prestación: capa de malla: añadir función para identificar valores en capas de malla

Con esta API, los desarrolladores pueden inspeccionar elementos de malla y obtener valores espacial y temporalmente. Como ejemplo, puede crear un diagrama de series de tiempo desde su capa de malla.

image30

Esta prestación fue fundada por Lutra Consulting

Esta prestación fue desarrollada por Lutra Consulting

Prestación: capa de malla: permitir elegir diferentes dataset vectoriales y escalares

Una capa de malla a menudo contiene varias cantidades. Por ejemplo, un netcdf/grib puede contener varias cantidades meteorológicas. Cada cantidad también puede tener múltiples componentes. Por ejemplo, los datos del viento pueden contener velocidad (escalar) y valores (cuadrícula). Con esta opción, puede superponer escalares y cuadrículas de diferentes cantidades. En la imagen a continuación, puede ver la temperatura (cuadrícula) y el viento (escalar).

image31

Esta prestación fue fundada por Lutra Consulting

Esta prestación fue desarrollada por Lutra Consulting

Prestación: capa de malla: permitir representar vectores/flechas en la cuadrícula definida por el usuario

Los datos escalares se generan generalmente en el centro/esquina de cada elemento de malla. Al mostrar los datos escalares, las flechas pueden verse dispersas y, a menudo, no es posible ver la tendencia general. Con esta opción, las flechas se pueden mostrar en una cuadrícula definida por el usuario. Los valores escalares adicionales se interpolarán sobre la marcha y se colocarán en la cuadrícula definida por el usuario.

image32

Esta prestación fue fundada por Lutra Consulting

Esta prestación fue desarrollada por Lutra Consulting

Prestación: soporte tipos JSON/JSONB

Se admite la lectura de los tipos JSON de PostgreSQL. Los datos JSON se pueden mostrar en los widgets como «Clave/Valor» (mapas), como «Lista» (matrices) o como texto.

image33

Esta prestación fue fundada por Kanton Solothurn

Esta prestación fue desarrollada por David Signer (OPENGIS.ch)

Prestación: soporte de autenticacion token de Esri

Se ha agregado soporte al sistema de autenticación de QGIS para la autenticación basada en token temporal de ESRI. Esto permite la conexión a ArcGIS Feature and Map Servers a través de un token temporal asignado.

Esta prestación fue desarrollada por Nyall Dawson (North Road)

Prestación: SQL Server - manejo de geometrías inválidas

Las versiones recientes de QGIS han cambiado a un enfoque más seguro para leer las capas de SQL Server, que comprueba automáticamente la validez de la geometría y repara las geometrías cuando sea necesario. Esta solución alternativa es necesaria para evitar problemas con el diseño del manejo de la geometría de SQL Server, donde encontrar filas con geometrías no válidas puede anular silenciosamente una solicitud sin devolver todas las características de una capa. Desafortunadamente, la solución tiene un costo de rendimiento significativo.

En QGIS 3.4 se agregó una nueva configuración para permitir a los usuarios desactivar manualmente el manejo de geometría no válida de SQL Server de QGIS. Al activar la opción «Omitir manejo de geometría no válida» en las propiedades de una conexión de SQL Server, QGIS omite todo el costoso proceso de validación de geometría, pero asume firmemente la responsabilidad de garantizar que todas las características de la base de datos tengan geometrías válidas de nuevo sobre el usuario / administrador de la base de datos. . ** Esta es una configuración de «uso bajo su propio riesgo». Habilitar esta opción de forma incorrecta puede provocar la pérdida de funciones y la pérdida de datos.

Esta prestación fue desarrollada por Nyall Dawson (North Road)

Servidor QGIS

Prestación: La caché del servidor se puede administrar mediante complementos

De forma predeterminada, QGIS Server solo almacena en la memoria caché el documento WMS GetCapabilities. Con la implementación de WMTS, es necesario tener una forma de almacenar en caché las teselas. Pero el administrador de caché no se ha desarrollado solo para almacenar en caché teselas.

El complemento del administrador de caché se puede usar para almacenar en caché:

  • WMS, WFS, WCS, WMTS GetCapabilities documentos
  • WFS DescribeFeatureType documentos
  • WCS DescribeCoverage documentos
  • WMTS GetTile imagenes
  • WMS GetLegendGraphic imagenes

Aquí hay una clase de administrador de caché de Python, que no verifica si el proyecto QGIS ha cambiado:

class PyServerCache(QgsServerCacheFilter):

    """ Used to have cache control """

    def __init__(self, server_iface):
        super(QgsServerCacheFilter, self).__init__(server_iface)

        self._cache_dir = os.path.join(tempfile.gettempdir(), "qgs_server_cache")
        if not os.path.exists(self._cache_dir):
            os.mkdir(self._cache_dir)

        self._tile_cache_dir = os.path.join(self._cache_dir, 'tiles')
        if not os.path.exists(self._tile_cache_dir):
            os.mkdir(self._tile_cache_dir)

    def getCachedDocument(self, project, request, key):
        m = hashlib.md5()
        paramMap = request.parameters()
        urlParam = "&".join(["%s=%s" % (k, paramMap[k]) for k in paramMap.keys()])
        m.update(urlParam.encode('utf8'))

        if not os.path.exists(os.path.join(self._cache_dir, m.hexdigest() + ".xml")):
            return QByteArray()

        doc = QDomDocument(m.hexdigest() + ".xml")
        with open(os.path.join(self._cache_dir, m.hexdigest() + ".xml"), "r") as f:
            statusOK, errorStr, errorLine, errorColumn = doc.setContent(f.read(), True)
            if not statusOK:
                print("Could not read or find the contents document. Error at line %d, column %d:\n%s" % (errorLine, errorColumn, errorStr))
                return QByteArray()

        return doc.toByteArray()

    def setCachedDocument(self, doc, project, request, key):
        if not doc:
            print("Could not cache None document")
            return False
        m = hashlib.md5()
        paramMap = request.parameters()
        urlParam = "&".join(["%s=%s" % (k, paramMap[k]) for k in paramMap.keys()])
        m.update(urlParam.encode('utf8'))
        with open(os.path.join(self._cache_dir, m.hexdigest() + ".xml"), "w") as f:
            f.write(doc.toString())
        return os.path.exists(os.path.join(self._cache_dir, m.hexdigest() + ".xml"))

    def deleteCachedDocument(self, project, request, key):
        m = hashlib.md5()
        paramMap = request.parameters()
        urlParam = "&".join(["%s=%s" % (k, paramMap[k]) for k in paramMap.keys()])
        m.update(urlParam.encode('utf8'))
        if os.path.exists(os.path.join(self._cache_dir, m.hexdigest() + ".xml")):
            os.remove(os.path.join(self._cache_dir, m.hexdigest() + ".xml"))
        return not os.path.exists(os.path.join(self._cache_dir, m.hexdigest() + ".xml"))

    def deleteCachedDocuments(self, project):
        filelist = [f for f in os.listdir(self._cache_dir) if f.endswith(".xml")]
        for f in filelist:
            os.remove(os.path.join(self._cache_dir, f))
        filelist = [f for f in os.listdir(self._cache_dir) if f.endswith(".xml")]
        return len(filelist) == 0

    def getCachedImage(self, project, request, key):
        m = hashlib.md5()
        paramMap = request.parameters()
        urlParam = "&".join(["%s=%s" % (k, paramMap[k]) for k in paramMap.keys()])
        m.update(urlParam.encode('utf8'))

        if not os.path.exists(os.path.join(self._tile_cache_dir, m.hexdigest() + ".png")):
            return QByteArray()

        img = QImage(m.hexdigest() + ".png")
        with open(os.path.join(self._tile_cache_dir, m.hexdigest() + ".png"), "rb") as f:
            statusOK = img.loadFromData(f.read())
            if not statusOK:
                print("Could not read or find the contents document. Error at line %d, column %d:\n%s" % (errorLine, errorColumn, errorStr))
                return QByteArray()

        ba = QByteArray()
        buff = QBuffer(ba)
        buff.open(QIODevice.WriteOnly)
        img.save(buff, 'PNG')
        return ba

    def setCachedImage(self, img, project, request, key):
        m = hashlib.md5()
        paramMap = request.parameters()
        urlParam = "&".join(["%s=%s" % (k, paramMap[k]) for k in paramMap.keys()])
        m.update(urlParam.encode('utf8'))
        with open(os.path.join(self._tile_cache_dir, m.hexdigest() + ".png"), "wb") as f:
            f.write(img)
        return os.path.exists(os.path.join(self._tile_cache_dir, m.hexdigest() + ".png"))

    def deleteCachedImage(self, project, request, key):
        m = hashlib.md5()
        paramMap = request.parameters()
        urlParam = "&".join(["%s=%s" % (k, paramMap[k]) for k in paramMap.keys()])
        m.update(urlParam.encode('utf8'))
        if os.path.exists(os.path.join(self._tile_cache_dir, m.hexdigest() + ".png")):
            os.remove(os.path.join(self._tile_cache_dir, m.hexdigest() + ".png"))
        return not os.path.exists(os.path.join(self._tile_cache_dir, m.hexdigest() + ".png"))

    def deleteCachedImages(self, project):
        filelist = [f for f in os.listdir(self._tile_cache_dir) if f.endswith(".png")]
        for f in filelist:
            os.remove(os.path.join(self._tile_cache_dir, f))
        filelist = [f for f in os.listdir(self._tile_cache_dir) if f.endswith(".png")]
        return len(filelist) == 0

Y la forma de agregarlo al administrador de caché del servidor QGIS.

servercache = PyServerCache(server_iface) server_iface.registerServerCache(servercache, 100)

Esta prestación fue fundada por Ifremer

Esta prestación fue desarrollada por 3Liz

Prestación: soporte WMTS 1.0.0

QGIS Server 3.4 es compatible con el estándar WMTS 1.0.0 OGC.

En las propiedades del proyecto QGIS, el usuario puede definir:

  • qué parte del proyecto (todos los proyectos, grupos de capas o capas) debe publicarse a través del estándar WMTS
  • la escala mínima de teselas

El servidor QGIS reutiliza el CRS definido en el WMS para WMTS.

Para administrar la memoria caché de teselas, QGIS Server debe instalar y cargar un complemento QGIS Server con una clase QgsServerCacheFilter.

image34

Esta prestación fue fundada por Ifremer

Esta prestación fue desarrollada por 3Liz

Prestación: Admite registros del servidor QGIS en stderr

Ahora es posible configurar QGIS Server para que escriba sus registros en stderr. Esto se hace estableciendo QGIS_SERVER_LOG_FILE env var en el valor especial «stderr».

Esta prestación fue fundada por OSLANDIA

Esta prestación fue desarrollada por Eric Lemoine

Complementos

Prestación: Soporte para zips encriptados en el Administrador de Plugins

El Administrador de Plugins ahora es capaz de instalar plugins desde archivos locales zip incluso si están encriptados.

image35

Esta prestación fue fundada por Borys Jurgiel

Esta prestación fue desarrollada por Borys Jurgiel

Prestación: Edición de GeoPackage fuera de línea

Con la funcionalidad de edición fuera de línea, es posible seleccionar si la exportación debe crear un archivo SpatiaLite o GeoPackage para uso fuera de línea.

Esta prestación fue fundada por Oester Messtechnik

Esta prestación fue desarrollada por David Signer (OPENGIS.ch)

Programabilidad

Prestación: QgsSpatialIndexKDBush

Un índice espacial estático muy rápido para puntos 2D basado en un árbol KD plano, utilizando https://github.com/mourner/kdbush.hpp

En comparación con QgsSpatialIndex, este índice: - solo admite entidades de un solo punto (sin multipuntos) - es estático (las entidades no se pueden agregar o eliminar del índice después de la construcción) - ¡es mucho más rápido! - admite búsquedas verdaderas «basadas en la distancia», es decir, devolver todos los puntos dentro de un radio desde un punto de búsqueda

Esta prestación fue fundada por North Road

Esta prestación fue desarrollada por Nyall Dawson (North Road)

Prestación: QgsRasterDataProvider:: método de prueba para un muestreo eficiente de rásteres en un punto dado

Esta es una alternativa al método QgsRasterDataProvider::identidad, que es menos eficiente pero más potente

Esta prestación fue fundada por North Road

Esta prestación fue desarrollada por Nyall Dawson (North Road)

Prestación: Nueva llamada de API de geometría para devolver una subcadena de curva

Se ha agregado la nueva API PyQGIS para facilitar la recuperación de una subcadena de una geometría LineString/Curve:

QgsCurve::curveSubstring - Devuelve una nueva curva representando una subcadena de una curva, desde una distancia inicial a una final.

Si hay valores z o m, la salida z y m se interpolarán utilizando los valores z o m de los vértices existentes. El método también maneja geometrías curvas sin pérdida o segmentación.

Esta prestación fue fundada por North Road

Esta prestación fue desarrollada por Nyall Dawson (North Road)

Prestación: cambios en el Módulo sip de la API

Debido a los cambios ascendentes dentro de la biblioteca PyQt/sip, la forma recomendada de importar este módulo ha cambiado en QGIS 3.4. Para una portabilidad máxima, en lugar de llamar directamente: `` import sip`` complementos deberían usar: from qgis.PyQt import sip El uso de esta importación de estilo más reciente garantizará que el código funcione correctamente en todas las plataformas y siga siendo funcional en futuras Versiones de QGIS.

Prestación: Proveedores de datos vectoriales de Python

Desarrollo de la API, un proveedor de muestras y pruebas que permiten la creación de un proveedor de datos vectoriales en Python puro.

image36

Esta prestación fue fundada por Good will

Esta prestación fue desarrollada por Alessandro Pasotti

Prestaciones 3D

Prestación: navegación mejorada

Esto actualizará el centro de visualización de la cámara a medida que la cámara se mueve. Antes el centro de la vista estuba siempre en la elevación cero, lo que significa que con un terreno más alejado de la elevación cero, la inclinación y la rotación de la cámara se sentirían raras debido a que el punto central está muy lejos.

Permite mover la cámara arriba/abajo usando las teclas page up/page down

Mover cámara manteniendo la posición con Ctrl+cursores de dirección/ratón

image37

Esta prestación fue fundada por QGIS community through crowd-funding

Esta prestación fue desarrollada por Martin Dobias (Lutra Consulting)

Prestación: Animación

Puede crear una animación basada en un conjunto de fotogramas clave: posiciones de la cámara en momentos particulares. QGIS 3D luego interpola las posiciones/rotaciones de la cámara entre los fotogramas clave.

Para crear los fotogramas clave, primero configure la escena para su mapa, girando, haciendo zoom o moviendo la cámara. Luego asigne un tiempo al marco. Existen varios métodos para las interpolaciones entre fotogramas clave.

image38

Esta prestación fue fundada por QGIS community through crowd-funding

Esta prestación fue desarrollada por Martian Dobias (Lutra Consulting)

Prestación: Renderizado Simple de cadenas lineales 3D

Este modo de representación de líneas 3D utilizará la representación de líneas OpenGL en lugar de almacenar las líneas en polígonos y representarlas como mallas.

La ventaja es que las líneas 3D no pierden su coordenada Z, que es el caso actualmente con la representación 3D «ordinaria» después del almacenamiento en búfer.

La desventaja es que las líneas no pueden ser anchas (admitidas en Qt3D solo desde 5.10, pero incluso así su renderización no tendrá buenas combinaciones/finalizaciones) y solo se utiliza el color ambiental del material.

image39

Esta prestación fue fundada por Lutra Consulting

Esta prestación fue desarrollada por Martin Dobias (Lutra Consulting)

Prestación: Herramienta de Identificación en Mapa para vistas 3D

Una nueva herramienta de Identificación fue introducida para mapas 3D. Usando esta herramienta, puede inspeccionar entidades desde la escena 3D.

image40

Esta prestación fue fundada por Department of Environment, Land and Infrastructure Engineering (DIATI)

Esta prestación fue desarrollada por Martin Dobias (Lutra Consulting) y Faunalia

Prestación: API Experimental de Python

Algunas clases de QGIS 3D se han puesto a disposición de los desarrolladores de Python. Ahora es posible consultar o cambiar los renderizadores 3D de las capas del mapa y las propiedades de lectura/escritura de los símbolos 3D contenidos, como los colores de los materiales. Tenga en cuenta que, por ahora, la API se considera experimental, por lo que puede cambiar en futuras versiones 3.x.

Esta prestación fue fundada por Lutra Consulting

Esta prestación fue desarrollada por Martin Dobias (Lutra Consulting)