gvSIG October: 10 years sharing and building (Updating)

This post is being updated continuously with more information about new events

As Thoreau would say “Time is but stream I go a-fishing in”. This October it will be ten years after the first version of gvSIG. It’s now 10 years old¡

To celebrate the anniversary, some gvSIG Communities suggested various activities throughout October. The project begun informally but, increasingly, new activities have arisen since that time so, on the one hand, we announce activities that are confirmed and on the other hand, we also call on all gvSIG Communities to participate in the process and to submit new proposals throughout October.

In some cases it has been timed National gvSIG Meeting to coincide with “gvSIG Month”, in others talks at universities are ongoing, several webinars are planned,…and much more that we hope to confirm shortly. We are confident that all of these events will be of great interest to the Community.

We also hope gvSIG 2.1 to be ready in October. This is a new version, which is already receiving very positive feedback, even in the Build Verification Testing. We will also continue to work on improving gvSIG with new developments, which will take many by surprise. There are more things we are doing, a new website, new extensions,..

On the other hand, a new call for on-line courses has been launched with significant discounts. We therefore hope to facilitate certified training for everyone (in addition to offer a free i3GEO course).

Activities confirmed in alphabetical order by country:

  • Webinars: organized in collaboration with MundoGEO.
    • gvSIG applied to criminology. Given by ICSPOL, the unity for data analysis of the Local Police in Castellón (Spain) and the collaboration of CRÍMINA (Centre for crime prevention and study) and the Criminology Institute at the Basque Country.
      • Language: Spanish.
      • Date: October 7th.
    • Watershed mapping with gvSIG. Given by Gilberto Cugler.
      • Language: Portuguese.
      • Date: October 10th.
    • gvSIG applied to fauna and protected Natural landscapes. Given by eGeoMapping.
      • Language: Spanish.
      • Date: October 14th.
  • MOOC, Massive Online Open Courses:
    • Mobile devices for Territory management. New edition of this course, at the  UPV online learning platform [X].
      • Given by Israel Quintanilla and Aurea Gallego (Dpto. de Ingeniería Cartográfica, Geodesia y Fotogrametría, ETSI Geodésica, Cartográfica y Topográfica, Universidad Politécnica de Valencia).
      • Language: Spanish.
      • More information: http://cursodispositivosmoviles.upvx.es/ficha
  • Argentina:
  • Brazil:
    • Event Commemorating 10 years of gvSIG in UFPR Litoral.
      • Seminar: Free and Open Source Geotechnologies. 10 years of gvSIG. Venue: UFPR Litoral (Matinhos-PR). Schedule start time : 18h. Speakers : : PhD.Édina M. Vergara – UFPR Litoral, PhD. Alexandro G. Schäfer – UNIPAMPA – Bagé-RS, PhD Nelson C. Rosot – UFPR, PhD. Student Ricardo Monteiro – UFPR Litoral, Gilberto Cugler.
      • Side Event 1: gvSIG Course (30h). Lecturer : Gilberto Cugler. Dates : 22-24/10. Venue : UFPR Litoral;
      • Side Event 2: gvSIG Course for public school teachers (20h) – Dates : October-November. Lecturer : Ricardo Monteiro. Venue : UFPR Litoral.
        For futher information, please contact: ricardoarqui@yahoo.com.br
    • gvSIG Anniversary Celebration Event. Event promoted by Hímaco Group at Public Archive in the State of São Paulo. This event will have the participation of Hímaco Members and they approached the following themes : 1) Open source software, past and present status (Luis Ferla). 2) Historic GIS and work of Hímaco (Delphine Lacroix, Maíra Rosin e Orlando Guamier). Entry free of charge until capacity reached (30 seats). A certificate will be awarded to all participants.
      For further information, please contact: grupohimaco@gmail.com
  • Ecuador:
    • Second World Unigis Forum (Quito, 2014). A workshop on “Opengis for geomatic projects” will take place during the event. Members of Ecuador gvSIG Community will teach the workshop and it will take place in USFQ (Cumbayá, Quito) during October 22-23.
  • Spain:
  • Mexico:
    • gvSIG Workshop for Civil Associations and Social Groups of Guadalajara: Hosted by GeoAlternativa. Further details of the dates will be shortly be announced.
      Contact information: alonsomorilla@geoalternativa.com
  • Uruguay:

There are more activities planned in other countries, but will be published shortly.

We will be updating this post as soon as we have more confirmed activities.

Those interested in taking part write to info@gvsig.com

Posted in opinion | Leave a comment

Cargar capas en base de datos desde gvSIG

Hola a todos de nuevo.

Hace unos días tuve que corregir algún error que otro en el asistente de exportación a BBDD y acabe tocando mas cosas de las que esperaba, así que aquí estoy contando un poco como ha quedado.

Se me juntaron unas cuantas peticiones…

  • Añadir datos a una tabla ya existente.
  • Que avise si la tabla ya existe antes de intentar crearla.
  • Que sea capaz de validar las geometrías antes de cargarlas en la BBDD y comprobar si alguna esta corrupta.
  • Que presente información al usuario sobre los errores que se producen para que este pueda tomar medidas correctoras.
  • Que no inserte ningún registro en la BBDD si se produce algún error que provoca que se aborte la operación.
  • Que proponga un nombre de tabla a crear basado en el nombre de la tabla que se quiere exportar.
  • No estaba nada claro que era eso de la clave primaria, clarificarlo y permitir elegir un campo de los que ya existan como clave primaria.
  • Que mejore la usabilidad a la hora de introducir los datos de la conexión.
  • Espacios en blanco y mayúsculas en los identificadores
  • Que una vez introducidos los datos de la conexión, bastase con pulsar en siguiente para acabar exportando los datos si no había ningún contratiempo.

