Bienvenidos al Blog de la Comunidad Argentina de GvSIG

La idea de esta Blog es reunir a los usuarios, desarrolladores, interesados y recursos en Argentina del Proyecto GvSIG

martes, 7 de marzo de 2017

Aprende a programar en gvSIG en media hora




Aprende a programar en gvSIG en media hora

Es frecuente que desde la Asociación gvSIG impartamos talleres de scripting en las diversas jornadas gvSIG que se realizan alrededor del mundo. Y es interesante asistir a estos talleres de “observador” porque permite ver como entran alumnos sin ningún conocimiento de programación en gvSIG Desktop y salen con la base necesaria para poder comenzar a desarrollar sus propios scripts en la aplicación.
Ese es uno de los objetivos principales del scripting, dar a todo tipo de usuarios -no necesariamente programadores- un mecanismo para que de forma muy sencilla puedan desarrollar aplicaciones o herramientas sobre gvSIG Desktop.
¿Tan, tan sencillo como para aprender scripting en media hora?
Ese es el reto que nuestro compañero de la Asociación gvSIG, Óscar Martínez, se ha planteado con el webinar que realizamos en la Universidad Miguel Hernández y del que ahora tenéis disponible el vídeo.
Reservad media hora de vuestro tiempo y seguid leyendo...

domingo, 5 de marzo de 2017

gvSIG nominado a la máxima categoría de los premios “Sharing & Reuse Awards” que otorga la Comisión Europea



by Alvaro
Como dice el titular de este post, la trayectoria del proyecto gvSIG ha sido reconocida por la Comisión Europa con la nominación a la máxima categoría de los premios denominados “Sharing & Reuse Awards”.
El director general de Tecnologías de la Información y las Comunicaciones, Vicente Aguiló, ha anunciado hoy que “el proyecto gvSIG de la Generalitat ha sido seleccionado por la Comisión Europea como finalista para competir por el premio Mejor Solución Transfronteriza de software libre”, en la primera edición de los Sharing & Reuse Awards.
El proyecto gvSIG competirá en la categoría de mayor proyección, la internacional, junto a otras tres propuestas finalistas. Un total de 17 proyectos han sido finalmente nominados por la Comisión, tras haber evaluado 118 propuestas, provenientes de todos los rincones de la Unión Europea, para las categorías de internacional o transfronteriza, nacional, regional y local.
El Ejecutivo comunitario ha creado los premios Sharing & Reuse Awards en reconocimiento a la modernización de las Administraciones Públicas en Europa, mediante el desarrollo de soluciones de Gobierno electrónico que puedan ser reutilizadas por otras organizaciones, gracias al uso de software libre.
El resultado final se anunciará el próximo 29 de marzo en Lisboa, en el marco de la Sharing & Reuse Conference 2017, que lleva por lema “Resolviendo juntos el rompecabezas TI europeo”. Al margen del resultado, estar ya entre los 4 proyectos nominados es todo un reconocimiento al proyecto gvSIG y a todo lo que ha construido a su alrededor.
El evento, en su primera edición, reunirá a la comunidad internacional de expertos en software libre y administración pública, así como representantes de las instituciones europeas, para debatir sobre las ventajas de compartir y reutilizar soluciones informáticas en el sector público.sharing_awards
La Dirección General de Tecnologías de la Información y las Comunicaciones (DGTIC) presentará el proyecto gvSIG en la conferencia de Lisboa, junto al resto de propuestas finalistas, procedentes de Alemania, Austria, Bélgica, España, Finlandia, Francia, Grecia, Países Bajos y República Checa.
El titular de Tecnologías de la Información y la Comunicación de la Generalitat ha destacado que “esta nominación supone el reconocimiento a la trayectoria de un proyecto, que se ha desarrollado dentro y fuera de la Administración y que ha convertido a la Comunitat Valenciana en un referente internacional de la geolocalización mediante el uso de software libre”.
Vicente Aguiló ha recordado que “el proyecto se gestó en la Generalitat con la idea de crear un sistema de información geográfica basado en código abierto y, una vez puesto en marcha, fue liberado en manos de una comunidad internacional de desarrolladores que ahora conforman la Asociación gvSIG y de la que formamos parte”.
Podéis consultar toda la información sobre estos premios y proyectos nominados en cada una de las categorías en:
¡Nos vemos en Lisboa!

