Como filtrar grandes conjuntos de dados no Geoserver WMS?

12

Existe uma boa maneira de filtrar conjuntos de dados com aproximadamente 50.000 recursos no Geoserver? Eu teria que selecionar entre 100 e 200 recursos com base em IDs. Esses IDs são diferentes dos FeatureIds. Não foi possível encontrar um operador "IN" semelhante ao SQL no OGC Filter Encoding Standard. A combinação de vários operadores PropertyIsEqualTo tem um desempenho muito ruim.

underdark
fonte

Respostas:

8

Ah Nesse caso, você poderia usar o suporte ao filtro WMS CQL do GeoServer, ou seja:

http://<hostname>/wms?service=WMS&version=1.1.1&request=GetMap&....&cql_filter=IN ('id_1','id_2','id_3')

Mais informações estão disponíveis em http://geoserver.org/display/GEOSDOC/WMS+vendor+parameters

tomkralidis
fonte
Ótimo! Não sabia que existe um operador IN no CQL. Ao tentar isso com o operador "=", o Apache encontrou o "414 Request-URI Too Long". Talvez os personagens salvos dessa maneira façam a diferença.
underdark
2
mude para postar em vez de obter.
Ian Turton
@iant: Você está certo, POST em vez de GET funciona. O desempenho continua ruim, no entanto.
Underdark
você tem um índice na coluna FIDs?
Ian Turton
@iant: Eu tenho um índice no id que estou filtrando, mas não nos FIDs.
Underdark
2

Você pode passar uma lista de IDs de recurso da seguinte maneira:

OBTER:

http://<hostname>/wfs?service=WFS&version=1.1.0&request=GetFeature&typename=foo&featureid=id_1,id_2,id_3

POSTAR:

<?xml version="1.0" encoding="UTF-8"?>
<wfs:GetFeature version="1.1.0" outputFormat="text/xml; subtype=gml/3.1.1" service="WFS" resultType="results" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd" xmlns:ogc="http://www.opengis.net/ogc" xmlns:wfs="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <wfs:Query typeName="foo">
        <wfs:PropertyName>String</wfs:PropertyName>
        <ogc:Filter>
            <ogc:FeatureId fid="id_1"/>
            <ogc:FeatureId fid="id_2"/>
            <ogc:FeatureId fid="id_3"/>
        </ogc:Filter>
    </wfs:Query>
</wfs:GetFeature>

A opção POST é obviamente mais detalhada, mas menor que as construções PropertyIsEqualTo em loop.

tomkralidis
fonte
Parece uma boa solução para filtrar FeatureIds. Infelizmente, os IDs que tenho que filtrar (resultados do algoritmo de uma parte diferente) não são os mesmos que os FeatureIds. Eu atualizei a pergunta.
underdark