Ticket #2564 (closed defect: fixed)

Opened 5 years ago

Last modified 5 years ago

Filter Encoding: Modify DWithin definition

Reported by: assefa Owned by: assefa
Priority: normal Milestone: 5.2 release
Component: WFS Server Version: unspecified
Severity: normal Keywords:
Cc: pramsey@…, bartvde@…, tomkralidis

Description

Currently DWithin is implemented using geos within functionality where the query shape is a buffered copy of the original shape. Same for within. My interpretation of the within/dwithin operator looking at the specs "simple feature specification for sql" was that the feature should be totally contained. If that is not the case, It can easily be changes to use the distance geos operator.

But this interpretation might be wrong and expected behavior would be more like

 http://geoapi.sourceforge.net/2.0/javadoc/org/opengis/filter/spatial/DWithin.html and  http://download.oracle.com/docs/html/A85337_01/sdo_objg.htm#854615

Change History

Changed 5 years ago by assefa

  • keywords tomkralidis added

We had this discussion in bug #2105 ( http://trac.osgeo.org/mapserver/ticket/2105#comment:6) and that was what was implemented.

Do we change it for 5.2 to be similar to within_distance?

Changed 5 years ago by pramsey

I'm checking with PeterV on the origins of his BNF interpretation... I can't find it in the Cat1 or Cat2 docs. (I can find DWITHIN, but no explanation of semantics).

Changed 5 years ago by bartvde

The following works for me to fix this:

--- mapquery.c.orig     2008-03-28 10:19:09.000000000 +0100
+++ mapquery.c  2008-03-28 10:19:37.000000000 +0100
@@ -1304,7 +1304,7 @@
             break;

           case MS_GEOS_WITHIN:
-            status = msGEOSWithin(&shape, selectshape);
+            status = (msGEOSDistance(&shape, selectshape) <= 0);
             if (status != MS_TRUE && status != MS_FALSE)
               status = MS_FALSE;
             break;

Changed 5 years ago by pramsey

From Peter Vretanos <pvretano at cubewerx dot com>, the editor of the Filter specification document. Apparently DWithin was never really clearly defined, but he polled the rest of the working group and got:

I raised the issue of DWithin with:

1) Doug Nebert
2) The ISO/OGC WFS/FES Editing Committee

and the answers I got where:

Doug: DWithin(A,B,D) = Distance(A,B) < D

ISO EC: DWithin(A,B,D) = Within(Buffer(A,D),B)

so the filter specification will be Within(Buffer(A,D),B) 
since this seems to be the consensus of the members of the 
ISO editing committee.

If you need "Distance(A,B)<D" you can always define a 
function in V2.0 of the WFS to do this.  You can either 
use the Function element from Filter or define a stored 
query.

If this is still an issue for you, I would be happy to 
raise the issue again with the ISO EC since there is 
still one more opportunity (before we release) the 
specification).

Changed 5 years ago by assefa

  • cc tomkralidis added
  • owner changed from mapserverbugs to assefa
  • status changed from new to assigned

Paul,

Thanks for following on this.

We sill have the opportunity before the 5.2 release to modify the current DWITHIN implementation to fit the Distance(A,B) < D model. At this point, for me the decision is more based on which way of doing things is more intuitive to the user and more useful. I am inclined at this point to says that Distance(A,B) < D would be a way to go. Tom, what would be your opinion on this? Any objections to modify the behaviour?

Changed 5 years ago by tomkralidis

  • keywords tomkralidis removed

How does GeoServer do it? With the GeoAPI way (sorry, I'm not familiar with GeoServer innards)? I would see this as important in terms of semantic interpretation and how clients apply filters to WFS instances.

Having said this, I would tend to agree with Assefa in terms of intuitiveness. At the same time, if there is consensus at the ISO EC for the "other" way, do we, in MapServer, define DWithin as a SpatialOperator, or as a FunctionName specific to MapServer?

Don't mean to split hairs, but just want to pass on some food for thought. Personally, I would go with defining DWithin as a SpatialOperator per Distance(A,B) < D.

Changed 5 years ago by bartvde

I agree with Tom, I would also go for defining DWithin as a SpatialOperator? per Distance(A,B) < D.

Are we gonna do this before 5.2?

Changed 5 years ago by assefa

Bart, this would be done before the 5.2 release.

Changed 5 years ago by assefa

  • status changed from assigned to closed
  • resolution set to fixed

changes committed in revision r7696.

Note: See TracTickets for help on using tickets.