Prezado leitor,

Você já deve ter passado pelo seguinte problema: filtrar recursos de camadas diferentes usando o WFS.

Como sabemos o CQL não permite que façamos JOIN de camadas. Quando é necessário realizar JOIN de alguma informação, necessitamos criar uma view e a partir desta view uma camada.

Porém hoje, vou apresentar uma forma de como você pode em uma requisição WFS filtrar dados de mais de uma camada. Para isso vamos usar os dados vindos por padrão no GeoServer.

Para aplicar um único CQL_filter em uma camada WFS, é simples. Nós temos a camada topp:tasmania_water_bodies publicado e queremos obter os recursos onde a área é maior do que 1.066.494.066 metros quadrados, para que possamos fazer a próxima requisição ao servidor:

https://demo.geo-solutions.it/geoserver/wfs?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&typeNames=topp:tasmania_water_bodies&propertyName=&cql_filter=AREA<1066494066&outputFormat=application/json

Até aqui foi fácil! Nós teremos 4 recursos que satisfazem os filtros. A sintaxe é clara:

typeNames=topp:tasmania_water_bodiese&cql_filter=AREA<1066494066

Mas, como devemos fazer se quisermos obter recursos de duas ou mais camadas ao mesmo tempo?

Se obtivermos ao mesmo tempo os recursos da camada topp:tasmania_roads com os recursos filtrados anteriormente na camada topp:tasmania_water_bodies, devemos usar uma solicitação semelhante, mas separando o typeNames desta maneira:

typeNames=(topp:tasmania_water_bodies)(topp:tasmania_roads)

E configurar os filtros CQL associados ordenados respeitando os typenames:

cql_filter=AREA<1066494066;TYPE='alley'
https://demo.geo-solutions.it/geoserver/wfs?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&typeNames=(topp:tasmania_water_bodies)(topp:tasmania_roads)&propertyName=&cql_filter=AREA<1066494066;TYPE='alley'&outputFormat=application/json

E o propertyName? Usando o parâmetro propertyName na requisição WFS, podemos filtrar as propriedades do recurso conforme desejado. Esse parâmetro é importante para reduzir o tamanho da resposta, obtendo apenas as propriedades nas quais estamos interessados.

Em nosso exemplo, podemos obter apenas o CNTRY_NAME da topp:tasmania_water_bodies e o TYPE da topp:tasmania_roads.

Neste caso, o a requisição será:

https://demo.geo-solutions.it/geoserver/wfs?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&typeNames=(topp:tasmania_water_bodies)(topp:tasmania_roads)&propertyName=(CNTRY_NAME)(TYPE)&cql_filter=AREA<1066494066;TYPE='alley'&outputFormat=application/json

Desta forma você conseguirá então filtrar as camadas topp:tasmania_water_bodies e TYPE da topp:tasmania_roads em uma única requisição, porém sem as informações das geometrias, apenas os atributos.

Para que a requisição retorne também as geometrias é necessário adicionar a coluna geométrica:

https://demo.geo-solutions.it/geoserver/wfs?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&typeNames=(topp:tasmania_water_bodies)(topp:tasmania_roads)&propertyName=(CNTRY_NAME,AREA,the_geom)(TYPE,the_geom)&cql_filter=AREA<1066494066;TYPE='alley'&outputFormat=application/json

Veja também o vídeo no YouTube, explicando passo a passo o processo descrito acima:



Fonte: Blog Geomatico