jueves, 2 de marzo de 2017

Necesitas media hora para aprender gvSIG Desktop

by Alvaro
00_gvsig_mediahora
¿Es complicado aprender a manejar un Sistema de Información Geográfica? No, no lo es. Ese es uno de los mitos que queremos desmontar con este webinar, del que ya tenéis disponible el vídeo, y que os permitirá aprender los conceptos y herramientas fundamentales de un SIG en poco más de media hora. Una vez dado este primer paso ya tendréis tiempo de ir profundizando en todas sus posibilidades.
Nuestro compañero de la Asociación gvSIG, Mario Carrera, os enseñará entre otras cosas a cargar datos vectoriales e imágenes ráster de distintas proyecciones en un proyecto, aplicar leyendas y etiquetados para realizar mapas temáticos, crear nuevas capas desde cero y editarlas tanto de forma gráfica como alfanumérica, realizar geoprocesos y diseñar un mapa.
¿Tenéis ya media hora libre? Pues seguid leyendo...

miércoles, 19 de octubre de 2016

Retransmisión en directo de las 8as Jornadas de Latinoamérica y Caribe de gvSIG

Las sesiones de ponencias de las 8as Jornadas de Latinoamérica y Caribe de gvSIG, que se celebrarán mañana día 20 de octubre en Montevideo (Uruguay), van a ser retransmitidas en directo a través de internet.
La retransmisión se realizará a través del portal de Vera tv desde el siguiente enlace directo.
8as_j_lac_gvsig-streaming
Podéis consultar toda la información sobre el programa en la web de las jornadas.
Si no podéis acudir podréis seguir las presentaciones en directo.
Y si deseáis acudir, y aún no os habéis registrado, podéis hacerlo desde el mismo portal del evento. Hay aforo limitado. ¡No esperéis al final!

lunes, 26 de septiembre de 2016

La prensa destaca el reconocimiento de la NASA a gvSIG



El pasado viernes un articulo del periódico 20 minutos destacaba el reconocimiento de la NASA al trabajo desarrollado por la Asociación gvSIG con el siguiente titular:
La NASA premia a una entidad española por un proyecto de ciudades inteligentes”.
20 minutos, según los últimos datos, se mantiene firme en el segundo puesto de los diarios más leídos de España con cerca de 1 millón de lectores diarios. No es poca cosa.
La noticia completa se puede leer aquí:
Para un proyecto como gvSIG, sin ninguna multinacional detrás, impulsado por una asociación sin ánimo de lucro y dedicado a desarrollar software libre y compartir conocimiento, salir en la prensa generalista siempre es un hito. Una situación que se está produciendo cada vez más en los últimos tiempos, pero que no deja de alegrarnos en cada ocasión que vemos como gvSIG interesa más allá de los círculos especializados. Una señal más de que el trabajo y esfuerzo de las personas que están implicadas en gvSIG tiene sus frutos.
20_nasa_gvsig_2016
Esperemos que este tipo de noticias también ayuden a que nuestras queridas administraciones apuesten por impulsar la geomática en software libre y abandonen la senda de la dependencia tecnológica, por impulsar a las PYMES locales en lugar de hipotecarse con multinacionales cuyos cuarteles generales están a miles de kilómetros de distancia, y en definitiva por apostar por un nuevo modelo productivo que funciona, es viable y tan solo requiere una miras políticas que entiendan que en el S.XXI la tecnología es un sector fundamental.

lunes, 5 de septiembre de 2016

gvSIG 2.3: Insertar nuevos geoprocesos mediante Scripting