Así que con todas estas cosillas en mente rehice casi todo el asistente. Ahora el asistente esta dividido en 6 pasos o paginas.

  1. Opciones sobre los identificadores a usar.

    Nos permite seleccionar dos checks:

    • Uno para indicar que queremos que se utilicen solo minúsculas en los identificadores de campos y tabla.
    • Otro para indicar que no queremos espacios en blancos en los identificadores, y si aparecen que los sustituya por el carácter de subrayado.

    No es que gvSIG no trate bien con las mayúsculas o los espacios en blanco. Lo que pasa es que hay otras aplicación que al interactuar con tablas con blancos o campos en mayúsculas o no lo hacen correctamente o requieren que el usuario vaya escapando esos caracteres lo que se hace mas engorroso.

    Estos dos check aparecen marcados por defecto.

  2. Opciones de conexión.

    Nos pregunta por los parámetros de conexión:

    • Tipo de conexión (JDBC genérica, PostgreSQL,…)
    • Nombre de maquina donde esta el servicio.
    • Puerto en el que esta el servicio.
    • Nombre de la base de datos que queremos usar
    • Usuario
    • Clave

    Aquí también podremos dar un nombre a esta configuración de conexión para poder reutilizarla mas tarde.

  3. Tabla a crear

    Aquí tendremos que elegir entre crear una tabla nueva o añadir los datos a una existente.

    Si los parámetros de conexión indicados en el paso anterior son correctos, nos mostrara la lista de tablas en la base de datos y nos permitirá elegir una a la que añadirlos.

    Si seleccionamos la opción de crear una nueva, que es el valor por defecto, tendremos que indicar el esquema y el nombre de tabla. Nos propondrá como valores por defecto “public” para el esquema y como el nombre de la tabla el nombre de la que queremos exportar.

    Si al darle a siguiente ya existiese esa tabla no nos dejara avanzar en el asistente informándonos de que esa tabla ya existe, y si introdujimos espacios o mayúsculas nos preguntara si queremos que nos los arregla automáticamente o no, dejándonos en esa pagina del asistente en caso de que le digamos que no para que lo arreglemos nosotros.

  4. Clave primaria.

    Nos dará a elegir entre crear una nueva clave primaria única basada en un valor autoincrementado o si queremos usar como clave primaria una ya existente. Por defecto estará marcada la opción de crear una nueva, y nos propondrá ya un nombre “pk”.

    Si indicamos que queremos usar un campo ya existente, tendremos que elegir de una lista de campos el que deseemos.

  5. Validar las geometrías.

    Cuando vamos a cargar datos en una BBDD es muy recomendable que las geometrías que carguemos sean “correctas”. Esta pagina nos permitirá seleccionar entre varia opciones para tratar esto:

    • No hacer nada especial, las geometrías se insertan tal cual y si se produce un error al hacerlo se aborta el proceso.

    • Verificar que no hay ninguna geometría que por alguna razón este corrupta, normalmente debido a que se cargo de algún tipo de formato que era muy relajado a la hora de permitir almacenar geometrías, por ejemplo de lineas con un solo punto o polígonos con menos de dos.

      Si seleccionamos esta opción, tendremos que elegir entre tres posibles acciones a realizar cuando se de esto:

      • Insertar la feature entera con el campo geometría a null.
      • No insertar la feature y pasar a la siguiente.
      • Fallar, y abortar el proceso.
    • Verificar que las geometrías son “validas” (ST_isValid). Y si no lo son tendremos, por un lado un check para intentar corregir el problema de forma automáticamente, y en caso de que no elegir entre tres posibles acciones a realizar, que serán las mismas que en el caso anterior.

    Por defecto estará marcada la primera opción, no hacer nada especial en relación a las geometrías.

  6. Selección de las features.

    Por ultimo tendremos que indicar que features queremos cargar. Podremos:

    • Insertar todas las features de la tabla, que sera la opción que viene marcada por defecto.
    • Insertar solo las features seleccionadas, que insertara solo aquellas features que estén seleccionadas en la tabla o capa de origen.
    • Y Aplicar un filtro, en donde podremos aplicar un filtro usando la sintaxis de un “where” de SQL que podremos guardar asignándole un nombre.

Una vez pasado por estas paginas del asistente se iniciara el proceso de exportación a la BBDD, y en caso de producirse un error presentara un dialogo intentando describir cual a sido el problema, y en caso de que se haya dado procesando una feature en concreto, nos permitirá ver los valores de la feature que ha lo ha ocasionado.

Bueno, y esto es todo.

Hasta otra.

Posted in development, gvSIG Desktop, opinion, spanish | Leave a comment

Nueva convocatoria de cursos gvSIG-Training en español y portugués

Anunciamos el inicio del proceso de inscripciones de los Cursos a Distancia de gvSIG-Training, con el segundo corte de 2014, que forman parte de la oferta del Programa de Certificación de la Asociación gvSIG. Con motivo del décimo aniversario del proyecto gvSIG muchos de los cursos tienen descuento, y se incluye también un curso gratuito de i3Geo. El proceso de inscripciones da inicio según se detalla a continuación:

