gvSIG Batoví, se presenta la primera distribución de gvSIG para Educación (gvSIG Educa)

El Ministro de Transporte y Obras Públicas (MTOP) de la República Oriental del Uruguay, Enrique Pintado, presentó el pasado jueves gvSIG Batoví, primera distribución uruguaya que da origen a gvSIG Educa.

gvSIG Educa es una personalización del Sistema de Información Geográfica libre gvSIG Desktop, adaptado como herramienta para la educación de materias con componente geográfica. gvSIG Educa tiene como objetivo servir de herramienta a educadores para facilitar a los alumnos el análisis y la comprensión del territorio, teniendo la posibilidad de adaptarse a los distintos niveles o sistemas educativos. gvSIG Educa facilita el aprendizaje por la interactividad de los alumnos con la información, añadiendo la componente espacial al estudio de las materias, y facilitando la asimilación de conceptos mediante herramientas tan visuales como los mapas temáticos o que ayudan a comprender las relaciones espaciales.

gvSIG Batoví es, de este modo, la puesta en marcha de un software libre que probablemente sea adaptado y utilizado en un gran número de países. gvSIG Batoví es un software impulsado por la Dirección Nacional de Topografía (MTOP) para el Plan Ceibal, por el cual los estudiantes de Primaria y Secundaria tendrán acceso a nutrida información de carácter didáctico y representada mediante mapas.

“Desde la implementación del Plan Ceibal, el gobierno busca incentivar políticas que favorezcan al desarrollo y beneficio de la educación de los niños, nuestro futuro y presente del país”, destacó Pintado, precisando que por sus características geográficas nuestro país no puede producir bienes a gran escala, “pero sí podemos generar conocimiento sin límite de ninguna especie”.

Durante la presentación de esta nueva herramienta, ceremonia de la que participaron el Subsecretario de la cartera, Ing. Pablo Genta, el Director Nacional de Topografía (MTOP), Ing. Jorge Franco y el Decano de la Facultad de Ingeniería (UDELAR), Ing. Héctor Cancela, el Ministro señaló que más allá de esas limitantes productivas, “los uruguayos podemos distinguirnos por la inteligencia, por la capacidad de innovar e investigar, y vincular esos conocimiento al desarrollo”. “Y para ello, este nuevo software llamado “gvSIG Batoví”, resultará fundamental ya que permite a los gurises (como se denomina a los niños en Uruguay) acceder a un vasto universo de conocimientos”, acotó.

El programa “gvSIG Batoví”, producto del trabajo conjunto de la Dirección Nacional de Topografía, la Facultad de Ingeniería y la Asociación gvSIG, posibilitará a los estudiantes adquirir conocimientos de Geografía a través de la utilización de las XO -computadora portátil de bajo coste-, extensible también a otras áreas del conocimiento, como Historia, Biología, entre otros.

Lo más interesante es la posibilidad que le brinda al docente y/o estudiante de elaborar su propio mapa temático a partir de las distintas capas de información que disponga del territorio. Con ello se busca fomentar el aprendizaje por descubrimiento, convirtiendo al trabajo cartográfico en un saber formativo.

Con “gvSIG Batoví” se presenta un primer conjunto de mapas temáticos previamente elaborados del territorio uruguayo, como por ejemplo mapas políticos y físicos, distribución de la población, infraestructura del transporte y la comunicación, y cobertura del suelo. La facilidad de acceso a estos mapas temáticos -como plugins instalables desde la propia aplicación- permitirá compartir con facilidad cartografía entre docentes y estudiantes de toda la comunidad de usuarios de este software.

Más allá del ámbito educativo, los usuarios profesionales de la tecnología gvSIG, podrán acceder en forma de plugins a estas nuevas funcionalidades de crear y compartir mapas, convirtiéndose así en una nueva forma, extremamente sencilla, de compartir información territorial.

Cabe destacar que en las Cuartas Jornadas de Latinoamérica y Caribe de gvSIG y Segundas Jornadas Uruguayas de gvSIG se incluirá una presentación y un taller sobre el gvSIG Batoví.

Para concluir es de destacar el énfasis en lo colectivo que tuvo este proyecto, ya que incluyó la participación coordinada de 4 instituciones: Dirección Nacional de Topografía del MTOP (Uruguay) como propulsora de la idea; Asociación gvSIG (España) como principal desarrolladora de la herramienta y demás aspectos del proyecto (documentación, difusión, etc.); Grupo en Tecnologías de la Información Geoespacial de la Fac. de Ingeniería (UDELAR – Uruguay) como contraparte local del desarrollo; y el Centro Ceibal como responsable de la distribución e implementación del producto en el Plan Ceibal (Ceibal significa “Conectividad Educativa de Infomática Básica para el Aprendizaje en Línea”, además de aludir a la flor nacional, el ceibo).

Posted in community, gvSIG Desktop, spanish | Tagged , , | Leave a comment

gvSIG 1.11 se une al portfolio de software de Munich

He considerado interesante traducir esta importante noticia que nos llega desde el Ayuntamiento de la ciudad de Munich, de la mano de Georg Sedlmeir.

Saludos
Valenty


