Skip to content

2.1.3. Filtros

yaizavalidador edited this page Jun 27, 2023 · 1 revision

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);

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. MAPA
2.1. Capas

 ■ 2.1.1. Fuentes
   • 2.1.1.1. Capas vectoriales
     + Vector
     + WFS
     + GeoJSON
     + KML
     + MVT
     + OGCAPIFeatures
     + MBTilesVector
     + GenericVector
   • 2.1.1.2. Capas ráster
     + WMS
     + WMTS
     + TMS
     + XYZ
     + OSM
     + MBTiles
     + GenericRaster
   • 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.1.3. Filtros

    2.3. Plugins

2.4. Paneles

  ■ Creación de panel desde cero sin controles

  ■ Tutorial Panel de un único control

  ■ Tutorial Panel de un único control con más de un botón

  ■ Tutorial Panel con más de un control

2.5. Eventos

  ■ Gestión de eventos
  ■ Gestión de eventos en controles personalizados

    2.6. Internacionalización

    2.7. Configuración

    2.8. Acceso librerías base

3. UTILIDADES

4. PROXY

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

7. SOLUCIÓN DE PROBLEMAS

8. PROCESO DE VERSIONADO

9. GUÍA DE DESARROLLO
  > Guía de desarrollo de plugins
  > Guía de desarrollo de visualizadores con React
  > Guía de desarrollo de componentes
  > Guía para el desarrollo de API-CNIG
  > Compilación proyecto API-CNIG

Clone this wiki locally