En la modalidad de Matrícula Restringida (con Cupos Limitados) y con inscripciones ya abiertas:

  • Cursos gvSIG:
  1. gvSIG para usuarios (Idioma: Español) 9na. Edición. Duración: 10 semanas. Inicio: 06/10/2014. Créditos para Certificación Usuario gvSIG: 90. Costo: 295 euros (promoción 10mo aniversario gvSIG: 195 euros)
  • Cursos gvSIG Aplicado:

2. gvSIG aplicado a la Gestión de Pavimentos y Vialidad (Idioma: Español) 4ta. Edición. Duración: 4 semanas. Inicio: 13/10/2014. Créditos para Certificación Experto gvSIG: 40. Costo: 295 euros (promoción 10mo aniversario gvSIG: 150 euros)
3. gvSIG + EPASWMM aplicado al diseño y gestión de redes de saneamiento y drenaje urbano (Idioma: Español) 4ta. Edición. Duración: 4 semanas. Inicio: 06/10/2014. Créditos para Certificación Experto gvSIG: 40. Costo: 295 euros (promoción 10mo aniversario gvSIG: 150 euros)
4. gvSIG aplicado a la Gestión Municipal (Idioma: Español) 5ta Edición. Duración: 4 semanas. Inicio: 13/10/2014. Créditos para Certificación Experto gvSIG: 30. Costo: 295 euros (promoción 10mo aniversario gvSIG: 195 euros).
5. gvSIG + EPANET aplicado al diseño y gestión de redes de abastecimiento (Idioma: Español) 3ra. Edición. Duración: 4 semanas. Inicio: 06/10/2014. Créditos para Certificación de Experto gvSIG: 30. Costo: 295 euros (promoción 10mo aniversario gvSIG: 150 euros).

  • Cursos Geoprocesamiento y Análisis Espacial:

6. Geoprocesamiento Avanzado sobre gvSIG (Idioma: Español) 7ma Edición. Duración: 10 semanas. Inicio: 22/09/2014. Créditos para Certificación Experto gvSIG: 75. Costo: 395 euros.
7. Geoprocesamiento Avanzado sobre gvSIG (Idioma: Portugués) 1era. Edición. Duración: 10 semanas. Inicio: 22/09/2014. Créditos para Certificación Experto gvSIG: 75. Costo: 395 euros.
8. Análisis del Terreno e Hidrológico (Idioma: Español) 2da. Edición. Duración: 4 semanas. Inicio: 22/09/2014. Créditos para Certificación Experto gvSIG: 30. Costo: 79 euros.
9. Análise do relevo e hidrológica (Idioma: Portugués) 1era. Edición. Duración: 4 semanas. Inicio: 22/09/2014. Créditos para Certificación Experto gvSIG: 30. Costo: 79 euros.
10. Análisis de Visibilidad e iluminación (Idioma: Español) 2da. Edición. Duración: 3 semanas. Inicio: 22/09/2014. Créditos para Certificación Experto gvSIG: 20. Costo: 59 euros.
11. Análise de visibilidade e Iluminação (Idioma: Portugués) 1era. Edición. Duración: 3 semanas. Inicio: 22/09/2014. Créditos para Certificación Experto gvSIG: 20. Costos: 59 euros.
12. Análisis de Perfiles y Secciones transversales (Idioma: Español) 1era. Edición. Duración: 3 semanas. Inicio: 22/09/2014. Créditos para Certificación Experto gvSIG: 20. Costo: 59 euros.
13. Análise de perfis e seções transversais (Idioma: Portugués) 1era. Edición. Duración: 3 semanas. Inicio: 22/09/2014. Créditos para Certificación Experto gvSIG: 20. Costo: 59 euros.
14. Análisis de Costes y Rutas óptimas (Idioma: Español) 1era. Edición. Duración: 3 semanas. Inicio: 22/09/2014. Créditos para Certificación de Experto gvSIG: 20. Costo: 59 euros.
15. Análise de Custos e rotas ótimas (Idioma: Portugués) 1era. Edición. Duración: 3 semanas. Inicio: 22/09/2014. Créditos para Certificación Experto gvSIG: 20. Costo: 59 euros.

En la modalidad de Matrícula Abierta (con inscripciones ya abiertas, de forma permanente):

1. Bases de Datos Geoespaciales: PostgreSQL – PostGIS (Idioma: Español). Duración: 6 semanas. Créditos para Certificación IDE: 60. Costo: 295 euros.
2. Análisis de Redes con gvSIG Desktop (Idioma: Español). Duración: 2 semanas. Créditos para Certificación Experto gvSIG: 20. Costo: 75 euros.
3. Navtable y Normalización de Tablas (Idioma: Español). Duración: 1 semana. Créditos para Certificación Experto gvSIG: 10. Costo: 60 euros.
4. Publicación de Servicios OGC (Idioma: Español). Duración: 1 semana. Créditos para Certificación Experto gvSIG: 20. Costo: 75 euros.
5. Análisis Geoestadístico con gvSIG y Sextante (Idioma: Español). Duración: 3 semanas. Créditos para Certificación Experto gvSIG: 20. Costo: 165 euros.
6. Uso, creación y gestión de metadatos de información geográfica. Duración: 2 semanas. Créditos para Certificación IDE: 20. Costo: 90 euros.
7. Análisis de datos LiDAR y determinación de caudales punta mediante gvSIG, HEC HMS. Duración: 6 semanas. Créditos para Certificación Experto gvSIG: 60. Costo: 345 euros.
8. gvSIG 3D y animación (Idioma: Español). Duración: 2 semanas. Créditos para Certificación Experto gvSIG: 30. Costo: 75 euros.