post_geo_minComentábamos el otro día la facilidad de generar geoprocesos con la nueva implementación de librerías de Scripting, los cambios respecto a la versión anterior y mostrábamos un ejemplo de geoproceso.
Ahora vamos a ver cómo podemos integrar nuestro geoproceso en la Caja de Herramientas que tiene gvSIG. Esto nos permitirá acceder a ellos de manera sencilla, además de hacer que formen parte de otras herramientas como el Modelizador o su ejecución mediante gvpy.
El ejemplo, que nos podría servir de plantilla para vuestors scripts sería el siguiente:
from gvsig import *
from gvsig import geom
from gvsig.commonsdialog import *

from gvsig.libs.toolbox import *
from es.unex.sextante.gui import core
from es.unex.sextante.gui.core import NameAndIcon

from es.unex.sextante.gui.core import SextanteGUI
from org.gvsig.geoprocess.lib.api import GeoProcessLocator

class GridPol(ToolboxProcess):

  def defineCharacteristics(self):
        """Definir los parametros de entrada y salida de nuestro proceso. """
        # Fijamos el nombre con el que se va a mostrar nuestro proceso
        self.setName("Grid uniforme dentro de poligonos")

        # Indicamos el grupo en el que aparecera
        self.setGroup("Vectorial")

        params = self.getParameters()
        
        # Indicamos que precisamos un parametro LAYER, del tipo poligono y que es obligatorio
        params.addInputVectorLayer("LAYER","Capa de entrada", SHAPE_TYPE_POLYGON, True)
        
        # Indicamos que precisamos una distancia para el grid
        params.addNumericalValue("DISTANCEGRID", "Distancia Grid",0, NUMERICAL_VALUE_INTEGER)
        
        # Y por ultimo indicamos que precisaremos una capa de salida de puntos.
        self.addOutputVectorLayer("RESULT_POINT", "GirdPol_point", SHAPE_TYPE_POINT)

  def processAlgorithm(self):
        """ Esta operacion es la encargada de realizar nuetro proceso. """
        features=None

        try:

            """
            Recogemos los parametros y creamos el conjunto de entidades asociadas a la capa
            de entrada.

            Se obtendran dos capas en la vista con el mismo tipo de datos.
            ** Una capa es la generada por nosotros desde el script
            ** La otra capa es la gestionada a traves de la Toolbox creada en output_store
            
            """
            params = self.getParameters()
            sextantelayer = params.getParameterValueAsVectorLayer("LAYER")
            distancegrid = int(params.getParameterValueAsDouble("DISTANCEGRID"))
    
            # La capa obtenida es de un tipo especial
            # para facilitar gestionamos su store
            store = sextantelayer.getFeatureStore()
            features = store.features()

            ### Capa 1: Gestionada por el script
            sch = createSchema()
            sch.append("GEOMETRY", "GEOMETRY")
            sch.get("GEOMETRY").setGeometryType(geom.POINT, geom.D2)
            shp = createShape(sch)
            

    
            ### Capa 2: Aprovechando las opciones de la Toolbox
            output_store = self.buildOutPutStore(
                    features.getDefaultFeatureType(),
                    SHAPE_TYPE_POINT,
                    "GridP_points",
                    "RESULT_POINT"
              )
              
            # Progress bar
            self.setRangeOfValues(0, features.getSize())
            n = 0
            
            for feature in features:
                # Incrementamos barra progreso
                self.next() 

                # Proceso
                extent = feature.getDefaultEnvelope()
        
                xmin = extent.getMinimum(geom.DIMENSIONS.X)
                xmax = extent.getMaximum(geom.DIMENSIONS.X)
                
                ymin = extent.getMinimum(geom.DIMENSIONS.Y)
                ymax = extent.getMaximum(geom.DIMENSIONS.Y)
        
                rows = int(ymax-ymin) / distancegrid
                cols = int(xmax-xmin) / distancegrid
                
                x = xmin
                y = ymax
                
        
                for i in range(rows+1):
                    if self.isCanceled():
                        break
                    for j in range(cols+1):
                        pt = geom.createPoint2D(x, y)
                        if feature.geometry().contains(pt):
                            # Puntos contenidos en el poligonos
                            # son agregados a la capa

                            ### Capa 1
                            shp.append(GEOMETRY=pt)
    
                            ### Capa 2
                            newfeature = self.createNewFeature(output_store, feature)
                            newfeature["GEOMETRY"] = pt
                            output_store.insert(newfeature)
    
                            
                        x += distancegrid
                    x = xmin
                    y -= distancegrid

            # Capa 1: Agregamos a la Vista activa
            shp.commit()
            currentView().addLayer(shp)
            
            # Capa 2 se encargara la toolbox de gestionarla
            return True
        
        finally:
            DisposeUtils.disposeQuietly(features)
            print "Proceso terminado %s" % self.getCommandLineName()
            return True


