8 votos

El filtro de intersección WFS que utiliza un polígono devuelve todas las características de la capa

Tengo problemas al utilizar el filtro "Intersect" en una consulta WFS GetFeature. Cada consulta que hago parece devolver todas las características disponibles en la capa consultada (y no sólo las características que intersecan el polígono que especifique).

Utilicé el topp:states de la capa de acceso público demo Geoserver .

La petición POST que hice al servidor anterior fue:

<wfs:GetFeature xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.opengis.net/wfs"
    xmlns:gml="http://www.opengis.net/gml" xmlns:wfs="http://www.opengis.net/wfs"
    xmlns:ogc="http://www.opengis.net/ogc" service="WFS" version="1.0.0">
    <wfs:Query typeName="topp:states">
        <ogc:Filter>
            <ogc:Intersect>
                <ogc:PropertyName>the_geom</ogc:PropertyName>
                <gml:Polygon srsName="http://www.opengis.net/gml/srs/epsg.xml#4326"><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>-106.86953585585587,42.627785135135127 -107.47663975975976,38.803030540540533 -105.29106570570572,35.342538288288281 -99.280737057057067,36.01035258258257 -98.4307915915916,41.413577327327317 -106.86953585585587,42.627785135135127</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>
            </ogc:Intersect>
        </ogc:Filter>
    </wfs:Query>
</wfs:GetFeature>

Así se ve el polígono intersectorial (en verde) en relación con los estados:

Preview of how the intersector polygon looks w.r.t the states layer

Como cabría esperar del diagrama anterior, espero que la consulta intersect devuelva 7 estados. En cambio, lo que obtengo en la respuesta del WFS son los 50 estados.

¿Estoy haciendo algo mal en la consulta WFS?

Ya me he asegurado de que el polígono que he utilizado para la intersección está en el mismo SRS que la capa (EPSG 4326).

3 votos

@user30184 Por favor, por favor, no cambies el título para que contenga la respuesta. Eso es algo que deberías haber aprendido cuando hacías las ediciones sugeridas, es claramente contradictorio con la intención del autor.

0 votos

¿Qué me sugiere? No me gustó el original porque puede inducir a la gente a pensar que "Intersect" es un filtro WFS válido.

1 votos

He revertido la edición y he escrito una respuesta que muestra que el mismo error ortográfico también se encuentra en la norma WFS 1.0.0.

8voto

matt Puntos 211

Prueba con se cruza con :

   <ogc:Intersects>
        ...
   </ogc:Intersects>

7voto

Joe Puntos 16

Está utilizando WFS 1.0.0. Esa versión de WFS utiliza Filter Encoding Standard 1.0.0 http://portal.opengeospatial.org/files/?artifact_id=1171 y efectivamente hay una errata en la norma. En la página 17 el esquema para las capacidades de filtrado se define como:

Spatial capabilities are encoded according to the following XML Schema fragment:
<xsd:complexType name="Spatial_CapabilitiesType">
<xsd:sequence>
<xsd:element name="Spatial_Operators"
type="ogc:Spatial_OperatorsType"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Spatial_OperatorsType">
<xsd:choice maxOccurs="unbounded">
<xsd:element ref="ogc:Equals"/>
<xsd:element ref="ogc:Disjoint"/>
<xsd:element ref="ogc:Touches"/>
<xsd:element ref="ogc:Within"/>
<xsd:element ref="ogc:Overlaps"/>
<xsd:element ref="ogc:Crosses"/>
<xsd:element ref="ogc:Intersect"/>
<xsd:element ref="ogc:Contains"/>
<xsd:element ref="ogc:DWithin"/>
<xsd:element ref="ogc:Beyond"/>
<xsd:element ref="ogc:BBOX"/>
</xsd:choice>
</xsd:complexType>

Sin embargo, la misma norma define en la página 9:

The XML encoding for spatial operators is defined by the following XML Schema fragment:
<xsd:element name="Equals"
type="ogc:BinarySpatialOpType" substitutionGroup="ogc:spatialOps"/>
<xsd:element name="Intersects"
...

Así pues, el nombre del operador es "Intersects" y así es como debe utilizarse en el filtro. Sin embargo, los servidores compatibles con WFS 1.0.0 deben anunciar el operador como "Intersects" porque así está escrito en el esquema XML correspondiente. También puede ver que, por ejemplo, GeoServer sigue la norma y solicita http://demo.opengeo.org/geoserver/wfs?service=wfs&version=1.0.0&request=getcapabilities devuelve

<ogc:Filter_Capabilities>
<ogc:Spatial_Capabilities>
<ogc:Spatial_Operators>
...
<ogc:Intersect/>
...

En versiones posteriores de la norma Filter Encoding se corrige este error ortográfico y, por ejemplo http://demo.opengeo.org/geoserver/wfs?service=wfs&version=1.1.0&request=getcapabilities devuelve el nombre del operador como

<ogc:SpatialOperator name="Intersects"/>

0 votos

¡Qué respuesta tan fantástica y detallada! Me encantaría marcarla como la respuesta aceptada, pero me parece mal quitar puntos a la respuesta de @Azimo, teniendo en cuenta lo rápida que fue la respuesta. ¿Cuál es el protocolo de SE en estos casos? ¿Qué sería lo correcto?

1 votos

Que sea como sea @Azimo se merece el honor.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X