Al participar en cualquiera de estos cursos obtienes créditos del programa de certificación gvSIG que te permite optar a la certificación “gvSIG Usuario” y “gvSIG Usuario Experto” [2]; al mismo tiempo que contribuyes al sostenimiento del proyecto gvSIG.

Todos los cursos de la plataforma gvsig-training pueden ser bonificables al 100% para trabajadores en activo en España a través de la Fundación Tripartita para la Formación en el Empleo. Más información sobre esta bonificación en [3], o a través de la cuenta de correo contacto@gvsig-training.com.

Además incorporamos una NUEVA MODALIDAD. Matrícula Abierta y Gratuita, con el curso:

1. i3Geo. Framework para Geoportales (Idioma: Portugués). Duración: 2 semanas. Costo: GRATIS.

Para mayor información visita nuestra plataforma [1] o escríbenos a la siguientes direcciones de correo electrónico: inscripciones@gvsig-training.com ó info@gvsig-training.com

[1] http://www.gvsig-training.com
[2] http://www.gvsig.com/servicios/certificacion/certificacion
[3] http://pdfs.gvsig-training.com/Condiciones_Fundacion_Tripartita_ESP.pdf

Posted in gvSIG Association, gvSIG Desktop, i3Geo, spanish, training | Leave a comment

Checking geometries

Traduzco un post publicado por Joaquín del Cerro hace unos días que puede ser interesante:Hello everyone back again,It was some time ago I didn’t write this blog but I have been really busy working on new gvSIG developments. Anyway the other day, somebody said me they needed a new tool for check geometry problems in a table before load it into a posgreSQL database. They told me….

“It would be nice if we could have a tool that processes geometries in a layer, list all the problems and it allows clicking the geometry conflict and, better yet, locating the geometry conflict”

Indeed, gvSIG does not have anything near it but straight away I thought that, with a bit of luck, I could get a similar tool which they need.

But the script isn’t as simple. It cuts across a whole range of variables although it is not too big and it can help to design more complex tools.

The principle is simple: we analyze the features of the layer, select geometry and we invoke the method: “getValidationStatus”. This method is designed to validate geometry and returns information about validation process: identify problems and if it is possible where they are. Thus, we are building up a little HTML validation report.

An entry is generated for each incident with the following information:

  • Line number where the incident is located
  • Dump data with feature for line
  • Description of the problem
  • Link to the incident is located. Instead of add an URL, we will add the WKT point for the incident layer.
wktgeom = vs.getProblemLocation().convertToWKT()
output.write('<a href="%s">%5.5d</a> %s<br>%s' % (wktgeom,i, feature.toString(),vs.getMessage()))

Once we have been analysed all the features we will have to generate the report. To do so, we will display a window with HTML text using “showTexDialog” function from “ApplicationManager”.

application = ApplicationLocator.getManager()
application.showTextDialog(
  WindowManager.MODE.TOOL,
  "Problems in layer "+layer.getName(),
  informe.getvalue()
)

It would be enough if we simply want to generate the report but it would be very nice if the incident area is displayed on the screen by clicking the incident in the report. To do this, we will have a bit more work to do. “showTextDialog” function allow us to pass a “listener” as optional parameter to receive events coming from HTML report. To do so, we will have to create a class to inherit from “HyperlinkListener”.

class MyHyperlinkListener(HyperlinkListener):
  def __init__(self,vista):
    self.vista = vista
    
  def hyperlinkUpdate(self, h):
    if str(h.getEventType()) == "ACTIVATED":
      wktgeom = h.getDescription()
      print wktgeom
      manager = GeometryLocator.getGeometryManager()
      point = manager.createFrom(wktgeom)
      centerViewinPoint(self.vista,point)

Our class will have in the constructor, a view to work with and we add the code to execute in “hyperlinkUpdate” method. The code will be executed every time while interact with link of our report. Either because we mouse over the link or because of we click on the link. We will insert the code in this method, verifying that click the link is filtered. Then, we will receive “ACTIVATED” event type. We will use the associated point for the hyperlink and rebuild our point according we had added to WKT point.

manager = GeometryLocator.getGeometryManager()
point = manager.createFrom(wktgeom)

And then you pan the view to the point

centerViewinPoint(self.vista,point)

There are a few more things to comment…

Sometimes, it will be run on the big layers and it would be nice if it included progress reporting. To do so, we will use “taskStatus” variable. It is associated with each script to report progress of the process. First of all, we associate it to the application status bar to see the progress of the process. That’s as simple as invoking the “add” method of the variable.

Then we will use the “setRangeOfValues” method to indicate the iterations necessary for our process. With this method, we will indicate that iterations go from 0 to number of records included in the layer to process.For each iteration, we will invoke “setCurValue” method to keep the process located. After our features have been reviewed we will invoke “terminate” method to get rid of “taskStatus” variable and indicate that the process is completed. Finally, we will use “remove” method to delete the variable from gvSIG status bar.

