Asignación de memoria a gvSIG

En los últimos días han vuelto a aparecer por las listas de usuarios de gvSIG mensajes preguntando como y hasta cuanto se puede aumentar la memoria que se reserva gvSIG al arrancar en entornos Microsoft. Independientemente de en que fichero se especifique esto, una tema que sorprende a los usuarios es…

«¿si mi sistema tiene 4Gb de RAM (o más) cómo puede quedarse sin memoria gvSIG?»

El problema viene derivado de que gvSIG es una aplicación de 32bits. Esto quiere decir que por limitaciones de arquitectura de la CPU para la que ha sido desarrollada solo es capaz de acceder a 2^32 bits que son los 4Gb de memoria que puede direccionar un sistema Microsoft de 32 bits. Con esto ya tenemos nuestra primera limitación. En un sistema Microsoft de 32 bits no podremos tener más de 4Gb de RAM, y aunque nuestra máquina tenga más de 4 Gb, el sistema no los reconocerá.

De esos 4 Gb de RAM que puede tener nuestro sistema de 32 bits, el sistema se reserva unos cuantos para diversos usos, por ejemplo: muchas tarjetas gráficas actuales, en lugar de llevar su propia memoria usan parte de la memoria del sistema, así que si la tarjeta de vídeo usa de 512Mb a 1024Mb tendremos que de nuestros 4Gb nos quedaremos solo con 3Gb. Además si tenemos otros dispositivos instalados en el equipo que precisan reservarse parte de la memoria, también los cogerán de esos 4Gb que tenemos, y el propio sistema también precisa usar parte de esa memoria para sus propias tareas, con lo que nos quedaran de 2Gb a 3Gb libres para nuestra aplicación. Sin embargo, parece ser que el sistema solo asigna a las aplicaciones de 32 bits un máximo de 2Gb. Pero de esos 2Gb que pueden ser asignados a nuestra aplicación tampoco podemos asumir que todos los podemos asignar a gvSIG… directamente. En esos 2Gb estará la maquina virtual de java, los recursos java que componen nuestra aplicación, y las librerías nativas y la memoria que estas puedan necesitar. En generan de esos 2Gb, podremos reservar para nuestra aplicación java hasta 1600Mb, ya que el resto lo necesitaremos para la máquina virtual y las librerías nativas, pero si apuramos tanto podemos encontrarnos que en caso de que alguna de las librerías nativas precisen reservar memoria falle la aplicación. así que mejor ser algo conservador y no asignar a nuestra aplicación más de 1400Mb.

Resumiendo… en un sistema Microsoft de 32 bits no podremos asignar a nuestra aplicación java más de 1408Mb aproximadamente.

Y la siguiente pregunta que nos podemos hacer es… Y si tengo un sistema Microsoft con por ejemplo 8Gb ¿puedo tener más memoria en gvSIG?

Pues aunque sea un sistema de 64 bits, y desaparezca la limitación de los 4Gb de RAM, con gvSIG estaremos igual que con un sistema de 32 bits, ya que al no estar preparada la aplicación gvSIG para soportar sistemas de 64 bits, el sistema operativo la ejecuta en modo emulación de 32 bits, estando sujetos a las limitaciones de las aplicaciones de 32 bits.

En gvSIG 2.1 se puede cambiar la memoria desde las Preferencias de la aplicación.

00_memoria

En gvSIG 2.0 si queremos personalizar la memoria que dejamos para nuestra aplicación tendremos que editar el fichero “gvsig-desktop.l4j.ini” que se encuentra en la carpeta en la que hayamos instalado gvSIG. En el nos encontraremos algo como

###############################
# gvSIG runtime configuration #
###############################

# Starting memory
# -Xms128m

# Maximum memory
# -Xmx512m

# Maximum perm space size
# -XX:MaxPermSize=96m

# Disable hardware accelerated java2D drawing through Direct3D 
# -Dsun.java2d.d3d=false

# For Java parameters documentation and more parameters look at:
# http://download.oracle.com/javase/6/docs/technotes/tools/windows/java.html
# http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

# Environment variable expansion is supported, for example:
#-Dsomevar="%SOMEVAR%"

Un valor aceptable para la cantidad máxima de memoria que le damos a la aplicación estará entre 1256Mb y 1408Mb. Para asignarlo modificaremos las lineas:

# Maximum memory
-Xmx1408m

Espero que haya servido esta pequeña explicación.

Un saludo
Joaquin

Posted in gvSIG Desktop, spanish | Tagged , | 10 Comments

8as Jornadas. Generando Futuro: Tecnología, Solidaridad y Negocio.

Ya tenemos aquí, por fin, las 8as Jornadas internacionales de gvSIG en Valencia, que este año vienen con el lema de “Generando Futuro: Tecnología, Solidaridad y Negocio”

Pero, ¿Qué tiene que ver esto de la solidaridad con la tecnología y con el negocio? Bueno, seguro que responderá a una de esas acciones de marketing social que quedan tan bien en la foto pero que detrás no hay nada, sólo bla, bla, bla.

