4. Acceso a datos tabulares¶
- 4.1. API de los servicios asociados al consumidor de datos
- 4.1.1. Acceso a los fenomenos
- 4.1.2. Modificación de la estructura de un almacén
- 4.1.3. Consultando la estructura de un almacen
- 4.1.4. Creación de un nuevo almacén
- 4.1.2. Modificación de la estructura de un almacén
- 4.1.5. La selección dentro de los datos de un almacén
- 4.1.6. Bloqueo de fenómenos
- 4.1.7. Acceso a operaciones específicas del almacén
- 4.1.8. Soporte para atributos calculados
- 4.1.9. La pila de comandos de edición
- 4.1.10. Soporte de índices
- 4.1.11. Transformaciones sobre almacenes
- 4.1.12. Introducción
- 4.1.13. La interfaz FeatureStoreTransform
- 4.1.14. Obtener las transformaciones de un almacén
- 4.1.15. Añadir una transformación a un almacén
- 4.1.16. Ejemplo de implementación de una transformación
4.2. Descripción¶
Partiendo de la arquitectura general del API de acceso a datos, podemos ver como encaja la especialización del acceso a datos tabulares dentro de ella.
Dentro del acceso a datos tabulares se incluye tanto el acceso a datos de carácter alfanumérico como vectorial, soportando que uno o varios atributos de un ítem o fenómeno sean de tipo vectorial.
Nos encontraremos las siguientes clases e interfaces mostradas en el siguiente gráfico.
FeatureStore, como especialización de DataStore. Añade funcionalidades propias del acceso a datos alfanuméricos y vectoriales. Conoce de fenómenos, cómo consultar sus valores o su estructura, así como de acciones específicas para acceder a ellos.
FeatureSet, como especialización de DataSet. Conoce los fenómenos y es capaz de iterar sobre ellos.
FeatureQuery, como especialización de DataQuery. Contiene información relevante sobre la definición de filtros y su ordenación que hace uso del conocimiento de estar trabajando sobre datos alfanuméricos y vectoriales.
Feature. Aparece como contenedor de un fenómeno, permitiendo acceder a la información de éste.
FeatureType. Aparece como el contenedor de la estructura de un fenómeno. Qué atributos tiene o de qué tipo son.
Así por ejemplo, si quisiésemos acceder a los fenómenos de un fichero shape, podríamos hacerlo con:
DataManager manager;
DataStoreParameters 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();
Y por ejemplo, si en lugar de un fichero en disco fuese una tabla de una BBDD postgres sería algo como:
DataManager manager;
DataStoreParameters params;
FeatureStore store;
FeatureSet features;
Feature feature;
manager = DALLocator.getDataManager();
params = manager.createStoreParameters("PostgreSQL");
params.setDynValue("host", SERVER_IP);
params.setDynValue("port", SERVER_PORT);
params.setDynValue("dbuser",SERVER_USER);
params.setDynValue("password",SERVER_PASWD);
params.setDynValue("schema",SERVER_SCHEMA);
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();
Otra alternativa mas recomendable para no tener que preocuparnos por liberar los recursos del FeatureSet y el iterador seria usando un visitor sobre el FeatureStore:
DataManager manager;
DataStoreParameters params;
FeatureStore store;
manager = DALLocator.getDataManager();
params = manager.createStoreParameters("Shape");
params.setDynValue("shpfilename","data/prueba.shp");
store = (FeatureStore)manager.createStore(params);
store.accept( new Visitor() {
public void visit(Object obj) {
Feature feature = (Feature)obj;
System.out.println(feature.getString("NOMBRE"));
}
}
);
store.dispose();