try:
  # Adding a progress bar to the gvSIG status bar
  taskStatus.add()
  # Indicate the number of iterations
  taskStatus.setRangeOfValues(0,layer.features().getCount())
  for feature in layer.features():
    # For each iteration there is a report process in the progress bar indicating where is located
    taskStatus.setCurValue(i)
    ...
    i+=1
finally:  
  # Finally
  # For indicate to the status bar the process is completed
  taskStatus.terminate()
  # To delete from gvSIG status bar
  taskStatus.remove()

Well, it still lacks many details like catching errors, StringIO use to create reports or generate HTML code, but I believe that people who know something about gvSIG scripting and python programming could follow it. At the end of this blog you will find the full code.

I also have a problem with “certerViewinPoint” method. There is some calculation error and we can’t correctly pan the view. That is a minor detail that you can improve if you work with the script.

I hope it will serve you as gvSIG tool and example of new types of scriptings.

To test the script you need a layer with damage or non valid geometries. I have any missed layer, if I located it, I upload the layer and I give you the link to test.

The script just run with gvSIG desktop 2.1.0 build 2231 or higher ;)

Greetings everyone

Joaquin

from gvsig import *
from org.gvsig.tools.swing.api.windowmanager import WindowManager
import StringIO
from commonsdialog import *
from javax.swing.event import HyperlinkListener
from org.gvsig.fmap.geom import GeometryLocator
from org.gvsig.fmap.geom import Geometry

def centerViewinPoint(view,center):
    env = view.getMap().getViewPort().getEnvelope();
    movX = center.getX()-env.getCenter(0);
    movY = center.getY()-env.getCenter(1);
    minx = env.getMinimum(0) + movX;
    miny = env.getMinimum(1) + movY;
    maxX = env.getMaximum(0) + movX;
    maxY = env.getMaximum(1) + movY;
    env = GeometryLocator.getGeometryManager().createEnvelope(
          minx, miny,
          maxX, maxY,
          Geometry.SUBTYPES.GEOM2D);
    view.getMap().getViewPort().setEnvelope(env);
    view.getMap().invalidate()


class MyHyperlinkListener(HyperlinkListener):
  def __init__(self,vista):
    self.vista = vista
    
  def hyperlinkUpdate(self, h):
    if str(h.getEventType()) == "ACTIVATED":
      # Just process “ACTIVATED” events which are the clicks on the links
      #  Collect the geometry we have used in WKT link.
      wktgeom = h.getDescription()
      print wktgeom
      # Collect Rebuild the point from WKT
      manager = GeometryLocator.getGeometryManager()
      point = manager.createFrom(wktgeom)
      # Once we have that, we pan the view to the point centerViewinPoint(self.vista,point)


def main(*args):
  layer = currentLayer()
  if layer == None:
    msgbox("Select layer to validate")
    return
  informe = StringIO.StringIO()  
  informe.write("<ul>\n")
  i=0
  hay_problemas = False
  try:
    # Add progress bar to gvSIG status bar.
    taskStatus.add()
    #  Indicate number of iterations that are going to be carried out.
    for feature in layer.features():
      # For each iteration, we will report to the progress bar to keep the process located
      taskStatus.setCurValue(i)
      vs = feature.geometry().getValidationStatus();
      if not vs.isValid() :
        hay_problemas = True
        if vs.getProblemLocation()!=None:
          wktgeom = vs.getProblemLocation().convertToWKT()
        else:
          try:
            # Catch the errors to avoid failure in calculating centroid
            # because of damage geometry.
            wktgeom = feature.geometry().centroid().convertToWKT()
          except:
            wktgeom = None
        informe.write("<li>")
        if wktgeom == None:
          informe.write('%5.5d %s<br>%s' % (i, feature.toString(),vs.getMessage()))
        else:
          informe.write('<a href="%s">%5.5d</a> %s<br>%s' % (wktgeom,i, feature.toString(),vs.getMessage()))
        informe.write("</li>")
      i+=1
  finally:  
    # Finally
    # Indicate the process is finished to the progress bar
    taskStatus.terminate()
    taskStatus.terminate()
    # And eliminate it from the gvSIG status bar.
    taskStatus.remove()
    
  informe.write("</ul>\n")
  if hay_problemas :
    application = ApplicationLocator.getManager()
    application.showTextDialog(
      WindowManager.MODE.TOOL, # TOOL or WINDOW  depending on whether we are interested.
      "Problems in layer "+layer.getName(),
      informe.getvalue(),
      MyHyperlinkListener(currentView())
    )
  else:
    msgbox("Layer "+layer.getName()+" is valid.")
Posted in development, english, gvSIG Desktop, scripting | Leave a comment

Validar las geometrías de una capa

Hola a todos de nuevo,

Hacia ya un tiempo que no escribía por aquí…cosas de ir bastante liado con nuevos desarrollos que estamos abordando en gvSIG…pero el otro día me comentaron que necesitarían una herramienta en gvSIG que les permitiera localizar problemas en las geometrías de una tabla antes de cargar dicha tabla en una BBDD de postgreSQL.

Me dijeron…

“Estaría bien disponer de una herramienta que procese las geometrías de una capa y me saque un listado con los problemas y me permita pinchar e ir a la geometría conflictiva y mejor aun a donde este el conflicto”