Y es que todo el mundo sabe que esto de la solidaridad no tiene nada que ver con la tecnología, claro salvo que estemos hablando de la cosa esta de las ONG’s. Pero y ¿Con el negocio? ¿Con la economía? Venga va, ¿Qué tiene que ver la solidaridad con la economía salvo que no sea para hacer propaganda? Nada, absolutamente nada. Todo el mundo sabe que esto de la economía, los negocios, el asunto de los dineros no tiene nada que ver con la solidaridad, esa es una palabra que queda para la celebración de algún día de estos de dudosa utilidad de la ONU. O de un día de esos que sacan a pasear a los niños de los colegios para hablar de unas cosas que han de saber cuando crezcan, cuando se hagan mayores, que no tiene nada que ver con la vida real, si no quieren estos niños que los tomen por tontos cuando se conviertan en adultos, claro está.

Seguro que estas sabias palabras nos las diría cualquiera de esos sabios responsables de las finanzas, sean de los bancos, sean de las agencias de calificación o sean de los gobiernos de Europa, del FMI, del Banco Mundial o de cualquiera de esa combinación de siglas de los que sí que saben.

Esos que nos quieren vender como lógico y normal que el progreso científico y la cada vez mayor especialización y profesionalización, toda esa capacidad de producir cada vez más sea para tener menos. ¿Menos? Bueno, menos derechos económicos y sociales, pero en algunas cosas más. Más paro, más empresas -pequeñas y medianas- que se ven obligadas a cerrar y más incertidumbre.

Llevamos mucho tiempo escuchando y lo que es peor, sufriendo las recetas de estos que sí que saben y que seguro que se burlarán de nosotros si les decimos que creemos que la Solidaridad ha de ser un valor fundamental que oriente tanto el desarrollo científico como el económico.

Los que nos sigan desde hace tiempo sabrán que en gvSIG siempre hablábamos de un nuevo modelo de desarrollo y de producción que nos permitiera producir más, mejor y de una manera más justa. Un modelo donde la solidaridad sustituyera a la rivalidad. Y que para construir este nuevo modelo había que atender a nuevas ideas, a nuevos esquemas, de lo contrario, querer construir un nuevo modelo atendiendo a los antiguos esquemas nos llevaría al más estrepitoso de los fracasos.

Ahora más que nunca se hace necesario hablar de ese nuevo modelo. No sólo de utilizar software libre si no de adoptar sus valores de colaboración y conocimiento compartido. De sustituir el individualismo por la solidaridad, y que sea ésta la que oriente el desarrollo científico y la economía. Que el mundo de los negocios responda a una ética y a unos valores diferentes de los actuales.

Vivimos un presente que de seguir con la actual evolución nos dibuja un futuro poco halagüeño. Pero el futuro no está escrito, las acciones que tomemos ahora determinarán un futuro u otro, y el que nos gustaría tener es uno muy distinto del que nos están presentando.

Reivindicamos la solidaridad como valor. Las 8as jornadas internacionales de gvSIG llevan por lema Generando Futuro: Tecnología, Solidaridad y Negocio. Y la Solidaridad como argumento principal.

Posted in events, gvSIG Association, opinion, press office, spanish | Leave a comment

i3Geo y la Asociación gvSIG unen fuerzas

Ver em Português · Read in English

Como dice el título de este post, i3Geo y gvSIG unen sus fuerzas, una colaboración que se basa en formas similares de entender el software libre como algo que va más allá de cuestiones técnicas. En este primer post queremos presentar una primera visión de qué es i3Geo.

El software i3Geo fue creado por el Ministerio de Medio Ambiente (MMA) de Brasil, alrededor de 2004, en el contexto de la implantación del Sistema Nacional de Información sobre Medio Ambiente (SINIMA). En 2006 se cambió su licencia a GPL, y pasó a formar parte del Portal de Software Público Brasileño (PSPB).

La idea principal era crear un software que permitiese la diseminación de datos geográficos y que diese opciones más avanzadas al usuario final, pero sin limitar las opciones básicas de navegación, que era lo común en el software existente en el momento. Además, el software debía funcionar por completo en web, evitando la necesidad de plugins y aprovechando las librerías libres ya existentes, para no “reinventar la rueda”. Estos principios están bien marcados en el nombre de i3Geo, que significa “Interfaz Integrada para Internet de Herramientas de Geoprocesamiento”.

Actualmente i3Geo opera de forma integrada, pero no exclusivamente, con las APIs OpenLayers, Google Maps y Google Earth para generar el cuerpo principal del mapa, y como YUI para la construcción de los componentes de la interfaz. El software ha ido evolucionando, integrándose nuevas funcionalidades, tratando de explotar al máximo el potencial del software Mapserver y las facilidades de los navegadores web más modernos.

Además de las funciones tradicionales de navegación, el software permite al usuario acceder a la tabla de atributos de las capas, cargar datos, conectarse a servicios OGC, cambiar la leyenda por defecto de las capas, interactuar con otros datos (Wikipedia, Confluence, Metar, etc), digitalizar vectores, y mucho más.

Desde el punto de vista de administrador de un portal, i3Geo organiza la información disponible para los usuarios en un catálogo con cantidad de temas diferentes, basados en datos locales o en servicios OGC. El administrador define cómo mostrar cada tema y los organiza en árboles jerárquicos de grupos y subgrupos, que luego se muestran en el mapa visualizado por el usuario.

Basado en este catálogo, i3Geo ofrece servicios de acceso directo, como de descarga, WMS, WFS, KML y KMZ, facilitando la implantación de IDEs.