def main(*args):
        # Creamos nuesto geoproceso
        process = GridPol()
        # Lo registramos entre los procesos disponibles en el grupo de "Scripting"
        process.selfregister("Scripting")
        
        # Actualizamos el interface de usuario de la Toolbox
        process.updateToolbox()

        msgbox("Incorporado el script '%s/%s/%s' a la paleta de geoprocesos." % (
                "Scripting",
                process.getGroup(),
                process.getName()
          ), 
          "Proceso registrado"
        )
En la primera parte, defineCharacteristics, incluiríamos el aspecto de la interfaz, podríamos añadir los controles necesarios para capturar los parámetros que nuestro script necesite.
En la segunda parte, processAlgorithm, incluiríamos lo que es nuestro script. Para que la Caja de Herramientas gestione nuestras capas de salida a través del módulo de geoprocesamiento y que se integre mejor con el Modelizador o funcione correctamente cuando sea lanzado desde gvpy, tendrá que cumplir ciertos requisitos y ciertas formas a la hora de generar las capas. En este caso he incluido las dos formas de hacerlo en el mismo geoproceso. Si no nos interesan estas opciones extra, el script será el mismo que ya teníamos creado.
Una vez ejecutado nos aparecerá el siguiente mensaje, confirmando que se ha ejecutado correctamente y que es accesible desde la Caja de Herramientas:
post_geo_insertado
Ahora podemos ir a ejecutarlo

post_geo_caja
Si lo ejecutamos accederemos a la interfaz del geoproceso que hemos creado en la parte de defineCharacteristics de nuestra clase:
post_geo_interfaz
Nos aparecerá la ventana de proceso que hemos programado:
post_geo_status
Y obtendremos el resultado esperado:
post_geo_resultado
Vemos que la salida de capas es multiple. Una capa es la gestionada por la Toolbox, la otra es la gestionada por nosotros directamente en el script.
Esta forma de insertar geoprocesos nos añadirá la opción de poder ejecutarlos mediante gvpy en un script similar al siguiente:
# encoding: utf-8

from gvsig import *
from gvsig.libs import gvpy

def main(*args):

        x = gvpy.runalg("GridPol", "pols_example", "10",ADDLAYER=True, NAME="Grid dentro poligono")
O que forme parte de un proceso en el Modelizador:
post_geo_modelizador
Guardamos el modelo y nos aparecerá en la Caja de Herramientas listo para ser usado:
post_geo_modelo
En este caso cogemos la capa poligonal, le aplicamos el proceso explicado anterior y añadimos un desplazamiento de sus puntos, dando como resultado algo similar a:
post_geo_model_resultado
Como veis, no será complicado crear nuestras propias Cajas de Herramientas, totalmente integradas en gvSIG.
Si estáis interesados en el tema o queréis aportar información o recomendaciones, no dudéis en poneros en contacto con nosotros en las Listas de Usuarios o Desarrolladores. Si hay interés seguiremos intentando generar toda la documentación posible para facilitaros las cosas a la hora de generar vuestros geoprocesos.