Luego de varios años de preparativos y pruebas, el Departamento de Salud y Medio Ambiente del Ayuntamiento de Munich se complace en informar que gvSIG 1.11 ya se ha incorporado al Portafolio de Software Estándar de la Ciudad de Munich, lo que significa que todos los usuarios en la administración de la ciudad que necesiten gvSIG en su escritorio pueden tenerlo asignado mediante un procedimiento de instalación automática, listo para usar!

Esto también significa que gvSIG finalmente deja los confines del Departamento de Salud y Medio Ambiente y da un paso más en el proceso de establecerse como la herramienta de Código Abierto compatible con OGC y como alternativa al software propietario para toda la municipalidad.

Con el fin de apoyar aún más este proceso y difundir esta noticia, ha sido desarrollado un curso de formación interna en la organización, con una duración de 2 días, dirigido a un público que ya está familiarizado con los conceptos de SIG, para probar el estado del arte de gvSIG como aplicación de Código Abierto. Un primer curso se llevará a cabo este otoño, con otros más por venir el próximo año.

Posted in gvSIG Desktop, spanish | Leave a comment

gvSIG 1.11 now official part of the standard software portfolio in the City of Munich!

After several years of preparations and testing, the Department of Health and Environment of the City of Munich is happy to report that gvSIG 1.11 has now been incorporated into the City of Munich’s standard software portfolio, which means that everyone in the city administration who needs gvSIG on their desktop

can have it assigned with an automatic installation procedure and is ready to go! This also means that gvSIG has finally left the confines of the Department of Health and Environment and is taking another step in the process of establishing it as an OGC compliant, Open Source alternative to proprietary software throughout the municipality.

In order to support this process further and spread the news, an internal 2-day training course has been developed, targeted at an audience already familiar with GIS concepts and ready to try out a state of the art open source GIS application. A first course will take place this fall, with more to come early next year.

 

Posted in english, gvSIG Desktop | 1 Comment

Hilos y gvSIG (4 de 4): Interactuando con el usuario

En el articulo anterior “Hilos y gvSIG: Estructura de nuestro proceso (3 de 4)” vimos cómo podíamos estructurar la lógica de nuestro proceso. En este ultimo articulo vamos a ver cómo podríamos hacer para interactuar con la interface gráfica desde él.

Cuando estamos trabajando en java con swing y múltiples hilos de ejecución tenemos que tener algo de cuidado al interactuar con el interface de usuario. En una aplicación swing el acceso a los elementos gráficos debe realizarse desde el hilo que controla el manejador de eventos de swing. Si desde otro hilo intentamos acceder a los elementos graficos podemos tener resultados inesperados. La librería de swing aporta varias funciones de utilidad para poder sincronizar nuestras operaciones con las que swing hace en su hilo de ejecución. Nos vamos a quedar con tres de ellas:

  • SwingUtilities.isEventDispatchThread, que nos dice si ya estamos ejecutándonos en el hilo de swing
  • SwingUtilities.invokeLater(Runnable action) que se encarga de encolar la ejecución de “action” en el hilo de swing para que se ejecute cuando este pueda.
  • SwingUtilities.invokeAndWait(Runnable action) que se encarga de encolar la petición en el hilo de swing y esperar a que esta se ejecute.

Usando estos tres métodos podemos asegurarnos que las partes de código que tienen que ver con el GUI se ejecuten en el hilo del manejador de eventos de swing.

Por ejemplo, si quisiésemos mostrar un cuadro de diálogo del estilo de showMessageDialog podríamos hacer algo como:

if (!SwingUtilities.isEventDispatchThread()) {
  try {

    SwingUtilities.invokeAndWait(new Runnable() {
      public void run() {

        JOptionPane.showMessageDialog(null, "Éste sería el mensaje a mostrar");
      }
    });

  } catch (InterruptedException e) {
    logger.info("Can't show message dialog ", e);

  } catch (InvocationTargetException e) {
    logger.info("Can't show message dialog ", e);

  }
} else {
  JOptionPane.showMessageDialog(null, "Éste sería el mensaje a mostrar");

}

Aunque de esta manera podemos asegurarnos que nuestros mensajes se presentan al usuario de forma correcta aunque estemos en un hilo distinto al del manejador de eventos de swing, suele resultar bastante engorroso, por eso disponemos de algúnas funciones en gvSIG para acceder a algunos de los diálogos standard. Los siguientes métodos de gvSIG nos permiten presentar algunos de los cuadros de diálogo de la clase JOptionPane sin preocuparnos de esto:

  • ApplicationManager.messageDialog nos muestra un mensaje similar a JOptionPane.showMessageDialog
  • ApplicationManager.confirmDialog nos muestra un mensaje similar a JOptionPane.showConfirmDialog
  • ApplicationManager.inputDialog nos muestra un mensaje similar a JOptionPane.showInputDialog

Además de estos métodos disponemos de un método ApplicationManager.message que nos permitirá presentar un mensaje en la barra de estado de gvSIG, y que también realiza las comprobaciones adecuadas para asegurarse que funciona aunque no estemos en el hilo de swing.