Esta estructura de los datos llevó también a la integración de i3Geo con gvSIG de dos maneras. En primer lugar, un plugin que permite que el mismo catálogo se muestre dentro de gvSIG para incluir las capas en el proyecto, es decir, que la misma organización de los datos se visualiza en el mapa interactivo en la web y en un proyecto de gvSIG. En segundo lugar, una clase de PHP que permite que los proyectos de gvSIG sean leídos por i3Geo, funcionando como una aplicación de escritorio para crear mapas que serán publicados en la web.

En conclusión, la integración entre la comunidad i3Geo y la comunidad gvSIG traerá oportunidades de crecimiento para ambas, y más allá de la proximidad técnica, los principios que guían el desarrollo de los dos software son los mismos. El software es el conocimiento en forma de código, y el conocimiento es un patrimonio de la sociedad que lo construye, y no debe beneficiar solo a algunos, sino a todos.

i3Geo e a Associação gvSIG unem forças

Como diz o título desse post, i3Geo e gvSIG unem forças, uma colaboração que se baseia em formas similares de entender o software livre como algo que vai além das questões técnicas. Para todos que nos conhecem, neste post pretendemos apresentar uma primeira visão do que é o i3Geo.

O software i3Geo foi criado pelo Ministério do Meio Ambiente (MMA) do Brasil por volta de 2004 no contexto da implantação do Sistema Nacional de Informações sobre Meio Ambiente (SINIMA). Em 2006 foi licenciado como GPL e passou a fazer parte do Portal do Software Público Brasileiro (PSPB).

A idéia principal foi construir um software que permitisse disseminar dados geográficos e que desse opções mais avançadas ao usuário final, sem se limitar apenas as operações básicas de navegação, o que era comum nos softwares existentes na época. Além disso, o software deveria funcionar totalmente na web, evitando-se ao máximo a necessidade de plugins e aproveitando as bibliotecas livres já existentes, para não se “reinventar a roda”. Esses princípios estão bem marcados no nome i3Geo, que significa “Interface Integrada para Internet de Ferramentas de Geoprocessamento”.

Atualmente o i3Geo opera de forma integrada, mas não exclusiva, com as APIs OpenLayers, Google Maps e Google Earth para a geração do corpo principal do mapa e com a YUI para construção dos componentes da interface. Com a evolução do software muitas funcionalidades foram integradas, procurando-se explorar ao máximo o potencial do software Mapserver e das facilidades dos navegadores para internet mais modernos.

Além das funções tradicionais de navegação, o software permite que o usuário acesse a tabela de atributos das camadas, faça upload de dados, conecte-se com serviços OGC, altere a legenda “default” das camadas, interaja com outros dados (Wikipedia, Confluence, Metar, etc), digitalize vetores e muito mais.

Do ponto de vista do administrador de um site, o i3Geo organiza os dados disponíveis aos usuários em um catálogo com infinitos diferentes temas, baseados em dados locais ou em serviços OGC. O administrador define a forma de visualização de cada tema e os organiza em árvores hierárquicas de grupos e subgrupos, que são então mostradas no mapa que é visto pelo usuário.

Com base nesse catálogo, o i3Geo oferece serviços de acesso direto, como download, WMS, WFS, KML e KMZ, facilitando a implantação de IDEs.

Essa estruturação dos dados levou também à integração do i3Geo com o gvSIG de duas maneiras. Primeiro, um plugin permite que o mesmo catálogo seja visualizado dentro do gvSIG para incluir camadas ao projeto, ou seja, a mesma organização dos dados é vista no mapa interativo na web e em um projeto gvSIG. Segundo, uma classe PHP permite que projetos gvSIG sejam lidos pelo i3Geo, funcionando como uma aplicação desktop para a criação de mapas que serão publicados na web.

Concluindo, a integração entre a comunidade i3Geo e a comunidade gvSIG trará oportunidades de crescimento para ambas, sendo que além da proximidade técnica, os princípios que norteiam o desenvolvimento dos dois softwares são os mesmos. Software nada mais é que conhecimento na forma de código e conhecimento é um patrimônio da sociedade que o constrói e não deve beneficiar apenas alguns, mas sim todos.

i3Geo and the gvSIG Association join forces

As the title of this post says, i3Geo and gvSIG join their forces, a collaboration based on similar ways to understand the open source as something that goes beyond technical questions. At this first post, we want to present a first view about what i3Geo is.

i3Geo was created by the Environment Ministry (MMA) in Brazil, about 2004, in the context of the implementation of the National Information System about Environment (SINIMA). Its license was changed to GPL in 2006, and it became a part of the Brazilian Public Software Portal (PSPB).

The main idea was to create a software that allowed the dissemination of geographical data and gave more advanced options to the final user, but without limiting the navigation basic options, that were the common tools in the software existing at the moment. Furthermore, the software should work completely on web, avoiding the need of plugins and making the most of the existing free libraries, for not reinventing the wheel. These principles are marked on the name of i3Geo, that means “Geoprocessing Tools Integrated Interface for Internet”.

Currently i3Geo operates in an integrated way with the OpenLayers, Google Maps and Google Earth APIs to generate the main part of the layout, but not exclusively, and as YUI for the construction of the components of the interface. The software has evolved, adding new functionalities, trying to make the most of the Mapserver software and the eases of the more modern web browsers.

Apart from the traditional navigation functionalities, the software allows the user to access to the atribute table of the layers, load data, connect to OGC services, change legend by default, interact withother data (Wikipedia, Confluence, Metar, etc.), digitalize vectors, and much more.

