Próximo Webinar. gvSIG: Herramientas para la gestión del delito

crimeJunto con la Policía Local de Castellón desde la Asociación gvSIG, y con la colaboración de Crimina (Centro de Investigación y Formación Criminológica de la Universidad Miguel Hernández y el Ayuntamiento de Elche) y el Instituto Vasco de Criminología, estamos trabajando en el análisis y posibilidades del uso de gvSIG como Sistema de Información Geográfica para el análisis del delito. El objetivo final sería poder disponer de un producto sectorial, basado en gvSIG, y con las herramientas específicas que se requieren para su uso desde la perspectiva de la criminología.

Para realizar este primer análisis hemos utilizado como base el White Paper de IACA (The International Association of Crime Analysts) referente a los requisitos que ha de cumplir un SIG para el análisis del delito. Esta primera aproximación ya nos lleva a concluir que gvSIG cumple con la práctica totalidad de los requisitos definidos. gvSIG, por tanto, ya dispone de herramientas de análisis y representación gráfica muy útiles para la investigación espacio temporal del hecho criminal. Un siguiente paso de nuestro análisis fue realizar una comparativa con el SIG privativo al uso, determinando si gvSIG era un sustituto eficaz de cualquier software no libre y que restringa los derechos de los usuarios.

Sobre todo esto, y enmarcado en el Octubre gvSIG-10º Aniversario, trataremos en el próximo webinar del día 7, organizado por MundoGEO y que esperamos que sea de vuestro interés.

Si os interesa el tema, podéis apuntaros al webinar aquí: https://www2.gotomeeting.com/register/344953314

Posted in events, gvSIG Desktop, opinion, spanish | Tagged , , , | Leave a comment

10th International gvSIG Conference. Registration period is open

The registration period for the 10th International gvSIG Conference, organized by the gvSIG Association, is now open. It will be held from December 3rd to 5th in Valencia (Spain).

Registrations are free of cost (limited capacity) and must be done through the application form on the Conference web page [1].

Once the registration is done you will immediately receive a confirmation code. Please, keep this code for later consultations or for update the registration data.

In addition, we remind you that we are expecting communication proposals for the Conference.

You just have to send an abstract, following the template provided on the Reports section of the Conference web page to conference-contact@gvsig.com and the scientific committee will evaluate it to be in the conference programme. There are two types of communications: presentation and poster.

We expect your participation.

[1] http://jornadas.gvsig.org

Posted in community, english, events, training | Leave a comment

Loading layers in databases from gvSIG

This is a translation of the post that was published by Joaquín del Cerro some days ago, made by Daniel Vicente Batista.


Hello everyone again.

Some days ago I had to correct an error in the exportation assistant to Database and I realized more than I expected, so I am telling you how it is now.

So I had some request…

  • Add data in an existing table.
  • gvSIG warning about if the table exists before trying to load it.
  • Ability to validate geometries before loading them in Database and verify if any of them is corrupted.
  • Ability to show to user about the errors produced so that user may be able to take correcting measures.
  • Not inserting in Database if an error that aborts the operation is produced.
  • The name of the table is proposed, and it’s based on the name of the table that user wants to export.
  • It was not clear what the primary key was. It has to be clarified and it will allow to choose a field of those that already exists as primary key.
  • Usability can be improved when introducing connection data.
  • Blank spaces and uppercase letter in identifiers.
  • Once connection data are introduced, just clicking in Next button to export data if there’s no setback.

With all these stuff in mind I remade almost all the assistant. Now it is divided in six steps or pages.

  1. Options about identifiers to use.

    It allows us to select two checks:

    • One of them to indicate that we want just lowercase in fields identifiers and table.
    • Another one to indicate that we don’t want blank spaces in identifiers, and if they are shown they have to be replaced by underline.

    It doesn’t mean that gvSIG doesn’t work good with uppercase and blank spaces. It’s because other apps that interact with tables with blanks or uppercase fields they don’t do it well or they need user to avoid these characters, that could be more tricky.

    These two checks are shown by default.

  2. Connection options.

    It asks us about connection parameters:

    • Connection type (generic JDBC, PostgreSQL,…)
    • Host name where the service is.
    • Port where the service is.
    • Database name we want to use
    • User
    • Key

    Here we can name this connection configuration to reuse it later.

  3. Table to create

    Here we need to choose to create a new table or add data to an existing one.

    If connection parameters indicated in previous step are correct, the tables list is shown in the database and allows us to choose one where it can be added.

    If we select the option to create a new one, that is the default value, we need to indicate the scheme and the name of the table. It will propose by default values as “public” to the scheme and as name equal to the one we want to export.

    If clicking Next this table already exists, the assistant doesn’t let us proceed, informing us this table already exists, and if we introduce spaces or uppercases it would ask us if we want to fix it automatically or not, following to next if we choose fix it alone.

  4. Primary key.

    It will allow us to choose among creating a new primary key based in an automatic value or choosing an existing one. Creating a new one option is checked by default and it will propose a “pk” name.

    If we indicate we want to use an existing field, we need to choose the field that we want from a list.

  5. Validating geometries.

    When loading data in a Database it is recommended that the geometries that we load are “correct”. This page will allow us to select among the option to lead with this:

    • Do nothing special, the geometries are inserted and the error aborts the process.

    • Verify that there’s no geometry corrupted, normally due to loading a format that is permissive to store geometries, for example lines with just one point or polygons with less than two.

      If we select this option, we need to choose among three actions to do when this happens:

      • Insert the entire feature with geometry set as null.
      • Don’t insert the feature and go to the next.
      • Fail, and abort the process.
    • Verify that the geometries are “valid” (ST_isValid). And if don’t, check to try to correct automatically the problem, and in case of don’t choosing among three actions, same as previous case.

    By default first option is checked, nothing special has to be done with the geometries.

  6. Features selection.

    Last we’ll need to indicate what features have to be loaded. We can:

    • Insert all features of the table, that is the default option.
    • Insert just selected features, what will insert just features that are selected ones in original table or layer.
    • Apply a filter, where we can apply a filter using syntax of a “where” of SQL that we can record, assigning a name.

After passed for these pages of the assistant the process of exportation to Database will begin, and in case of an error a dialogue box will be shown trying to describe what the problem is, and if it happened processing a feature, it will show us the values of the feature that occasioned it.

Well, it’s all.

Posted in development, english, gvSIG Desktop | Leave a comment

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