Con estos cuatro métodos junto con el mecanismo del TaskStatus podemos dotar a nuestros procesos de algo de interacción con el usuario sin necesidad de encargarnos nosotros mismos de sincronizarnos con el hilo de swing. Si precisamos una interacción más rica, por ejemplo presentar nuestros propios cuadros de diálogo desde nuestro hilo de ejecución, disponemos de dos métodos más en el ApplicationManager:

  • createComponent, que pasándole la clase que implementa un componente de AWT se encarga de crearlo en el hilo de swing.
  • Y showDialog(final Component contents, final String title), que recibe nuestro JPanel, normalmente instanciado con createComponent y se encarga de mostrarlo a modo de diálogo modal respecto a nuestro hilo.

Y por último comentar que se está realizando un esfuerzo para que la gran mayoría de los métodos del API de andami y el plugin de gvSIG se comporten de forma segura respecto a su ejecución desde otros hilos distintos al del controlador de eventos de swing.

Bueno… con estas utilidades en nuestra caja de herramientas volvamos a nuestra clase MyProcess. En el articulo anterior habíamos visto cómo podría ser la estructura de nuestra clase que implementase nuestro proceso. Habíamos visto también ya que en algún momento se presentaba un cuadro de diálogo al usuario para informar de algún error, pero no nos habíamos centrado en ello.

Así por ejemplo, al final de nuestro bucle en el método run teníamos algo como:

...
  this.postPrecess();
  if (status.isCancellationRequested()) {

    status.cancel();
    return;
  }
  application.message("Process terminated", JOptionPane.INFORMATION_MESSAGE);

} catch (Exception e) {
  logger.info("Error in process", e);

  if (status != null) {
    status.abort();

  }
  application.message("Process error", JOptionPane.WARNING_MESSAGE);
  application.messageDialog(

          "Se ha producido un error realizando el proceso y éste terminará de forma inesperada.\n\n"
              + e.getMessage(), this.getName(),
          JOptionPane.WARNING_MESSAGE);

} finally {

...

En donde podemos ver cómo se invoca a un par de métodos que interactúan con el usuario. Por un lado tenemos la llamada:

application.message("Process terminated", JOptionPane.INFORMATION_MESSAGE);

Que se encarga de mostrar en la barra de estado de gvSIG un mensaje informándonos que ha terminado la ejecución de nuestro proceso. Nótese que como estamos usando el método message del ApplicationManager no es preciso sincronizar su ejecución con el hilo de swing, como hemos comentado antes.

Y un poco más abajo, cuando se atrapan los errores, se muestra un diálogo al usuario informando de ello:

application.messageDialog(
        "Se ha producido un error realizando el proceso y éste terminará de forma inesperada.\n\n"

            + e.getMessage(), this.getName(),
        JOptionPane.WARNING_MESSAGE);

Con todo esto, vamos a ver qué podía hacer nuestro proceso, más para ilustrar el uso de estas funciones que para hacer algo real. Así nuestro proceso se limitará ha hacer un sleep a cada iteración, y además:

  1. Cuando lleve recorridos el 10% de los elementos presentará un mensaje de tipo informativo en la barra de estado informando de ello, además de mostrarlo en el indicador de progreso usando el taskstatus:
    status.message("10%");
    
    application.message("this is the row " + i,
        JOptionPane.INFORMATION_MESSAGE);
  2. Cuando lleve recorridos el 20% de los elementos presentará un mensaje de tipo advertencia en la barra de estado informando de ello, además de mostrarlo en el indicador de progreso usando el taskstatus:
    status.message("20%");
    application.message("this is the row " + i,
    
        JOptionPane.WARNING_MESSAGE);
  3. Cuando lleve recorridos el 30% de los elementos presentara un mensaje de tipo error en la barra de estado informando de ello, además de mostrarlo en el indicador de progreso usando el taskstatus:
    status.message("30%");
    
    application.message("this is the row " + i,
        JOptionPane.ERROR_MESSAGE);
  4. Cuando lleve el 40% presentara un mensaje del tipo ShowMessageDialoginformando de ello:
    status.message("40%");
    application.messageDialog("Just procesing "+i+" items",
    
        this.getName(), JOptionPane.INFORMATION_MESSAGE);

    Aquí el proceso se interrumpirá hasta que el usuario pulse en el botón aceptar, tras lo cual continuara con su ejecución.

  5. Cuando lleve el 50% informará de ello al usuario, y preguntará si éste desea interrumpir nuestro proceso:
    status.message("50%");
    int confirm = application
        .confirmDialog("Quiere cancelar el procesp?",
    
            this.getName(), JOptionPane.YES_NO_OPTION,
            JOptionPane.QUESTION_MESSAGE);
    
    if (confirm == JOptionPane.YES_OPTION) {
      status.cancelRequest();
    
    }

    En caso de que el usuario responda que si quiere cancelar la ejecución, llamamos al método cancelRequest y ya lo procesaremos a la siguiente entrada en nuestro bucle.

  6. Por ultimo, cuando el proceso lleve el 60%, pediremos al usuario que entre una cadena, que luego mostraremos en la barra de estado:
    status.message("60%");
    
    String value = application.inputDialog("Introduce un valor",this.getName());
    if (value != null) {
    
      application.message("Entered: " + value,
          JOptionPane.INFORMATION_MESSAGE);
    
    } else {
      application.message("Input cancelled",
          JOptionPane.INFORMATION_MESSAGE);
    
    }

Pongamos todo esto junto y veamos como nos quedaría nuestro método processItem:

private void processItem(int i) throws InterruptedException {

  ApplicationManager application = ApplicationLocator.getManager();
  SimpleTaskStatus status = (SimpleTaskStatus) this.getTaskStatus();

  switch ((100 * i) / this.maxValue) {

  case 10:
    status.message("10%");
    application.message("this is the row " + i,

        JOptionPane.INFORMATION_MESSAGE);
    break;
  case 20:
    status.message("20%");

    application.message("this is the row " + i,
        JOptionPane.WARNING_MESSAGE);

    break;
  case 30:
    status.message("30%");

    application.message("this is the row " + i,
        JOptionPane.ERROR_MESSAGE);

    break;
  case 40:
    status.message("40%");

    application.messageDialog("Just procesing "+i+" items",
        this.getName(), JOptionPane.INFORMATION_MESSAGE);

    break;
  case 50:
    status.message("50%");

    int confirm = application
        .confirmDialog("Quiere cancelar el procesp?",
            this.getName(), JOptionPane.YES_NO_OPTION,

            JOptionPane.QUESTION_MESSAGE);
    if (confirm == JOptionPane.YES_OPTION) {

      status.cancelRequest();
    }
    break;
  case 60:

    status.message("60%");
    String value = application.inputDialog("Introduce un valor",this.getName());

    if (value != null) {
      application.message("Entered: " + value,

          JOptionPane.INFORMATION_MESSAGE);
    } else {
      application.message("Input cancelled",

          JOptionPane.INFORMATION_MESSAGE);
    }
    break;
  }
  Thread.sleep(this.sleepTime);

}

No se trata de un código real, solo sirve para ilustrar el uso de las funciones más simples a nuestra disposición para interactuar con el usuario. Soy consciente que el control de los porcentajes puede provocar que se muestre algún diálogo más de una vez, pero prefiero no complicar el control de eso y dejar el código de la forma más simple, ya que lo importante creo que es ilustrar cómo podemos invocar a nuestros diálogos de forma simple.

Veamos ahora como podríamos añadir a nuestro proceso algún cuadro de diálogo personalizado. Supongamos que al iniciar nuestro proceso deseamos presentar al usuario un cuadro de diálogo preguntando algunos datos, y por la razón que sea ya no nos encontramos en el hilo del controlador de eventos de swing. Supondremos que tenemos una clase MyDialog que implementa un panel de swing, JPanel, y queremos mostrarla y esperar a que el usuario introduzca algún dato para que pueda continuar nuestro proceso. Nuestro panel MyDialog, espera recibir en su constructor una instancia de MyProcess, para acceder a los parámetros que éste tiene y poder mostrarlos al usuario y luego recuperarlos.

Lo primero que haremos sera añadir a nuestro MyProcess unos setters y getters para acceder a las propiedades privadas que nos interese:

public int getMaxValue() {
  return maxValue;
}

public void setMaxValue(int maxValue) {
  this.maxValue = maxValue;

}
public long getSleepTime() {
  return sleepTime;

}
public void setSleepTime(long sleepTime) {
  this.sleepTime = sleepTime;

}

Luego para mostrar nuestro diálogo, primero crearemos nuestro panel:

Component panel = application.createComponent(MyDialog.class, this);

Notar que no hemos creado el panel directamente invocando a:

Component panel = new MyDialog(this);

Ya que es podría provocar algún efecto extraño al no estar en el hilo de swing. LLamando a createComponent nos aseguramos que la creación de nuestro componente se hará en el hilo de swing, y que nuestro hilo esperara a que éste sea creado y nos lo devolverá.

Y luego para mostrar un cuadro de diálogo con ese panel llamaremos a:

application.showDialog(panel, this.getName());

Que se encargará de presentar una ventana de gvSIG con el panel indicado, y con el título que le hayamos dicho, en este caso el nombre de nuestro hilo, y esperará a que ésta sea cerrada para devolver el control a nuestro hilo.

Todo esto junto en el método preProcess quedaría:

private void preProcess() {
  SimpleTaskStatus status = (SimpleTaskStatus) this.getTaskStatus();

  status.setTitle("Getting parameters");
  Component panel = application.createComponent(MyDialog.class, this);

  application.showDialog(panel, this.getName());
}

En cuanto al método postProcess que hemos comentado en el articulo anterior, en nuestro caso quedaría vacío:

private void postPrecess() {
  // In this example do nothing
}

Con esto más o menos quedan cubiertas las principales acciones que podemos querer hacer desde nuestro hilo y qué funciones aporta gvSIG para ayudarnos en ello.

Respecto a nuestra clase MyDialog podría ser algo como:

public class MyDialog extends MyDialogLayout {
  private static final long serialVersionUID = 1919826881234125305L;

  private MyProcess process = null;

  public MyDialog(MyProcess process) {

    super();
    this.process = process;
    this.inputSleepTime.setValue(this.process.getSleepTime());

    this.inputMaxIterations.setValue(this.process.getMaxValue());
    this.buttonAcept.addActionListener(new ActionListener() {

      public void actionPerformed(ActionEvent arg0) {
        doAcept();
      }

    });
    this.buttonCancel.addActionListener(new ActionListener() {

      public void actionPerformed(ActionEvent arg0) {
        doCancel();
      }

    });
  }
  private void doAcept() {
    this.process.setSleepTime(((SpinnerNumberModel) inputSleepTime.getModel()).getNumber().intValue());

    this.process.setMaxValue(((SpinnerNumberModel) inputMaxIterations.getModel()).getNumber().intValue());

    this.closeWindow();
  }
  private void doCancel() {

    this.process.cancelRequest();
    this.closeWindow();
  }

  private void closeWindow() {
    this.setVisible(false);

  }
}

Lo más importante es el método closeWindow. El método showDialog del ApplicationManager espera a que el componente pasado sea ocultado para interpretar que se quiere cerrar la ventana, así que desde nuestro panel, lo único que hacemos es poner visible a false para indicar que queremos cerrar la ventana. Al respecto de MyDialog comentar que suelo separar la creación del GUI de la lógica de éste, así que la clase MyDialog extiende a MyDialogLayout que contiene la creación y posicionamiento de todo los controles, que son usados desde MyDialog. No creo que tenga gran misterio la creación y posicionamiento de los controles, así que no la voy a incluir en este articulo.

Como nota final, me gustaría hacer hincapié en un idea. Aunque aquí haya comentado cómo podemos hacer para desde nuestro proceso interactuar con el usuario, es una mala política hacerlo. No recomiendo hacerlo más allá de interactuar con el componente TaskStatus para ir informando del progreso de nuestro proceso. Solo en caso de que sea necesario hacerlo deberíamos interactuar con el GUI desde un proceso que se espera que esté haciendo algún tipo de tarea en segundo plano.

Espero que haya servido para ilustrar cómo estructurar este tipo de tareas en gvSIG, y qué recursos tenemos a nuestro alcance para facilitarnos hacerlas.

Un saludo

Joaquin

Posted in development, gvSIG Desktop, spanish | Tagged | 1 Comment

Hilos y gvSIG (3 de 4): Estructura de nuestro proceso

En el articulo anterior, “Hilos y gvSIG (2 de 4): TaskStatus“, vimos las funcionalidades relacionadas con la utilidad TaskStatus, ahora vamos a ver cómo podríamos hacer para crear un proceso y ejecutarlo como un hilo de ejecución independiente de gvSIG que nos permita dejar al usuario seguir interactuando con el resto de la aplicación mientras éste se esta ejecutando. Para eso crearemos dos clases, MyExtension, que será una extensión de gvSIG encargada de lanzar el proceso y MyProcess, que estará implementado mediante un hilo de java.

En lo que respecta a nuestra extensión tendremos que tener encuenta algunas cosas:

  • Cada vez que el usuario lo solicite lanzará la ejecución de nuestro proceso en un hilo aparte.
  • Si se intenta ejecutar y el proceso ya está en ejecución presentará un mensaje al usuario indicando que en estos momentos ya está en ejecución nuestro proceso indicando que no podrá ejecutarlo hasta que éste termine.
  • La herramienta estará visible siempre, pero solo estará activa si no está nuestro proceso en ejecución.

Para esto nuestra extensión guardará una referencia a nuestro proceso, y en el método isEnabled comprobará si tenemos una instancia de nuestro proceso y si esta está viva a través del método isAlive de la clase Thread. Así mismo, en el execute se realizará una comprobación similar antes de lanzar la ejecución del proceso.

Veamos cómo seria el código de nuestra extensión:

public class MyExtension extends Extension {

  @SuppressWarnings("unused")
  private static Logger logger = LoggerFactory.getLogger(MyExtension.class);

  private MyProcess process = null;

  public void initialize() {

    // Do nothing
  }
  public void execute(String actionCommand) {

    if ("tools-devel-my-process".equalsIgnoreCase(actionCommand)) {
      if (process != null && process.isAlive()) {

        ApplicationManager application = ApplicationLocator.getManager();
        application.messageDialog(
            "Process already running. Wait to terminate.",

            "Test task", JOptionPane.WARNING_MESSAGE);
        return;
      }
      process = new MyProcess();

      process.start();
    }
  }
  public boolean isEnabled() {

    if (process != null && process.isAlive()) { 
      return false;

    }
    return true;
  }
  public boolean isVisible() {

    return true;
  }
}

Una vez ya tenemos preparada nuestra extensión veamos qué tendríamos en nuestra clase MyProcess. De forma general, asumiremos que nuestro proceso tendrá una serie de tareas previas, un bloque de tareas constituido por un bucle en el que a cada pasada se van ejecutando nuestro proceso y una serie de tareas a ejecutar a la finalización de éste. Así mismo, para el caso de ejemplo, voy a suponer que sé el número de iteraciones que va a hacer el proceso, lo que me permitirá informar a través del TaskStatus del avance del proceso. Tendremos definidos los siguientes métodos:

  • run, se tratará del hilo principal de ejecución. Contendrá el código principal de nuestro proceso haciendo las veces de main de éste.
  • preProcess, el método en el que englobaremos las tareas previas al bloque principales de nuestro proceso.
  • processItem, que será el encargado de procesar cada uno de los ítems de nuestro proceso.
  • postProcess, que realizará las tareas de finalización de nuestro proceso.

Los pasos a hacer en el método run serian:

  1. realización de la tareas previas:

    this.preProcess();
  2. Comprobar si se ha solicitado la cancelación del proceso:

    if (status.isCancellationRequested()) {
      status.cancel();
      return;
    
    }
  3. inicializar el status con el número de iteraciones que va a tener nuestro proceso:

    status.setRangeOfValues(1, this.maxValue);
  4. Iterar, comprobando al comienzo de cada iteración si se ha solicitado la cancelación
    del proceso y estableciendo el estado de progreso:

    for (int i = 1; i < this.maxValue; i++) {
    
      // Si ha sido solicitada la cancelacion de la tarea
      // la marcamos como cancelada y salimos del proceso.
      if (status.isCancellationRequested()) {
    
        status.cancel();
        return;
      }
      // Informamos del progreso de la tarea
      status.setCurValue(i);

    A cada iteración realizaremos las tareas propias de nuestro proceso:

    this.processItem(i);
  5. Realizar las tareas de post-proceso:

    this.postPrecess();
  6. Comprobar si se ha solicitado la cancelación durante la ejecución de las tareas
    de post-proceso:

    if (status.isCancellationRequested()) {
      status.cancel();
    
      return;
    }
  7. A la terminación de nuestro proceso marcar el status como terminado.
    Normalmente esto lo haremos en la instrucción finally, para asegurarnos
    que a la salida de nuestro proceso siempre se actualiza el estado de
    éste:

    } finally {
    
      if (status != null) {
        // Mark process as terminate if it is running.
        if (status.isRunning()) {
    
          status.terminate();
        }
      }
    }

Es importante tener en cuenta algunas consideraciones:

  • Deberemos consultar si se ha pedido la cancelación de nuestro proceso, a cada iteración de éste, o si se trata de un proceso muy pesado, con un alto número de iteraciones, cada cierto número de éstas que sea razonable en tiempo de usuario.
  • Deberemos atrapar los errores de forma adecuada. Hay que tener en cuenta que si éstos se producen no se propagarán hasta el interface de usuario de la aplicación, y el usuario puede no enterarse de problemas durante la ejecución de nuestro proceso.
  • Deberemos marcar nuestro proceso como terminado a su finalización, lo que normalmente haremos con la clausula finally
  • No podremos interactuar con el interface de usuario directamente. Swing no está preparado para trabajar en multihilo, así que solo podremos hacerlo a través de métodos que estén preparados para ello o utilizando los métodos invokeLater e invokeAndWait de la clase SwingUtilities de swing tal como vimos en el ejemplo de la clase MyObserver.

Con todas estas consideraciones en mente veamos como podría quedar nuestra clase MyProcess :

public class MyProcess  extends AbstractMonitorableTask {

  private static Logger logger = LoggerFactory.getLogger(MyProcess.class);

  private ApplicationManager application = null;
  private int maxValue = 100;

  private long sleepTime = 100;

  protected MyProcess() {

    super("MyProcess");
    this.application = ApplicationLocator.getManager();

  }
  public void run() {
    SimpleTaskStatus status = null;

    try {
      status = (SimpleTaskStatus) this.getTaskStatus();

      this.preProcess();
      if (status.isCancellationRequested()) {

        status.cancel();
        return;
      }
      status.setRangeOfValues(1, this.maxValue);

      for (int i = 1; i < this.maxValue; i++) {

        // Si ha sido solicitada la cancelacion de la tarea
        // la marcamos como cancelada y salimos del proceso.
        if (status.isCancellationRequested()) {

          status.cancel();
          return;
        }
        // Informamos del progreso de la tarea
        status.setCurValue(i);

        this.processItem(i);
      }
      this.postPrecess();

      if (status.isCancellationRequested()) {
        status.cancel();

        return;
      }
      application.message("Process terminated", JOptionPane.INFORMATION_MESSAGE);

    } catch (Exception e) {
      logger.info("Error in process", e);

      if (status != null) {
        status.abort();

      }
      application.message("Process error", JOptionPane.WARNING_MESSAGE);
      application.messageDialog(

              "Se ha producido un error realizando el proceso y este terminara de forma inesperada.\n\n"
                  + e.getMessage(), this.getName(),
              JOptionPane.WARNING_MESSAGE);

    } finally {
      if (status != null) {

        // Mark process as terminate if it is running.
        if (status.isRunning()) {
          status.terminate();

        }
      }
    }
  }
  private void preProcess() {

    ...
  }
  private void processItem(int i) throws InterruptedException {

    ...
  }
  private void postPrecess() {
    ...

  }
}

Tal como se han descrito las clases MyExtension y MyProcess, éstas podrían quedar como un esquema general a la hora de implementar procesos en gvSIG. Las adaptaríamos a nuestras necesidades y las podríamos utilizar de cara a construir nuestros procesos de forma que no fuesen bloqueantes respecto al interface de gvSIG.

En el próximo articulo, “Hilos y gvSIG (4 de 4): Interactuando con el usuario“, vamos a seguir viendo cómo podemos abordar algunas cosas más relacionadas con el manejo de hilos, y veremos en un ejemplo sencillo qué podemos tener en los metodos preProcess y processItem, y cómo podríamos hacer para interactuar desde ellos con el interfaz de usuario en caso de que lo necesitásemos.

Un saludo

Joaquin

Posted in development, gvSIG Desktop, spanish | Tagged | 2 Comments

Hilos y gvSIG (2 de 4): TaskStatus

En el articulo anterior, “Hilos y gvSIG (1 de 4)“, vimos una introducción a lo que podían ser la herramientas que nos ofrece gvSIG para crear nuestros propios procesos sin que estos bloqueen la interface de usuario de gvSIG.
Vamos a continuar con ello viendo las utilidades relacionadas con el TaskStatus.

Para gestionar el estado y progreso de tareas o procesos en gvSIG disponemos del mecanismo de TaskStatus, que se encuentra implementado en la librería de org.gvsig.tools. Las principales entidades relacionadas con este mecanismo que nos encontraremos serán:

  • TaskStatus. Que representa el estado en el que se encuentra un proceso o tarea. Tiene métodos para consultar el estado en que se encuentra la tarea, pero no para establecerlo. Este interface es el que deben usar los procesos que quieren consultar el estado de otros procesos.
  • TaskStatusManager. Hace de factoría para la creación de TaskStatus, así como mantiene un registro de éstos para poder consultar el estado de las tareas que se encuentren en ejecución.
  • SimpleTaskStatus. Extiende el interface TaskStatus con métodos que nos permiten actualizar el estado de la tarea. Es usado por la propia tarea o proceso para mantener actualizado la información de su estado.
  • AbstractMonitorableTask. Se trata de una clase abstracta que extiende a la clase Thread, añadiéndole métodos para obtener el TaskStatus asociado a éste. Normalmente cuando creemos nuestros procesos extenderemos de esta clase en lugar de la clase Thread.

El TaskStatus, nos da información sobre el estado del proceso, nos informa de características del proceso como:

  • Si se puede determinar la duración del proceso. Es decir si es posible calcular qué llevamos y cuánto falta (isIndeterminate).
  • Si el proceso es cancelable o no (isCancelable).
  • Un titulo identificativo del proceso (getTitle)

También nos permite consultar el progreso de nuestro proceso:

  • Consultar el porcentaje de avance de éste (getCompleted)
  • O una etiqueta que identifique qué esta haciendo en un momento dado (getLabel).

Nos permite solicitar la cancelación del proceso (cancelRequest). No nos permite cancelarlo, esto es algo que el propio proceso debe decidir, desde fuera lo único que podemos hacer es pedir que cancele su ejecución.

Y por último consultar su estado:

  • isRunning, el proceso está en ejecución.
  • isRequestCanceled, el proceso está en ejecución y se ha solicitado su cancelación.
  • isAborted, el proceso ha abortado su ejecución, normalmente debido a algún error durante la ejecución de éste.
  • isCancelled, el proceso se ha cancelado por petición externa a éste, normalmente por la intervención del usuario o de algún otro proceso invocando al método cancelRequest.

El TaskStatusManager, nos permite crear instancias de TaskStatus mediante el método createDefaultSimpleTaskStatus, y añadir, consultar, o eliminar un TaskStatus de la lista de status que mantiene.

Tanto el TaskStatus, como el TaskStatusManager son observables, y permiten registrar observadores para poder seguir el estado de una tarea. Así si quisiésemos presentar información de las tareas que hay en ejecución en un momento dado solo tendríamos que registrarnos como observadores del taskStatusManager. Si lo hiciésemos tendríamos que tener la precaución de asegurarnos en el método update de nuestro observador que estamos en el hilo de ejecución de swing antes de presentar la información en el interface gráfico. Podría ser algo como:

class MyObserver implements Observer {
  public void update(final Observable observable,final Object notification) {

    if (!SwingUtilities.isEventDispatchThread()) {
      SwingUtilities.invokeLater(new Runnable() {

        public void run() {
          update(observable,notification);

        }
      });
      return;
    }
    ...
    Procesar notificacion
    ...

  }
}

Si estamos observando al TaskStatusManager recibiremos como observable a éste y como notification el TaskStatus involucrado o null. Por ejemplo, añadir un taskstatus al manager o modificar un taskstatus registrado en el manager provocará que nos llegue como notification el taskstaus añadido o modificado y cuando se elimine uno nos llegara el que queremos eliminar o null.

El otro interface importante relacionado con TaskStatus es el SimpleTaskStatus. Se trata del interface que usará un proceso o tarea para mantener actualizado su estado. Añade los siguientes métodos al TaskStatus:

  • add y remove, que provocaran que el TaskStatus se registre o elimine en el manager para poder estar en la lista de tareas disponibles de forma publica.
  • setAutoremove y getAutoremove, que nos permitirán consultar y fijar la propiedad autoremove, que indica si el TaskStatus deberá ser eliminado del manager al terminar su ejecución de forma automática o no.
  • setCancelable para indicar si nuestro proceso es cancelable o no.
  • terminate para indicar que nuestro proceso ha terminado su ejecución y además lo ha hecho de forma correcta.
  • cancel para indicar que nuestro proceso ha terminado su ejecución debido a una petición de cancelación.
  • abort para indicar que nuestro proceso ha terminado su ejecución debido a una condición de error.
  • setRangeOfValues y setCurValue para que indiquemos, si procede, cuál va a ser la duración del proceso y en qué estado se encuentra. Estos valores serán usados para calcular el getCompleted y el isIndeterminate.
  • setTitle y message para ofrecer una información textual del avance del proceso.

Normalmente no crearemos directamente un TaskStatus, sino que para crear nuestro propio proceso extenderemos de la clase AbstractMonitorableTask. Esta instanciará y registrará en el manager una instancia de TaskStatus, añadiendo los métodos:

  • cancelRequest, que nos permitirá solicitar la cancelación de nuestro hilo.
  • getTaskStatus, que nos permitirá obtener el TaskStatus asociado al hilo.

Con todas estas piezas a nuestra disposición vamos a ver cómo podríamos hacer una pequeña extensión para gvSIG que lance un proceso en un hilo aparte, y cómo habría que hacer en este hilo para ir informando del progreso de su ejecución a gvSIG y que éste pueda mostrar esa información.

Crearemos tres clases:

  • MyExtension, que será la encargada de lanzar nuestro proceso, controlando que no se pueda volver a lanzar mientras no haya terminado la ejecución de éste.
  • MyProcess, que extenderá a AbstractMonitorableTask, y tendrá el código de nuestro proceso.
  • MyDialog, que representara un pequeño cuadro de dialogo con algunas propiedades que puede requerir nuestro proceso.

En el próximo articulo,”Hilos y gvSIG (3 de 4): Estructura de nuestro proceso“,  continuaremos viendo cómo estructurar nuestra extensión y nuestro proceso.

Un saludo

Joaquin

Posted in development, gvSIG Desktop, spanish | Tagged | 2 Comments

Hilos y gvSIG (1 de 4)

En muchas ocasiones tenemos que implementar algún proceso en gvSIG que requiere cierto tiempo, y al ejecutarlo deja bloqueada la interface de usuario. Este tipo de procesos son candidatos ideales para ejecutarlos en un hilo separado permitiendo así que el usuario pueda interactuar con otras partes de gvSIG mientras éste se esta ejecutando. Sin embargo muchas veces no lo hacemos por que esto conlleva cierta complicación añadida. Intentar acceder al interface de usuario desde un hilo que no sea el hilo principal de gvSIG puede causar efectos inesperados en ella o incluso provocar que ésta quede bloqueada. Algo tan simple como actualizar una barra de progreso o presentar un mensaje al usuario desde el hilo de nuestro proceso puede convertirse en una pesadilla.

Ahora bien, en gvSIG 2 se han introducido algunas herramientas que nos pueden facilitar estas cosas. No es que nos vayan a quitar todo el trabajo o que podamos desentendernos de los problemas inherentes a trabajar con swing y múltiples hilos de ejecución, pero si ayudarnos con algunas cosas.

Las principales dificultades que nos solemos encontrar cuando intentamos ejecutar un proceso en un hilo separado de ejecución giran alrededor de:

  • Presentar al usuario un indicador del progreso de nuestro proceso.
  • Dar opción al usuario a poder cancelar la ejecución del proceso.
  • Poder presentar al usuario información o requerir de él información a lo largo de la ejecución del proceso. Por ejemplo durante la ejecución del proceso se produce alguna condición de error y queremos preguntar al usuario para poder continuar y no abortar la ejecución de éste.

En relación a estas tareas podemos encontrar algunas herramientas en gvSIG para ayudarnos con ellas. En la librería org.gvsig.tools nos encontraremos con:

  • TaskStatus. Un mecanismo que nos permite gestionar el estado de nuestro proceso. Si se encuentra en ejecución, qué medida de progreso tiene, en qué estado del proceso se encuentra, o requerir su cancelación si fuese necesario.
  • AbstractMonitorableTask. Una clase que extiende a Thread integrando con él un TaskStatus para su gestión.

Y en la clase ApplicationManager del plugin org.gvsig.app, encontraremos métodos que nos permiten:

  • Presentar mensajes en la barra de estado de la aplicación
  • Presentar cuadros de dialogo del tipo de showMessageDialog.
  • Presentar cuadros de dialogo del tipo de showConfirmDialog.
  • Presentar cuadros de dialogo del tipo de showInputDialog.
  • Construir componentes de swing
  • Presentar cuadros de dialogo al usuario

Todo ello asegurándose que estas tareas se ejecutan en el hilo de ejecución del manejador de swing de forma que no tengamos que preocuparnos por esto desde el hilo de nuestro proceso.

Además de estas herramientas, el entorno de andami esta pendiente de las instancias de TaskStatus que se van creando y presenta en la barra de estado de la aplicación información resumida de estas de forma automática, para que no tengamos que preocuparnos por generar interface de usuario para ellas si no queremos una presentación específica.

A lo largo de estos cuatro artículos veremos:

  1. Cuáles son los principales métodos y funcionalidad que nos ofrece el artefacto TaskStatus.
  2. Cuál podría ser la estructura de nuestro proceso y como lanzarlo desde una extensión.
  3. Cómo podríamos interactuar con el usuario de forma simple desde nuestro proceso.

En el próximo artículo, “Hilos y gvSIG (2 de 4): TaskStatus“,  continuaremos viendo cuáles son las principales funcionalidades que nos ofrecen las utilidades de TaskStatus.
Un saludo

Joaquín

Posted in development, gvSIG Desktop, spanish | Tagged | 1 Comment

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