From the point of view of a portal administrator, i3Geo organizes the information available for users in a catalog with lots of different layers, based on local data or OGC services. The administrator defines how to show every layer and organize them in hierarchical trees of groups and subgroups, that are shown in the map visualized by the user later.

Based on this catalog, i3Geo offers direct access services like downloads, WMS, WFS, KML and KMZ, making the implementation of SDIs easy.

This data structure took to the integration of i3Geo with gvSIG in two ways too. Firstly with a plugin that allows to the same catalog to be shown in gvSIG to include the layers in the project, that is to say that the same organization of the data is shown in the interactive layout in the website and in a gvSIG project. Secondly, a PHP class that allows the projects to be read by i3Geo, workink as a desktop application to create maps that will be published in the website.

In short, the integration between the i3Geo and gvSIG communities will bring growth opportunities for both of them, and beyond the technical proximity, the principles that guide the development of the two softwares are the same. The software is the knowledge in a code way, and the knowledge is a patrimony of the society that build it. It musn’t benefit only to some people but all of them.

Posted in i3Geo, opinion, portuguese, spanish | Tagged | Leave a comment

Quiero desarrollar cosas con la versión 2.0 de gvSIG ¿por dónde empiezo?

El otro día se me acercó un compañero a ver si podía orientarle sobre por dónde podía empezar si quería contribuir de alguna manera al desarrollo de gvSIG 2.0. Me quede pensando un momento y le pregunté….

¿Pero qué quieres hacer?

Después me di cuenta que él mismo no tenía muy claro realmente qué es lo que quería hacer. Quería empezar a hacer algo con la versión 2 de gvSIG pero no tenía nada claro aun el qué.

Hay bastante documentación sobre cómo desarrollar con y para la versión 2.0 de gvSIG, pero todos los que se acercan se plantean…

¿Por dónde empiezo?

En general al acercarse al desarrollo con o para la versión 2.0 de gvSIG podemos identificar tres escenarios:

  • Contribuir al núcleo de gvSIG
  • Contribuir a un proyecto que no forma parte del núcleo de gvSIG
  • Creación de plugins propios

Para simplificar aquí he utilizado el termino “núcleo de gvSIG” aunque realmente tendría que hablar del “workspace principal de gvSIG”, pero de momento nos quedaremos con lo de núcleo de gvSIG.

Lo primero que haría sería empezar por leer, y probablemente seguir, la Guía de inicio rápido del desarrollador y las Normas de codificación y desarrollo pero después según el escenario en que me encuentre lo mejor seria poder seguir con la documentación más adecuada para él.

Contribuir al núcleo de gvSIG

¿Qué quiere decir eso de “Contribuir al núcleo de gvSIG”?

Pues me refiero a cuando tengo o me gustaría realizar alguna mejora o corrección de algún bug de lo que serian los proyectos que forman parte del “workspace principal de gvSIG”. Si quiero aportarla al proyecto, tendré que poder probar que funciona y saber qué tengo que hacer para aportarla. Será interesante leer:

Después de leer esta documentación, probablemente estemos en condiciones de compilar el “núcleo de gvSIG” para poder introducir nuestras mejoras, y sabremos cómo hemos de hacer para que estas sean integradas en el núcleo para próximas revisiones.

Contribuir a un proyecto que no forma parte del núcleo de gvSIG

Lo primero que nos puede venir a la cabeza es la pregunta de que es eso de proyectos que no forman parte del núcleo de gvSIG… bueno… el workspace principal de gvSIG consta de una serie de proyectos que constituyen el núcleo sobre el que se monta toda la aplicación, pero no todos los plugins que se distribuyen con la aplicación están en este workspace. Cada vez más plugins tienen su propio proyecto independiente y su propio ciclo de vida. Con su grupo de desarrollo y criterios para aceptar nuevos desarrolladores o contribuciones, algunas veces más laxos que sobre el workspace principal. Algunos de esos plugins son:

  • Catalog
  • Gazetteer
  • ARC IMS
  • Oracle
  • Layout document
  • ECW
  • MrSID
  • WMS
  • WCS
  • Scripting

Algunos tienen ya su propio proyecto en la infraestructura de desarrollo de gvSIG y siguen una vida independiente del núcleo de gvSIG. Si estamos interesados en contribuir en alguno de ellos podemos consultar en la pagina infraestructura de desarrollo de gvSIG la ficha del proyecto y ponernos en contacto con alguno de sus responsables para gestionar con él la forma en que queremos desarrollar. Si no, siempre podemos trabajar como se describe en Contribuciones y parches al código de gvSIG.

Si vamos a ser desarrolladores de un proyecto puede ser interesante leer:

Ya comentado en el apartado anterior, y además:

Creación de plugins propios

Y por ultimo comentar esta parte… porque la creación de nuestros propios plugins y que estén disponibles para el resto de la comunidad de usuarios de gvSIG también es una forma de contribuir al proyecto.

Para este caso aconsejo sobre todo la Guía de inicio rápido del desarrollador, pero nos ayudará también leer algunos de los documentos comentados en los apartados anteriores como:

Y más específicamente nos vendrá bien leer:

  • Crear un proyecto para gvSIG de la Guía para desarrolladores de gvSIG 2.0.0
  • Proyectos oficiales en gvSIG que nos guiara sobre cuáles son las directrices para que nuestro desarrollo sea un proyecto oficial gvSIG. Recomiendo leerlo antes de abordar un desarrollo para la versión 2 de gvSIG, ya que aunque a priori no vayamos a solicitar que nuestro proyecto sea un proyecto oficial, hay bastantes cosas que son simples de seguir cuando vas a crear tu proyecto pero pueden ser muy costosas una vez ya esta confeccionado, así que merece la pena leerlo para intentar seguir las lineas que ahí se piden al inicio del desarrollo, aunque sea solo como buenas prácticas de desarrollo.

