-
Notifications
You must be signed in to change notification settings - Fork 14
2.1.3. Filtros
Se pueden establecer filtros que permiten comprobar si los objetos geográficos o elementos (features) cumplen o no con determinadas condiciones. Los filtros pueden aplicarse de dos formas diferentes:
Lo más común es aplicarlos sobre capas vectoriales del mapa, de modo que apliquen a los features de la misma. Estos filtros se ejecutan en memoria, es decir, estando la capa cargada ya con todos sus features en el cliente, establecer un filtro no supone realizar ninguna nueva petición al servidor.
Hay que tener en cuenta que una vez se aplica un filtro a una capa, este es efectivo hasta que el mismo se elimine o se modifique, por lo que a todos los efectos, es como si la capa tuviese únicamente aquellos features que cumplen el filtro: dibujado en el mapa, recorrido por sus features, etc.
La segunda forma de usar un filtro es ejecutándolo sobre un array de features. Eso nos devolverá una lista únicamente con los features que cumplen el filtro. Más adelante se mostrarán ejemplos de ambos casos.
Los filtros actualmente implementados son:
Filtros alfanuméricos
Filtro | Descripción |
---|---|
M.filter.AND | Condición Y |
M.filter.OR | Condición O |
M.filter.NOT | Condición NO |
M.filter.EQUAL | Condición IGUAL |
M.filter.LIKE | Condición de PATRÓN |
M.filter.LT | Condición MENOR QUE |
M.filter.GT | Condición MAYOR QUE |
M.filter.LTE | Condición MENOR O IGUAL QUE |
M.filter.GTE | Condición MAYOR O IGUAL QUE |
Mediante los filtros M.filter.AND y M.filter.OR podemos encadenar tantos filtros como queramos
const mapajs = M.map({
container: "mapjs",
center: [-543161.8393964204, 4622910.232880487],
zoom: 6
});
const lyProvincias = new M.layer.WFS({
url: "http://geostematicos-sigc.juntadeandalucia.es/geoserver/tematicos/ows?",
namespace: "tematicos",
name: "Provincias",
legend: "Provincias",
geometry: 'MPOLYGON'
});
// esperamos que la capa esté cargada para aplicar el filtro
lyProvincias.on(M.evt.LOAD, () => {
//Filtro por atributo nombre
let filter = M.filter.OR(
[M.filter.EQUAL("nombre", "Sevilla"),
M.filter.EQUAL("nombre", "Málaga")]);
// Aplicar filtro a capa
lyProvincias.setFilter(filter);
// Si solo se quiere obtener los features que cumplen el filtro,
// Sin afectar a la capa:
let featuresFiltrados = filter.execute(lyProvincias.getFeatures());
//lyProvincias.removeFilter(); eliminar el filtro
});
// añadimos la capa
mapajs.addLayers(lyProvincias);
Filtros espaciales
Filtro | Descripción |
---|---|
M.filter.spatial.CONTAIN | Comprueba que el un elemento A esté dentro de otro B |
M.filter.spatial.DISJOINT | Comprueba que los elementos A y B no tengan ningún punto en común |
M.filter.spatial.WITHIN | Comprueba que el elemento B esté dentro de A |
M.filter.spatial.INTERSECT | Comprueba si los elementos A y B tienen puntos en común |
Los filtros espaciales aceptan paŕametros en forma de Feature, o en forma de geometría GeoJSON.
Para los filtros espaciales, se ha implementado la librería jsts. Esto permite acceder a ella y realizar multitud de operaciones espaciales adicionales.
const mapajs = M.map({
container: "mapjs",
layers: ['OSM'],
projection: 'EPSG:25830*m'
});
const lyProvincias = new M.layer.WFS({
url: "http://geostematicos-sigc.juntadeandalucia.es/geoserver/tematicos/ows?",
namespace: "tematicos",
name: "Provincias",
legend: "Provincias",
geometry: 'MPOLYGON'
});
lyProvincias.on(M.evt.LOAD, () => {
// Si queremos usar un feature
let miFeature = new M.Feature("featurePrueba002", {
"type": "Feature",
"id": "prueba_pol_wfst.1985",
"geometry": {
"type": "Polygon",
"coordinates": [
[
[263770.72265536943, 4085361.4590256726],
[230910.00600234355, 4031901.3328427672],
[288293.77947248437, 4017678.0840030923],
[263770.72265536943, 4085361.4590256726]
]
]
},
"properties": {
"nombre": "feature2"
}
});
// Si queremos usar una geometría:
let miGeometria = {
'type': 'Polygon',
'coordinates': [
[
[251853, 4200334],
[326894, 4200334],
[326894, 4129217],
[251853, 4129217],
[251853, 4200334]
]
]
};
//Filtro los features de la capa que intersecten con miFeature
let filter = M.filter.spatial.INTERSECT(miFeature);
// Si queremos usar GeoJSON
//let filter = M.filter.spatial.INTERSECT(miGeometria);
lyProvincias.setFilter(filter);
});
mapajs.addLayers(lyProvincias);
También se ofrece la posibilidad de transformar cualquier de estos filtros al estándar CQL, por si se quiere hacer uso de filtrado desde el servidor.
let filtroCQL = filter.toCQL(); //devuelve un string con el filtro en formato CQL
lyProvincias.setCQL(filtroCQL);
Filtros personalizados
Si ninguno de los filtros disponibles se adaptan a nuestras necesidades, también se ofrece la posibilidad de definir cualquier filtro mediante una función, de forma que no quedamos limitados a la hora de poder realizar cualquier filtro:
let mapajs = M.map({
container: "map",
});
var lyProvincias = new M.layer.WFS({
url: "http://geostematicos-sigc.juntadeandalucia.es/geoserver/tematicos/ows?",
namespace: "tematicos",
name: "Provincias",
legend: "Provincias",
geometry: 'MPOLYGON'
});
mapajs.addLayers(lyProvincias);
//se crea un filtro personalizado que sólo devuelve las features
//que tengan la letra 'C' en el atributo nombre
let filter = new M.filter.Function(feature => {
return feature.getAttribute('nombre').indexOf('C') >= 0;
});
lyProvincias.setFilter(filter);
Ejemplos:
1.INICIO
1.1. Componentes de la API-CNIG
1.2. Documentación y Puntos de acceso
1.3. Primeros pasos
1.4. Diagrama API CNIG
2.1. Capas
■ 2.1.1. Fuentes
• 2.1.1.1. Capas vectoriales
+ Vector
+ WFS
+ GeoJSON
+ KML
+ MVT
+ OGCAPIFeatures
+ MBTilesVector
+ GenericVector
+ MapLibre
• 2.1.1.2. Capas ráster
+ WMS
+ WMTS
+ TMS
+ XYZ
+ OSM
+ MBTiles
+ GenericRaster
+ GeoTIFF
• 2.1.1.3. Capas rápidas
■ 2.1.2. Simbolización
• 2.1.2.1. Genérica
+ Puntos
+ Líneas
+ Polígonos
• 2.1.2.2. Básica
+ Puntos
+ Líneas
+ Polígonos
• 2.1.2.3. Avanzada
+ Coropletas
+ Proporcional
+ Categorías
+ Estadísticos
+ Mapas de Calor
+ Cluster
+ Línea de flujo
+ Composición
2.4. Paneles
» Creación de panel desde cero sin controles
» Tutorial Panel de un único control
5. API REST
5.1. Parametrización API-REST
5.2. Base de Datos API-REST
5.3. API REST Actions
5.4. Servicio de correos electrónicos
5.5. Capas rápidas
6. PARAMETRIZACIÓN VISUALIZADORES
9. GUÍA DE DESARROLLO
> Guía para el desarrollo de API-CNIG
» Tutorial desarrollo del núcleo de API-CNIG - (Cliente)
> Guía de desarrollo de componentes
» Tutorial desarrollo del núcleo de API-CNIG - (Servidor)
> Guía de desarrollo de plugins
» Tutorial desarrollo de plugins ya creados
» Tutorial desarrollo de nuevos plugins
> Guía de desarrollo de visualizadores con React