jueves, 1 de septiembre de 2016

Camino a gvSIG 2.3: Ejemplo de script con la nueva implementación




geo_gridpol2Ayer hablamos de los cambios en las librerías de Scripting, pero nada mejor para ver algunos de ellos que enseñarlos en un ejemplo.
Da la casualidad que nuestro compañero José Guerrero publicó un script para la generación de una malla de puntos uniforme dentro de cada polígono en una capa designada. Cogiendo su script y aplicando algunos cambios, lo transformé para que pueda ser usado en gvSIG.
Vemos que hacemos uso de la nueva implementación que ya explicamos en otro post, algunas funciones han ampliado su funcionalidad, y en general, funciona como lo hacía anteriormente, aunque por debajo todo sea distinto.
Para ejecutar este script solo es necesario tener una Vista abierta con una proyección por ejemplo EPSG:25830 y con una capa de polígonos seleccionada en esa Vista.
Si quieres cargar el script y probarlo por tu cuenta, debes irte a Herramientas - Scripting - Editor de Scripts. Seleccionamos Nuevo arriba a la izquierda, escribimos un nombre para nuestro script y aceptamos. Ya nos saldrá la pantalla en blanco donde copiar y pegar nuestro script. Para ejecutarlo podemos presionar F5.
# encoding: utf-8

from gvsig import currentLayer, currentView, createSchema, createShape
from gvsig import geom

# Basado en: https://joseguerreroa.wordpress.com/2016/08/31/creando-puntos-espaciados
# -regularmente-dentro-de-los-rasgos-features-de-un-vectorial-tipo-poligono-con-pyqgis/

def main(*args):
    """ Crear grid dentro de polionos con una distancia establecida """
    #Distancia entre puntos
    distancegrid = 5

    # Crear nueva capa
    sch = createSchema()
    sch.append("GEOMETRY", "GEOMETRY")
    sch.get("GEOMETRY").setGeometryType(geom.POINT, geom.D2)
    shp = createShape(sch)
    
    layer = currentLayer()
    features = layer.features()
    
    for feature in features:
        extent = feature.getDefaultEnvelope()

        xmin = extent.getMinimum(geom.DIMENSIONS.X)
        xmax = extent.getMaximum(geom.DIMENSIONS.X)
        
        ymin = extent.getMinimum(geom.DIMENSIONS.Y)
        ymax = extent.getMaximum(geom.DIMENSIONS.Y)

        rows = int(ymax-ymin)/distancegrid
        cols = int(xmax-xmin)/distancegrid
        
        x = xmin
        y = ymax

        for i in range(rows+1):
            for j in range(cols+1):
                pt = geom.createPoint2D(x, y)
                if feature.geometry().contains(pt):
                    # Puntos contenidos en el poligonos
                    # son agregados a la capa
                    shp.append(GEOMETRY=pt)
                x += distancegrid
            x = xmin
            y -= distancegrid
            
    shp.commit() # Guardamos
    currentView().addLayer(shp) # Agregamos a la Vista
Como vemos, queda un script bastante sencillo de leer, sin tener que preocuparnos de rutas o similar. Las proyecciones las coge de la Vista.
geo_gridpol1
Podríamos añadir muchas otras mejoras como la de crear una vista nueva cada vez que se ejecute el script para mostrar resultados currentProject().createView("nueva vista"), preguntar por una capa que no estuviera cargada, etc. Iremos sacando más ejemplos en los que mostrar las nuevas funcionalidades.
En el próximo artículo veremos cómo convertir este script en un geoproceso que aparezca en nuestra Caja de Herramientas, de esta forma lo podríamos tener siempre accesible junto al resto de geoprocesos, dotarle de interfaz, incluirlo en el Model Builder y permitiendo otras funcionalidades como su ejecución desde gvpy.
Interesante crear tu propia caja de herramientas ¿verdad?