Para acabar

La documentación que he ido referenciando es documentación sobre cómo trabajar, pero no se trata de documentación de referencia sobre las librerías que conforman gvSIG. De esta hay menos, pero si alguien quiere leer algo puede encontrarla en el apartado de Documentación de desarrollo del proyecto gvSIG-desktop en la web http://www.gvsig.org . De ahí, por su especial relevancia es recomendable leer:

Y bien, para acabar estas letras, simplemente comentar que la documentación puede no estar todo lo completa que nos gustaría y que aunque la sigáis, podéis tener problemas, pero no os desaniméis, preguntar por las listas de desarrollo las dudas que tengáis o si tenéis algún problema para hacerlo por las listas no dudéis en escribir correo a los responsables de desarrollo de los proyectos con los que tengáis problemas.

¡Ah!, se me olvidaba, también podéis contribuir aportando documentación al proyecto, o traduciendo la existente a otros idiomas.

Hasta la próxima

Posted in community, development, gvSIG Desktop, spanish, technical collaborations | 6 Comments

Cómo crear la persistencia de DynClasses en gvSIG 2.0

En el post anterior, descubrimos cómo definir y hacer uso de los DynObjects en gvSIG 2.0, pero no se documento la forma de hacer que la información que en ellos se contiene fuera persistente.

En este punto, continuamos profundizando en este mecanismo, continuando por los pasos marcados para llevar a cabo este proceso.

Persistencia de los DynObjects

  • Deberemos definir los atributos del objeto que queremos persistir. En nuestro caso, se persisten los siguientes atributos:
    public static void registerPersistenceDefinition(){
      PersistenceManager manager = ToolsLocator.getPersistenceManager();
      DynStruct definition = manager.getDefinition("ChartProperties");
      if(definition == null){
        definition = manager.addDefinition(AbstractChartProperties.class, "ChartProperties" , "description", null , null);
        definition.addDynFieldString("name").setMandatory(false);
        definition.addDynFieldString("title").setMandatory(true);
        definition.addDynFieldString("type").setMandatory(true);
        definition.addDynFieldObject("service").setClassOfValue(ChartService.class);
      } 
    }

    En apariencia es similar, pero contiene las siguientes diferencias:

    • La primera es fundamental: se define la estructura en dos métodos diferentes, ya que no siempre todo lo que se maneja en el DynObject, se quiere persistir.
    • Por otro lado, en lugar de una DynClass, se obtiene un DynStruct (obtenido del PersistenceManager, en lugar del _DynObjectManager)
    • Los DynStruct se definen en el namespace“Persistent”, por lo que no hay que indicarlo a la hora de buscar definción
      ... = manager.getDefinition("ChartProperties");
      ...

      y cambia ligeramente a la hora de añadir la definición al Manager

      ...
      definition = manager.addDefinition(AbstractChartProperties.class, "ChartProperties" , "description", null , null);
      ...

    Este método de registro de la persistencia de la DynClass también deberá ser llamado desde la librería correspondiente después de la definición.

  • Despues tendremos que hacer que nuestra clase implemente el interfaz Persistent.
    public interface ChartProperties extends DynObject, Persistent
  • Esto nos añadirá un par de métodos a implementar, para guardar los datos y recuperarlos, respectivamente:
    public void saveToState(PersistentState state) throws PersistenceException;
    
    public void loadFromState(PersistentState state) throws PersistenceException;

    Estos métodos son los encargados de persistir y recuperar los atributos de nuestra clase. En nuestro caso, se persisten los siguientes atributos:

    public void saveToState(PersistentState state) throws PersistenceException {
      state.set("name", this.getChartName());
      state.set("type", this.getChartType());
      state.set("title", this.getChartTitle());
    }
    
    public void loadFromState(PersistentState state)
            throws PersistenceException {
      this.setChartName(state.getString("name"));
      this.setChartType(state.getString("type"));
      this.setChartTitle(state.getString("title"));
    }
    

Con todo esto, ya disponemos de las herramientas suficientes para poder manejarnos con los DynObjects en gvSIG y disfrutar de los beneficios que nos aportan.

¡Suerte y a por ellos! 😉

Posted in development, gvSIG Desktop, spanish | 1 Comment

Cómo crear una clase que ofrezca el interfaz DynObject

En el post anterior referente a los DynObjects, se hizo una pequeña explicación y motivación de su uso en distintos ámbitos de gvSIG. Este HowTo se presenta como un ejemplo en el que se pretende describir el proceso de definición y su uso.

Para apoyar la explicación, se tomará un ejemplo real sobre el que se citarán los pasos a seguir para que quede más ilustrado.

El modelo de objetos del ejemplo es bastante básico: partimos de un interfaz, que es implementado por una clase abstracta. Ésta última, a su vez, es extendida por más clases (se describirá sólo una, ya que el resto sería identíco para la definición de DynObjects), tal y como muestra la figura siguiente:

Definición de los DynObjects