Efectivamente, gvSIG no tiene nada que se le parezca, pero enseguida pensé que igual con un poco de scripting podía sacar algo parecido a lo que me pedían.

El script no es simple, para que vamos a engañarnos, toca muchos palos, pero no es muy grande y puede servir de inicio para abordar cosas mas complejas.

El principio es simple… nos recorremos las features de la capa, cogemos la geometría, e invocamos al método “getValidationStatus” de esta. Este método realiza una serie de validaciones sobre la geometría y nos devuelve que ha pasado con esas validaciones… si todo fue bien o mal, y en caso de ir mal nos da información sobre que problema se encontró y si puede donde lo encontró. Con esta información, vamos a ir construyendo un pequeño informe en HTML.

Por cada incidencia que encontremos generaremos una entrada con:

  • El número de línea en el que se produjo la incidencia
  • Un volcado de los datos de la feature asociada a esa línea
  • Una descripción textual del problema
  • Un enlace al punto en donde se produjo la incidencia. En el hiperenlace, en lugar de poner una URL meteremos el punto en WKT asociado a la incidencia.
wktgeom = vs.getProblemLocation().convertToWKT()
output.write('<a href="%s">%5.5d</a> %s<br>%s' % (wktgeom,i, feature.toString(),vs.getMessage()))

Cuando ya nos hemos recorrido todas las features de la capa, tendremos que presentar el informe. Para ello utilizaremos la función “showTextDialog” del“ApplicationManager”, que nos permite mostrar una venta con un texto HTML.

application = ApplicationLocator.getManager()
application.showTextDialog(
  WindowManager.MODE.TOOL,
  "Problems in layer "+layer.getName(),
  informe.getvalue()
)

Si solo quisiésemos mostrar el informe con esto nos bastaría. Pero estaría muy bien que al pinchar sobre la incidencia en el informe nos centrase la vista en el área donde se ha producido la incidencia. Para esto tendremos que hacer un poco mas de faena. La función “showTextDialog” permite que le pasemos un ultimo parámetro opcional que sea un “listener” que recibirá los eventos relacionados con los hiperenlaces de nuestro informe en HTML. Para eso tendremos que crear una clase que herede de “HyperlinkListener”.

class MyHyperlinkListener(HyperlinkListener):
  def __init__(self,vista):
    self.vista = vista
    
  def hyperlinkUpdate(self, h):
    if str(h.getEventType()) == "ACTIVATED":
      wktgeom = h.getDescription()
      print wktgeom
      manager = GeometryLocator.getGeometryManager()
      point = manager.createFrom(wktgeom)
      centerViewinPoint(self.vista,point)

Nuestra clase recibirá en el constructor la vista sobre la que ha de trabajar, y en el método “hyperlinkUpdate” pondremos el código que se ejecutara cada vez que se interactúe con un enlace de nuestro informe, bien por que se pasa el ratón sobre el enlace, o por que se hace click sobre el. Así que nuestro código lo meteremos en este método cercionándonos que filtramos las acción de hacer click en el enlace que sera cuando recibamos un evento de tipo “ACTIVATED”. Lo que haremos será recoger el punto asociado del hiperenlace. Este lo habíamos metido en WKT, así que lo primero será reconstruir nuestro punto a partir de él.

manager = GeometryLocator.getGeometryManager()
point = manager.createFrom(wktgeom)

Y luego ya centrar la vista en ese punto.

centerViewinPoint(self.vista,point)

Mas cositas que comentar…

A veces lo ejecutaremos sobre capas grandes y estaría bien que fuese informando del progreso. Para ello utilizaremos la variable “taskStatus”. Todos los scripts tienen una asociada y sirve precisamente para eso, para ir informado del progreso de nuestro proceso. Lo primero que tendremos que hacer será asociarla a la barra de estado de la aplicación para que se vaya mostrando ahí el proceso. Tan simple como invocar al método “add” de ella.

Luego le indicaremos las iteraciones que va a tener nuestro proceso, para lo que utilizaremos el método “setRangeOfValues” indicando que las iteraciones irán desde 0 al número de registros que tiene la capa que vamos a procesar. En cada iteración invocaremos al método “setCurValue” para informar de por donde vamos, y al terminar de recorrer nuestras features nos desharemos de nuestro taskStatus invocando al método “terminate” para indicarle que ya termino nuestro proceso y al método“remove” para eliminarla de la barra de estado de gvSIG.

try:
  # Añadimos la barra de progreso a la barra de estado de gvSIG
  taskStatus.add()
  # Le indicamos cuantas iteraciones vamos a realizar
  taskStatus.setRangeOfValues(0,layer.features().getCount())
  for feature in layer.features():
    # En cada iteración informamos a la barra de progreso de por donde vamos
    taskStatus.setCurValue(i)
    ...
    i+=1
finally:  
  # Al terminar
  # Le indicamos a la barra de progreso que ya hemos terminado
  taskStatus.terminate()
  # Y la eliminamos de la barra de estado de gvSIG.
  taskStatus.remove()

Bueno, hay un montón de detallitos, como atrapar errores aquí y allí, el manejo del StringIO para generar nuestro informe o la generación del código HTML, pero creo que los que han estado ya viendo algunas cosillas del scripting en gvSIG y tienen algo de conocimiento de programación en python pueden seguirlo. Al final os dejo el código completo.

