Documentacion a entregar
Documentacion a entregar a los asistentes
- Programa
- Introducción
- Proyectos y paquetes
- Maven en gvSIG 2.0
- Nueva API de geometrias
- DAL desde la perspectiva del cliente de la librería
- Construcción de bibliotecas nativas: JNI
- Transformaciones de datos en gvSIG
- DAL desde la perspectiva del proveedor de datos
- Otra documentacion
- Videos del curso
Programa
- Apertura
- Introduccion
- Principales novedades de gvSIG 2.0.
- Repaso de contenidos del curso.
- Proyectos y paquetes.
- Grupos de proyectos
- Proyectos de construcción de gvSIG.
- Librerías básicas.
- Fmap base.
- Interfaz de usuario y aplicación.
- Coverage (raster).
- Bases de datos.
- JCRS.
- GPE.
- Servicios remotos.
- Transformaciones de datos.
- DWG.
- Otros proyectos
- Maven como sistema de construcción de gvSIG
- Introducción a maven
- Introducción
- Plugins de maven
- Repositorios local y remotos
- Objetivos habituales
- Configuración inicial
- Requisitos previos
- Configuración inicial de maven
- Cómo montar un workspace de gvSIG para Eclipse
- Integración con eclipse
- Co
- Compilar un gru po de proyectos
- Compilar un gvSIG completo
- Arrancar gvSIG
- Librerías nativas Java ME CDC
mpilar gvSIG - Trabajando con un proyecto gvSIG
- Crear un nuevo proyecto
- Crear una nueva librería
- Crear una nueva extensión
- Compilar mi proyecto
- Desplegar mi proyecto
- Publicar mi proyecto
- Generación de documentación e informes
- Cómo añadir o actualizar una dependencia
- Próximos pasos
- Crear un nuevo proyecto
- Recursos de maven disponibles
- Introducción a maven
- Nueva API de geometrias
- El modelo anterior
- La normas ISO
- En modelo actual
- Geometrías primitivas
- Geometrías complejas
- Geometrías múltiples
- Acceso al API de geometrías
- Tipos de geometrías
- Registro de un tipo de geometría
- Las Geometrías
- Creación de geometrías
- Geometrías primitivas
- Geometrías múltiples
- Operaciones
- Registro de operaciones
- Ejecución de una operación
- LibTools y SLF4J
- Que es libTools
- Puntos de extensio
- Locator/Library
- Excepciones
- Observable
- Visitor
- Evaluator
- DynObject
- SLF4J
- Que es libTools
- DAL desde la perspectiva del cliente de la librería
- Introducción y Contexto de la librería
- Descripción general de la arquitectura.
- Descripción de la arquitectura para datos tabulares.
- Acceso a Fenómenos (Básico, Filtrado, Ordenación, Contexto).
- Modificación y escritura de un almacén.
- Consultar la estructura de un almacén.
- Creación de un almacén nuevo.
- Modificación de la estructura de un almacén.
- Manejo de la selección de Fenómenos de un almacén.
- Bloqueo de Fenómenos.
- Acceso a operaciones específicas del proveedor.
- Soporte para atributos calculados.
- Pila de comandos.
- Soporte para índices.
- Transformación de un almacén.
- Construcción de bibliotecas nativas: JNI
- Introducción
- Buenas prácticas y consejos en el desarrollo con JNI
- Librerías Nativas en gvSIG
- Proyectos JNI en gvSIG
- Ventajas
- Problemas
- Perfiles de trabajo en gvSIG
- Compilación de librerías JNI
- Dependencia de librerías JNI
- Tests Unitarios en librerías JNI
- Creación de un proyecto JNI
- Organización del proyecto.
- Construcción de la parte nativa (cmake)
- Construcción de la parte Java (maven)
- Integración en sistema de construcción.
- Transformaciones de datos en gvSIG
- Definición de transformación
- Transformaciones a nivel de DAL
- Transformaciones a nivel de aplicación
- El wizard de las transformaciones
- Uso del wizard
- Creación de un nuevo wizard
- Las transformaciones
- Registro de una nueva transformación
- Creación de una transformación
- Los paneles asociados a la transformación
- Definición de transformación
- DAL desde la perspectiva del proveedor de datos
- Introduccion
- Servicios a proveedores de datos en la arquitectura general de DAL.
- Servicios a proveedores de datos tabulares
- Creacion de un proveedor de datos simple para ficheros CSV.
- Descripcion general.
- Implementacion de los parametros.
- Implementacion del almacen con acceso de lectura.
- Implementacion filtro para el esplorador de ficheros.
- Registro del nuevo proveedor.
- Añadiendo soporte para escritura.
- ¿ Que no hemos visto ?
- Que nos faltaria para tener un proveedor que no trabaje con los datos en memoria.
- Proveedores de datos empujados desde JDBC
Introducción
Introducción a las principales novedades, a nivel de desarrollo, que nos podemos encontrar en gvSIG 2.0, así como un resumen de los contenidos a tratar durante el curso.
Desde aquí puede acceder a las diapositivas del seminario.
Proyectos y paquetes
Revisión de la estructura de los principales proyectos y jars generados en gvSIG 2.0.
Se definen una serie de grupos de proyectos, por criterio de funcionalidad o relación a la hora de desarrollar, y se detallan cada uno de los proyectos que compone cada grupo.
Para cada proyecto se indica:
- Proyecto: Nombre del proyecto.
- ArtifactID: identificador en maven, que se corresponde generalmente con el paquete principal de las clases que contiene.
- Jars de binarios: archivos jars con clases compiladas que genera el proyecto.
Desde aquí puede acceder a las diapositivas del seminario.
Maven en gvSIG 2.0
Introducción a maven y su aplicación como herramienta de construcción de gvSIG.
Siguiendo los pasos de la guía de desarrollo se monta desde cero un espacio de trabajo en Eclipse descargando todos los proyectos desde el repositorio de fuentes, compilando y arrancando gvSIG desde el propio Eclipse.
Se describe también cómo se va a trabajar en gvSIG con maven para realizar las tareas habituales de desarrollo: compilar, generar jars, generar documentación, etc. También se introduce una integración sencilla de maven que se ha realizado con eclipse, mediante el uso de herramientas externas.
Desde aquí puede acceder a las diapositivas del seminario.
Nueva API de geometrias
Se va a explicar el nuevo modelo de geometrías como una evolución natural desde el modelo anterior hasta las especificaciones de la ISO. Además se comentará el mecanismo para registrar y crear geometrías, y para registrar y ejecutar operaciones.
Desde aquí puede acceder a las diapositivas del seminario.
DAL desde la perspectiva del cliente de la librería
En esta presentación daremos una introducción a la librería y su arquitectura, describiendo el manejo de acceso a datos tabulares. No se describirá el acceso a datos raster.
Desde aquí puede acceder a las diapositivas del seminario relacionada con el API de DAL.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | DataManager manager;
StoreParameters params;
FeatureStore store;
FeatureSet features;
Feature feature;
manager = DALLocator.getDataManager();
params = manager.createStoreParameters("Shape")
params.setDynValue("shpfilename","data/prueba.shp");
store = (FeatureStore)manager.createStore(params);
features = store.getFeatureSet();
DisposableIterator it = features.iterator();
while( it.hasNext() ) {
feature = (Feature)it.next();
System.out.println(feature.getString("NOMBRE"));
}
it.dispose();
features.dispose();
store.dispose();
|
CódigoFuente 1: Acceso a un fichero Shape
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | DataManager manager;
StoreParameters params;
FeatureStore store;
FeatureSet features;
Feature feature;
manager = DALLocator.getDataManager();
params = manager.createStoreParameters("PostgreSQL");
params.setDynValue("host", SERVER_IP);
params.setDynValue("dbuser",SERVER_USER);
params.setDynValue("password",SERVER_PASWD);
params.setDynValue("dbname",SERVER_DBNAME);
params.setDynValue("table","prueba");
store = (FeatureStore)manager.createStore(params);
features = store.getFeatureSet();
DisposableIterator it = features.iterator();
while( it.hasNext() ) {
feature = (Feature)it.next();
System.out.println(feature.getString("nombre"));
}
it.dispose();
features.dispose();
store.dispose();
|
CódigoFuente 2: Acceso a una tabla PostgreSQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | Iterator typeIt = store
.getFeatureTypes().iterator();
while( typeIt.hasNext() ) {
FeatureQuery query = store
.createFeatureQuery();
FeatureType type = (FeatureType)typeIt.next();
query.setFeatureType(type);
features = store.getFeatureSet(query);
DisposableIterator it = features.iterator();
while( it.hasNext() ) {
feature = (Feature)it.next();
System.out.println(
feature.getString("NOMBRE"));
}
it.dispose();
features.dispose();
}
|
CódigoFuente 3: Filtrado por “Tipo” de fenómeno
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | FeatureQuery query = store
.createFeatureQuery();
Evaluator filter = manager
.createExpresion("NOMBRE like 'a%'");
query.setFilter(filter);
features = store.getFeatureSet(query);
DisposableIterator it = features.iterator();
while( it.hasNext() ) {
feature = (Feature)it.next();
System.out.println(
feature.getString("NOMBRE"));
}
it.dispose();
features.dispose();
|
CódigoFuente 4: Filtrado por expresión
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | FeatureQuery query = store
.createFeatureQuery();
query.getOrder().add("CODIGO",true);
query.getOrder().add("NOMBRE",false);
features = store.getFeatureSet(query);
DisposableIterator it = features.iterator();
while( it.hasNext() ) {
feature = (Feature)it.next();
System.out.println(
feature.getString("NOMBRE"));
}
it.dispose();
features.dispose();
|
CódigoFuente 5: Ordenación por nombre
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | FeatureQuery query = store
.createFeatureQuery();
Evaluator nombreToLower = manager
.createExpresion("toLower(NOMBRE)");
query.getOrder().add("CODIGO",true);
query.getOrder().add(nombreToLower,false);
features = store.getFeatureSet(query);
DisposableIterator it = features.iterator();
while( it.hasNext() ) {
feature = (Feature)it.next();
System.out.println(
feature.getString("NOMBRE"));
}
it.dispose();
features.dispose();
|
CódigoFuente 6: Ordenación por expresión
1 2 3 4 5 6 7 8 | store.edit();
EditableFeature feature = store.createNewFeature();
feature.set("NOMBRE", "Burjasot");
feature.set("TIPO", "MUNICIPIO");
store.insert(feature);
store.finishEditing();
|
CódigoFuente 7: Inserción de un fenómeno
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | store.edit();
EditableFeature feature;
FeatureQuery query = store.createFeatureQuery();
query.setFilter( manager.createExpresion("NOMBRE = 'Burjasot'") );
features = store.getFeatureSet(query);
Iterator it = features.iterator();
while( it.hasNext() ) {
feature = ((Feature)it.next()).getEditable();
feature.set("TIPO", "Municipio");
features.update(feature);
}
features.dispose();
store.finishEditing();
|
CódigoFuente 8: Modificación de fenómenos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | store.edit();
FeatureQuery query = store.createFeatureQuery();
query.setFilter( manager.createExpresion("NOMBRE = 'Burjasot'") );
features = store.getFeatureSet(query);
Iterator it = features.iterator();
while( it.hasNext() ) {
it.next();
it.remove();
}
features.dispose();
store.finishEditing();
|
CódigoFuente 9: Eliminación de fenómenos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | FeatureType featureType = store.getDefaultFeatureType();
Iterator it = featureType.iterator();
while( it.hasNext() ) {
attribute = (FeatureAttributeDescriptor)it.next();
System.out.print(attribute.getDataTypeName();
if( attribute.getSize() > 1 ) {
System.out.print("["+attribute.getSize()+"]");
}
System.out.print(" " + attribute.getName() );
Evaluator eval = attribute.getEvaluator();
if( eval != null ) {
System.out.print(attribute.getName()+", "+attribute.getDataTypeName()+" -- Calculado "+ eval.getCQL());
}
System.out.println();
}
|
CódigoFuente 10: Consultar la estructura de un almacén
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | DataExplorerParameters eparams = manager
.createServerExplorerParameters("FilesystemExplorer");
eparams.setDynValue("initialpath","/data");
DataServerExplorer serverExplorer = manager.createServerExplorer(eparams);
NewFeatureStoreParameters sparams = (NewFeatureStoreParameters)
serverExplorer.getAddParameters("DBF");
sparams.setDynValue("dbffilename","prueba.dbf");
EditableFeatureType featureType = (EditableFeatureType)
sparams.getDefaultFeatureType();
featureType.add("NOMBRE", DataTypes.STRING,100);
featureType.add("MUNICIPIO", DataTypes.STRING,100);
featureType.add("POBLACION", DataTypes.LONG);
featureType.add("AREA", DataTypes.DOUBLE);
serverExplorer.add(sparams);
|
CódigoFuente 11: Creación de un nuevo almacén
1 2 3 4 5 6 7 | store.edit();
FeatureType featureType = store.getDefaultFeatureType();
EditableFeatureType editableFeatureType = featureType.getEditable();
editableFeatureType.getAttributeDescriptor("MUNICIPIO").setSize(50);
editableFeatureType.getAttributeDescriptor("NOMBRE").setSize(50);
store.update(editableFeatureType);
store.finishEdition()
|
CódigoFuente 12: Modificación de la estructura de un almacén
1 2 3 4 5 6 7 8 9 | store.edit();
FeatureType featureType = store.getDefaultFeatureType();
EditableFeatureType editableFeatureType = featureType.getEditable();
editableFeatureType.add("DENSIDAD_POBLACION",
DataTypes.DOUBLE,
manager.createExpresion("POBLACION / AREA")
);
store.update(editableFeatureType);
store.finishEditing();
|
CódigoFuente 13: Añadir atributo calculado a un almacén
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | class XY2Geometry extends AbstractEvaluator {
private String xname;
private String yname;
private GeometryManager geomManager;
public XY2Geometry initialize(String xname, String yname) {
this.xname = xname;
this.yname = yname;
geomManager = GeometryLocator.getGeometryManager();
return this;
}
public Object evaluate(EvaluatorData data) throws EvaluatorException {
Double x = (Double) data.getDataValue(this.xname);
Double y = (Double) data.getDataValue(this.yname);
Geometry geom;
try {
geom = geomManager.createPoint(x.doubleValue(), y
.doubleValue(), Geometry.SUBTYPES.GEOM2D);
} catch (CreateGeometryException e) {
throw new EvaluatorException(e);
}
return geom;
}
public String getName() {
return "XY2Geometry";
}
}
|
CódigoFuente 14: Evaluado para atributo calculado personalizado
1 2 3 4 5 6 7 8 9 | store.edit();
FeatureType featureType = store.getDefaultFeatureType();
EditableFeatureType editableFeatureType = featureType.getEditable();
editableFeatureType.add("GEOM",
DataTypes.GEOMETRY,
new XY2Geometry().initialize("X", "Y")
);
store.update(editableFeatureType);
store.finishEditing();
|
CódigoFuente 15: Añadir atributo calculado personalizado (CódigoFuente 14) a un almacén
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | public class MyTransform extends AbstractFeatureStoreTransform {
private String geomName;
private String xname;
private String yname;
private GeometryManager geomManager;
public MyTransform() {
this.geomManager = GeometryLocator.getGeometryManager();
}
public MyTransform initialize(FeatureStore store, String geomName,
String xname, String yname) throws DataException {
setFeatureStore(store);
this.geomName = geomName;
this.xname = xname;
this.yname = yname;
EditableFeatureType type = getFeatureStore().getDefaultFeatureType()
.getEditable();
type.add(geomName, DataTypes.GEOMETRY);
List list = new ArrayList(1);
list.add(type.getNotEditableCopy());
setFeatureTypes(list, (FeatureType) list.get(0));
return this;
}
public void applyTransform(Feature source, EditableFeature target)
throws DataException {
target.copyFrom(source);
Geometry geom;
try {
geom = geomManager.createPoint(source.getDouble(xname), source
.getDouble(yname), Geometry.SUBTYPES.GEOM2D);
} catch (CreateGeometryException e) {
throw new ReadException("XYTranform", e);
}
target.setGeometry(this.geomName, geom);
}
public void saveToState(PersistentState state) throws
PersistenceException {
state.set("xname", xname);
state.set("yname", yname);
state.set("geomName", geomName);
}
public void loadFromState(PersistentState state)
throws PersistenceException {
this.xname = state.getString("xname");
this.yname = state.getString("yname");
this.geomName = state.getString("geomName");
}
public FeatureType getSourceFeatureTypeFrom(
FeatureType targetFeatureType) {
EditableFeatureType ed = targetFeatureType.getEditable();
ed.remove(this.geomName);
return ed.getNotEditableCopy();
}
public boolean isTransformsOriginalValues() {
return false;
}
}
|
CódigoFuente 16: Implementación de una transformación de almacén
1 2 3 | FeatureStoreTransform transform = new MyTransform()
.initialize(store,"geom","x","y");
store.getTransforms().add(transform)
|
CódigoFuente 17: Aplicar una transformación (CódigoFuente 16) a un almacén
Construcción de bibliotecas nativas: JNI
Visión general de cómo se ha implantando el desarrollo de librerías JNI en la versión 2.0 de gvSIG. También se explicará como hacer uso de las librerías nativas de gvSIG así como crear nuevas e integrarlas en el sistema de construcción.
Transformaciones de datos en gvSIG
Se van a comentar las transformaciones a nivel de DAL y posteriormente se comentarán las transformaciones a nivel de aplicación. Se habla de cómo crear una transformación y registrarla en gvSIG. Además se comentará cómo usar el Wizard de las transformaciones
Desde aquí puede acceder a las diapositivas del seminario.
DAL desde la perspectiva del proveedor de datos
Repaso rápido a la parte de DAL que se corresponde con los servicios que ofrece a los proveedores de datos. Despues de este repaso rápido pasaremos a ver como podríamos hacer para crear un proveedor de datos de archivo CSV basado en memoria.
No entraremos en detalle de los servicios que hay montados para acceso a proveedores basados en BBDD ni en general de proveedores no basados en memoria.
Desde aqui puede acceder a las diapositivas del seminario relacionada con los proveedores de DAL, y el codigo de ejemplo presentado del para el proveedor de DAL de CSV
Otra documentacion
Guía de desarrollo
Introduccion al modelo de construccion de gvSIG con maven. Nociones de maven, construccion y configuracion de un workspace de eclipse, y compilacion de gvSIG a partir de los fuentes del SVN.
http://www.gvsig.org/web/docdev/docs/v2_0/gvsig-devel-guide/
org.gvsig.fmap.geom
EL modelo de geometrias de gvSIG.
http://www.gvsig.org/web/docdev/docs/v2_0/org.gvsig.fmap.geom/
org.gvsig.fmap.dal
gvSIG Data Access Library. Descripcion de la arquitectura de la libreria de acceso a datos de gvSIG, junto con algunos de los ejemplos de uso mas comunes.
http://www.gvsig.org/web/docdev/docs/v2_0/org.gvsig.fmap.dal/
org.gvsig.app.daltransform
Servicios de la aplicacion gvSIG de cara a ofrecer al usuario soporte de transformaciones de datos basadas en las transformaciones de DAL.
http://www.gvsig.org/web/docdev/docs/v2_0/org.gvsig.app.daltransform/
Videos del curso
Desde aqui puede descargarse los videos que hay disponibles del curso.
- Apertura, introduccion y 'proyectos y paquetes'
- Maven como sistema de construcción de gvSIG
- Nueva API de geometrias
- LibTools y SLF4J
- DAL desde la perspectiva del cliente de la librería
- Construcción de bibliotecas nativas: JNI
- Transformaciones de datos en gvSIG
- DAL desde la perspectiva del proveedor de datos