Vamos a cumplimentar la definición básica de un DynObject:

  • Lo primero es que la clase que va a albergar los DynObjects debe extender la clase de mismo nombre.
    public interface ChartProperties extends DynObject
  • Esto nos genera una cantidad de métodos a implementar (en nuestro ejemplo, en la clase abstracta AbstractChartProperties).
    DynClass getDynClass();
    
    void implement(DynClass dynClass);
    
    void delegate(DynObject dynObject);
    
    Object getDynValue(String name)  throws DynFieldNotFoundException ;
    
    void setDynValue(String name, Object value)  throws DynFieldNotFoundException ;
    
    boolean hasDynValue(String name); 
    
    Object invokeDynMethod(String name, DynObject context) throws DynMethodException;
    
    Object invokeDynMethod(int code, DynObject context) throws DynMethodException;
    
    void clear();

    En nuestro caso, delegaremos en la implementación genérica, rellenando los métodos de la siguiente forma:

    • Definimos un DynObjectpor defecto que se creará en el constructor del objeto:
      protected DelegatedDynObject data;
      
      protected AbstractChartProperties(String definitionName){
        this.data = (DelegatedDynObject) 
          ToolsLocator.getDynObjectManager().createDynObject(definitionName, "Chart");
      }
    • Completamos la definición de los métodos delegando en su implementación genérica:
      public DynClass getDynClass() {
          return data.getDynClass();
      }
      
      public void implement(DynClass dynClass) {
          data.implement(dynClass);
      }
      
      public void delegate(DynObject dynObject) {
          data.delegate(dynObject);
      }
      
      public Object getDynValue(String name) throws DynFieldNotFoundException {
          return data.getDynValue(name);
      }
      
      public void setDynValue(String name, Object value)
              throws DynFieldNotFoundException {
          data.setDynValue(name, value);
      }
      
      public boolean hasDynValue(String name) {
          return data.hasDynValue(name);
      }
      
      public Object invokeDynMethod(String name, DynObject context)
              throws DynMethodException {
          return data.invokeDynMethod(name, context);
      }
      
      public Object invokeDynMethod(int code, DynObject context)
              throws DynMethodException {
          return data.invokeDynMethod(code, context);
      }
      
      public void clear() {
          data.clear();
      }
  • Ahora definimos la DynClass:
    public static void registerDefinition(){
      DynObjectManager manager = ToolsLocator.getDynObjectManager();
      DynClass definition = manager.get("Chart","ChartProperties");
      if(definition == null){
        definition = manager.createDynClass("Chart", "ChartProperties", "aquí va la descripción");
        definition.addDynFieldString("name").setMandatory(false);
        definition.addDynFieldString("title").setMandatory(true);
        definition.addDynFieldString("type").setMandatory(true);
        definition.addDynFieldObject("service").setClassOfValue(ChartService.class);
        manager.add(definition);
      }
    }

    Analizamos por partes los elementos más destacados de esta definición:

    • Como se puede ver, el método es estático:
      public static void registerDefinition(){
      ...

      el registro de la DynClass se debe hacer una única vez, cuando se carga la librería, por lo que se llamará a este método en el momento se haga el doInitialize() de la librería correspondiente.

      @Override
      protected void doInitialize() throws LibraryException {
        ...
        AbstractChartProperties.registerDefinition();
      }
    • Tras obtener el manager de los DynObjects, intentamos recuperar la definición de la DynClass (del namespace“Chart”, la DynClass de identificador “ChartProperties”). Si no existe, la creamos:
      DynObjectManager manager = ToolsLocator.getDynObjectManager();
      DynClass definition = manager.get("Chart","ChartProperties");
      if(definition == null){
        definition = manager.createDynClass("Chart", "ChartProperties", "aquí va la descripción");
           ...
        }
      ...
    • Por último, añadimos a la definición los atributos que compondrán la DynClass. La definición contiene los métodos para trabajar con los tipos básicos (String, Integer, Float, …):
      ...
      definition.addDynFieldString("name").setMandatory(false);
      definition.addDynFieldString("title").setMandatory(true);
      definition.addDynFieldString("type").setMandatory(true);
      ...

      en el caso de que se trabaje con otra clase más compleja, ésta deberá implementar la clase DynObject también, delegando su definición en ella misma.

      ...
      definition.addDynFieldObject("service").setClassOfValue(ChartService.class);
      ...
    • Una vez completa la definición, la añadimos al mánager:
      ... 
        manager.add(definition);
      }
  • Además, y esto ya más por comodidad, definiremos métodos de acceso get y seta los atributos:
    public void setChartType(String type) {
      data.setDynValue("type", type);
    }
    
    public String getChartType() {
      return (String) data.getDynValue("type");
    }

En el caso de querer ampliar esta definición a alguna de las clases que extienden a AbstractChartProperties para ampliar la definición del DynObject, los pasos a seguir serían:

  • Dado que se puede delegar en los métodos de la clase abstracta, la definición de los métodos típicos de DynObject no sería necesario volver a implementarlos.
  • Lo único necesario, sería aumentar la definición de la DynClass, en función de nuestras necesidades:
    public static void registerDefinition(){
      DynObjectManager manager = ToolsLocator.getDynObjectManager();
      DynClass definition = manager.get("Chart","BarsChart");
      if(definition == null){
          definition = manager.createDynClass("Chart", "BarsChart", "aquí va la descripción");
          definition.addDynFieldString("xValuesTitle").setMandatory(true);
          definition.addDynFieldString("yValuesTitle").setMandatory(true);
          definition.extend("Chart", "ChartProperties");
          manager.add(definition);
      }
    }

    El proceso es muy similar, salvo que se definen úncamente en la DynClass los parámetros añadidos respecto a la clase extendida, indicando que recoja el resto de la definición del padre a través de la instrucción:

    ...
      definition.extend("Chart", "ChartProperties");
    ...

    Este método también es estático y se carga una única vez cuando se carga la librería correspondiente.
    Nota: debido a que utiliza la definición de la clase AbstractChartProperties, hay que asegurarse que se carga después utilizando cualquiera de los métodos disponibles para la carga de librerías (poniendo el registro de la clase padre en el doInitilize() y las que dependen de él en el postInitialize(), o a través de fijar dependencias en el método doRegistration())