También tengo un problema en el metodo “centerViewinPoint”, algun cálculo no es correcto y no se centra bien la vista, pero creo que es un detalle menor que ya podréis pulir si os es de utilidad el script.

Espero que os sirva… como herramienta para gvSIG y como ejemplo de como hacer cosas nuevas en scripting.

Eso si, para probarlo precisareis de una capa con geometrías dañadas o no validas. Alguna tengo por ahi… a ver si puedo colgarla en algun sitio y la enzalo para que podais probar.

Para ejecutar el script precisareis un gvSIG desktop 2.1.0 build 2231 o superior ;)

Un saludo a todos

Joaquin

from gvsig import *
from org.gvsig.tools.swing.api.windowmanager import WindowManager
import StringIO
from commonsdialog import *
from javax.swing.event import HyperlinkListener
from org.gvsig.fmap.geom import GeometryLocator
from org.gvsig.fmap.geom import Geometry

def centerViewinPoint(view,center):
    env = view.getMap().getViewPort().getEnvelope();
    movX = center.getX()-env.getCenter(0);
    movY = center.getY()-env.getCenter(1);
    minx = env.getMinimum(0) + movX;
    miny = env.getMinimum(1) + movY;
    maxX = env.getMaximum(0) + movX;
    maxY = env.getMaximum(1) + movY;
    env = GeometryLocator.getGeometryManager().createEnvelope(
          minx, miny,
          maxX, maxY,
          Geometry.SUBTYPES.GEOM2D);
    view.getMap().getViewPort().setEnvelope(env);
    view.getMap().invalidate()


class MyHyperlinkListener(HyperlinkListener):
  def __init__(self,vista):
    self.vista = vista
    
  def hyperlinkUpdate(self, h):
    if str(h.getEventType()) == "ACTIVATED":
      # Sopo procesamos los eventos "ACTIVATED" que son los clicks sobre los enlaces
      # Recogemos la geometría que metimos en el enlace en WKT
      wktgeom = h.getDescription()
      print wktgeom
      # Y reconstruimos el punto a partir de ese WKT
      manager = GeometryLocator.getGeometryManager()
      point = manager.createFrom(wktgeom)
      # Y una vez lo tenemos centramos la vista en ese punto.
      centerViewinPoint(self.vista,point)


def main(*args):
  layer = currentLayer()
  if layer == None:
    msgbox("Debera seleccionar la capa que desea validar")
    return
  informe = StringIO.StringIO()  
  informe.write("<ul>\n")
  i=0
  hay_problemas = False
  try:
    # Añadimos la barra de progreso a la barra de estado de gvSIG
    taskStatus.add()
    # Le indicamos cuantas iteraciones vamos a realizar
    for feature in layer.features():
      # En cada iteración informamos a la barra de progreso de por donde vamos
      taskStatus.setCurValue(i)
      vs = feature.geometry().getValidationStatus();
      if not vs.isValid() :
        hay_problemas = True
        if vs.getProblemLocation()!=None:
          wktgeom = vs.getProblemLocation().convertToWKT()
        else:
          try:
            # Atrapamos los errores no vaya a ser que la geometría este tan dañada que
            # nos falle el calculo de su centroide.
            wktgeom = feature.geometry().centroid().convertToWKT()
          except:
            wktgeom = None
        informe.write("<li>")
        if wktgeom == None:
          informe.write('%5.5d%s<br>%s' % (i, feature.toString(),vs.getMessage()))
        else:
          informe.write('<a href="%s">%5.5d</a> %s<br>%s' % (wktgeom,i, feature.toString(),vs.getMessage()))
        informe.write("</li>")
      i+=1
  finally:  
    # Al terminar
    # Le indicamos a la barra de progreso que ya hemos terminado
    taskStatus.terminate()
    # Y la eliminamos de la barra de estado de gvSIG.
    taskStatus.remove()
    
  informe.write("</ul>\n")
  if hay_problemas :
    application = ApplicationLocator.getManager()
    application.showTextDialog(
      WindowManager.MODE.TOOL, # TOOL o WINDOW según nos interese.
      "Problems in layer "+layer.getName(),
      informe.getvalue(),
      MyHyperlinkListener(currentView())
    )
  else:
    msgbox("Layer "+layer.getName()+" is valid.")
Posted in development, gvSIG Desktop, scripting, spanish | Tagged , , , | 2 Comments

Séminaire en ligne gvSIG 2.1 pour la communauté francophone

Bonjour à tous!

Comme vous le savez tous, MundoGeo, Membre d’honneur de l’Association gvSIG, mets à disposition ses ressources pour diffuser le projet gvSIG,  surtout en ce qui concerne les séminaires en ligne. En effet, depuis le début de l’année 2014 on a déjà eu 7 séminaires  focalisés sur gvSIG en espagnol, anglais et portugais.

Désormais, et c’est une grande nouveauté, les séminaires en ligne veulent intégrer la  communauté francophone et le prochain sera donc en français!

Celui ci se déroulera le mercredi 9 juillet (horaire: 1:00 PM – 2:00 PM GMT). Vous avez ici dessous le lien de MundoGeo pour vous inscrire dès maintenant:

https://www2.gotomeeting.com/register/949524850

Au programme, les nouveautés de la dernière version de gvSIG, quelques démonstrations pratiques en vidéo, ainsi qu’un résumé de l’Association gvSIG et  un point sur la communauté francophone du projet. Pas mal pour 1 heure de séminaire! Je serai moi-même la conférencière… tout un challenge, je ferai de mon mieux :).