En el siguiente post, comentaremos cómo crear una clase que implementa el mecanismo de persistencia de gvSIG 2.0 basado en DynClasses.

Posted in development, gvSIG Desktop, spanish | 1 Comment

DynObjects en gvSIG 2.0

Hola,

vamos a hacer una introducción rápida a esta funcionalidad de gvSIG 2.0. Contaremos de forma rápida que son y después, en un par de artículos más intentaremos describir con un ejemplo dos usos de ellos.

En gvSIG se han introducido mecanismos para la definición de estructuras de datos dinámicas. Se tratan de estructuras de datos que se definen en tiempo de ejecución y nos permiten manejar datos con esa estructura sin que tengamos que saber exactamente cuál es esa estructura en tiempo de compilación. Sería algo parecido a manejar un Map para almacenar una estructura de datos en la que las claves son los nombres de los campos y el valor asociado a la clave su valor, pero con un valor añadido que nos permite consultar los tipos de los datos.

Para dar soporte a esto, a grandes rasgos, disponemos de los siguientes interfaces:

  • DynStruct. Contiene la definición de una estructura de datos. Qué atributos tiene la estructura, de qué tipos son, qué valores por defecto deben tener o qué restricciones se les deben aplicar a los atributos.
  • DynClass. Extiende a DynStruct añadiendo los mecanismos para definir operaciones o métodos asociados a la estructura de datos.
  • DynObject, que representaría a una instancia de un DynStruct o DynClass.
  • DynObjectManager, que nos hace de factoría para crear instancias de definición de estructuras (DynStruct y DynClass) o de las propias instancias de éstas (DynObject).

Para complementar a estos interfaces, hay implementaciones por defecto para cada uno de estos, de forma que podemos instanciarlas desde el DynObjectManager.

A este grupo funcional que aporta estas clases e interfaces es lo que genéricamente llamamos DynObjects.

Aunque el uso principal de los DynObjects es el de disponer de datos cuya estructura es dinámica y creada en tiempo de ejecución, en algunas partes de gvSIG se usa sólo para definir la estructura de datos propiamente dicha sin que luego se vaya a usar para almacenar éstos. Por ejemplo cuando definimos los metadatos de un objeto o cuando definimos qué atributos queremos que persistan de él. Tanto en un caso como en el otro se utiliza una definición de la estructura de datos para indicar qué metadatos tendrá el objeto o qué atributos de él serán persistidos, pero no para instanciar objetos con esa estructura.

Dada una definición de estructura de datos, podríamos crear una instancia de ellos mediante el DynObjectManager.

DynObjectManager manager = ToolsLocator.getDynObjectManager();
DynObject mydata = manager.createDynObject("MyStruct");

De esta forma tendré un DynObject que responderá a la estructura de datos definida con el nombre “MyStruct”. Este DynObject estará implementado por la clase por defecto para el manejo de DynObjects, pero es muy común que queramos disponer de nuestra propia implementación de nuestra estructura, usando los DynObjects como mecanismo para intercambiar estructuras de datos de las que no sabemos su definición en tiempo de compilación. En ese caso lo que haremos sera crear nuestra propia clase que implemente el interfaz DynObject, y proporcionar un manager o factoría para crear las instancias de éstos.

En los próximos dos artículos que continuaran a este veremos:

Espero que esto pueda servir para aclarar algunas ideas.

Un saludo

Joaquin del Cerro
Jose Badia

Posted in development, gvSIG Desktop, gvSIG development, spanish, technical collaborations | Leave a comment

Versión de desarrollo de gvSIG 1.12 lista para testear

Se ha publicado una nueva versión de desarrollo (build 1411) de gvSIG 1.12. Este será uno de los últimos builds antes de publicar la Release Candidate, por ello, queremos animar especialmente a toda la comunidad gvSIG a que la instale para probarla y testearla.

Se trata todavía de una versión no recomendable para su uso en producción, aunque no se ha detectado ningún error grave. Esta versión contiene ya todas las mejoras que podremos encontrar en la versión final de gvSIG-Desktop 1.12, que saldrá en las próximas semanas. Los instaladores para Linux y para Windows pueden obtenerse desde la página de descargas de gvSIG.

Las novedades que presenta esta versión 1.12 son:

  • Para los usuarios:
    • Se ha integrado la última versión de Sextante, 1.0.
    • Se ha incluído una nueva paleta de colores.
    • Se ha incrementado notablemente la usabilidad a la hora de organizar las capas en el TOC.
    • Mejoras generales de usabilidad (ventana de vista maximizada por defecto, colores aleatorios, etiquetado de tamaño y color fijo, abrir ficheros independientemente de su tipo, zoom con la rueda del ratón más amigable, ventana del localizador no modal, etc.).
    • Arreglos varios en el driver de Postgis (Simplificada la conexión a bases de datos, disminución de consumo de recursos en el servidor, soporte de fechas, etc.).
    • Mejoras e incremento del rendimiento en la unión de tablas y conexiones odbc.
    • Añadida la traducción al idioma Khmer.
    • Actualizado el acceso a datos para WMS 1.3 y la última versión de kml.
    • Mejoras varias en la carga de ráster, especialmente a la hora de capas pesadas.
    • Mejoras en la creación e impresión de mapas.
    • Soporte de simbología por intervalos para valores negativos.
    • En cuanto a Navtable, se ha mejorado la interfaz gráfica y los filtros rápidos.
  • Para los desarrolladores:
    • Se ha actualizado la librería jts a la versión 1.12.
    • Automatizado el proceso de generación de instaladores.
    • Uso de installjammer y launch4j.
    • Cambiada la API de la clase View.
    • La calculadora de expresiones puede usarse desde plugins externos.

Los errores encontrados pueden ser reportados en el tracker del proyecto o bien directamente a través de la lista de correo, usando un mensaje claro en el asunto del correo, como “bug en build 1411”.

En caso de que no aparezcan errores graves en el plazo de una semana se publicará la RC (versión candidata a final) y se iniciará un nuevo periodo de prueba por parte de la comunidad. Si los errores encontrado en la RC tampoco son graves se publicará la versión final.

Gracias por vuestra colaboración.

Posted in gvSIG development, spanish, testing | 2 Comments

Las 4as Jornadas de Latinoamérica y Caribe de gvSIG declaradas de Interés Ministerial por el Ministerio de Transportes y Obras Públicas de Uruguay

Con fecha 19 de abril de 2012, el Ministro de Transportes y Obras Públicas de Uruguay, Enrique Pintado, ha aprobado la resolución 2012/006/040 que otorga a las Cuartas Jornadas de Latinoamérica y Caribe de gvSIG y Segundas Jornadas Uruguayas de gvSIG [1] el rango de Interés Ministerial [2].

Estas 4as Jornadas se celebrarán del 24 al 28 de septiembre de 2012 en Montevideo (Uruguay), bajo el lema “Creciendo en Comunidad”, y tienen como objetivo proporcionar un lugar de encuentro donde los técnicos, investigadores, desarrolladores, expertos, y la comunidad en general, se reúnan en un entorno con debates en relación de la geomática libre y el Sistema de Información Geográfica de código abierto gvSIG. Para ello contará con diversos talleres, seminarios y ponencias.

[1] http://www.gvsig.org/web/community/events/jornadas-lac/2012/
[2] http://www.gvsig.org/web/community/events/jornadas-lac/2012/documentos/declaracion-interes_MTOP.pdf

Posted in community, events, spanish | Leave a comment

FOSS4G-CEE Conference in Prague

Last week (21.5-23.5.2012) took place in Prague, Czech Republic conference focused on free and open source called Free and Open Source Software for Geospatial in Central and East Europe (FOSS4G-CEE). The conference was co-organized by Faculty of Civil Engineering, Czech Technical University in Prague, so the venue was localized in university campus. The conference was focused on wide portfolio of free products, but in every case with some relationship to Central Europe. There was 60 papers, 6 workshops, 5 tutorials and 120 registered participants all over the world (CZ – 35, RO – 14, DE – 12, FR – 6, AT – 5, SK – 4, EE, HU, CH, PL, TU, USA – 3, IT, UK – 2, HR, NRW, NZ, Georgia, Ghana, Nigeria 1).

The program was divided into 3 main parts. On Sunday and Monday morning there were practice workshops, on Monday afternoon there was plenary session, where keynote speakers presented their papers. It was very interesting to see Arnulf Christl (OSGeo president), Markus Neteler (OSGeo founding-member) or Athina Trakas (OGC Director for European Services). In next two days presenters presented their papers in three parallel sections.

One of the presentations was focused on gvSIG topic as well. Rostislav Nétek talked about Influence of e-learning and Open Source solutions for education at Palacký University in Olomouc inspired by Polytechnic University in Valencia (see an abstract).

 

He talked about different approaches in education between Western and Eastern Europe. It is based on case study, which compares universities conventions between Spain and Czech Republic, focused on eLearning and open source sources. The author, originally from Palacký University in Olomouc, Czech Republic spent two internships at Polytechnic University in Valencia, where he met gvSIG for the first time and visited gvSIG lessons of Jesús Palomar Vázquez. He was surprised by fact that in Eastern Europe free solutions and eLearning was deeply implemented into education at universities compared to situation in Czech Republic. So now the author is responsible for gvSIG class at Palacký University. Due to fact that open source is little bit repressed in Czech education, inspired by situation at UPV he put great emphasis on self education and videotutorials for learning with gvSIG programme. After presentation there was quite long discussion about it, especially with one of keynote speaker Helena Mitasova (North Carolina State University), which confirmed that it is very important to increase awareness about software like gvSIG among students in Europe as well in USA. Moreover the discussion about it continued in the foyer.

Generally, FOSS4G-CEE was really great conference, with strong impact of knowledge and experiences about open source solutions. It was agreed, that, FOSS4G-CEE 2013 will be organized by Vasile Crăciunescu and his team at geo-spatial.org in Bucharest, Romania.

Posted in community, english, events, opinion | Tagged , , , | 1 Comment