L’invitation est donc faite. Si vous souhaitez devenir membre actif de la communauté francophone de gvSIG, n’hésitez pas à vous inscrire et à participez!
À très bientôt!
Viqui.-

Posted in community, french, gvSIG Desktop, opinion | Leave a comment

Go for the 10th gvSIG Conference

This year we’ll celebrate the 10th International gvSIG Conference (December 3, 4 and 5). 10th Conference. A round number that’s not bad to a free project.

The ones who knows us have in mind that we like to talk about Independence and Sovereignty. And that we like to stress that Sovereignty passes by Strategic Sectors control and that is an absurd that in 21st Century we don’t consider technology as a strategic sector.

To have control about a strategic sector passes by having capability over your government. Having government capability over you software passes by being able to knows it and freedom to it’s use, modification and distribution, saying by Free Software.

This is a recurrent idea in our way of thinking: Sovereignty , Strategic Sectors, Free Software and all from the conscience that we are in the 21st Century. It’s the issue that encourage us that the 10th Conference slogan is: “Strategies for the 21st Century”

You know too that we like to talk about collective values, solidarity, collaboration. And we have thought that at time to construct the image of the Conference, it could be interesting that if you have a moment and want to, you could tell us what are your strategies to the 21st Century (in a maximum of 150 characters) or send us an image (220 kb maximum) and see if we’re capable to collect your sensations.

You can send it to: conference-contact@gvsig.com

And in what it is possible to you, thanks for collaborating with the Project strengthening.

Go for the 10th gvSIG Conference.

Posted in community, english, events, gvSIG Association, opinion | Leave a comment

gvSIG Association is now a Mountain Partnership member

We are pleased to announce that the gvSIG Association is a new Mountain Partnership member, with GISMAP as focal point. At this way the gvSIG Association hopes to collaborate in this international alliance, working together with the common objective to achieve sustainable mountain development around the world. logo-mountain-1

The Mountain Partnership is a United Nations voluntary alliance of partners dedicated to improving the lives of mountain people and protecting mountain environments around the world.

The Mountain Partnership addresses the challenges facing mountain regions by tapping the wealth and diversity of resources, knowledge, information and expertise, from and between its members, in order to stimulate concrete initiatives at all levels that will ensure improved quality of life and environments in the world’s mountain regions.

Currently, 53 governments, 14 intergovernmental organizations and 167 Major Groups (e.g. civil society, NGOs and the private sector) are members.

With this agreement we add our knowledge and experience in free geomatics to the work of a lot of organizations that take part of this alliance already.

Posted in community, english, gvSIG Association, opinion | Leave a comment

A por las 10as Jornadas gvSIG

Este año celebraremos las 10as jornadas internacionales gvSIG (3, 4 y 5 de diciembre). 10as Jornadas. Un número redondo que no está mal para un proyecto libre.

Los que nos conocéis sabéis que nos gusta hablar de Independencia y Soberanía. Sabéis que nos gusta recalcar que la Soberanía pasa por el control de los Sectores Estratégicos y que es un absurdo que en el Siglo XXI no consideremos la tecnología como sector estratégico.

Tener control sobre un sector estratégico pasa por tener capacidad sobre su gobierno. Tener capacidad de gobierno sobre el software pasa por ser capaces de conocerlo y libertad para su uso, modificación y distribución, es decir por el Software Libre.

Esta es una idea recurrente en nuestra forma de pensar: Soberanía, Sectores Estratégicos, Software Libre y todo ello desde la consciencia de que estamos en el Siglo XXI. Lo que nos anima a que el lema de las 10as Jornadas sea: “Estrategias Siglo XXI”

También sabéis que nos gusta mucho hablar de valores colectivos, de solidaridad, de colaboración. Y hemos pensado que a la hora de construir la imagen, nos podría ser interesante que aquellos que tengáis un momento y queráis, nos podéis contar cuales son vuestras estrategias para el siglo XXI (en 150 caracteres máximo) o mandarnos una imagen (220kb máximo) y ver si de alguna forma somos capaces de recoger vuestras sensaciones.

Podéis mandarla a la siguiente dirección: conference-contact@gvsig.com

Y al que le sea posible, pues gracias por colaborar con el fortalecimiento del Proyecto.

A por las 10as. Jornadas.

Posted in events, gvSIG Association, opinion, spanish | 4 Comments

FOSS4G-FR: Initiation à la nouvelle version de gvSIG 2.1

FR-gvsigDans le cadre de la première édition francophone du FOSS4G (*Free and Open Source For Geospatial*), événement dédié à la géomatique et aux données géographiques libres qui se tiendra les 20, 21 et 22 mai 2014 à l’Ecole Nationale des Sciences Géographiques de Marne-la-vallée, France, un atelier d’initiation à la nouvelle version de gvSIG 2.1 sera proposé.

Cet atelier, présenté par David Martinez Morata de Thinking GIS en collaboration avec Victoria Agazzi de l’Association gvSIG, aura pour objectif d’initier les participants aux principales caractéristiques de cette nouvelle version du logiciel à travers une série d’exercices pratiques.

Il se déroulera en salle C le 20 mai de 15 à 19h30.

 

Posted in events, french, gvSIG Desktop, training | Tagged | Leave a comment