You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@sedona.apache.org by "Martin Andersson (Jira)" <ji...@apache.org> on 2022/10/12 14:52:00 UTC

[jira] [Created] (SEDONA-178) Correctness issue in distance join queries

Martin Andersson created SEDONA-178:
---------------------------------------

             Summary: Correctness issue in distance join queries
                 Key: SEDONA-178
                 URL: https://issues.apache.org/jira/browse/SEDONA-178
             Project: Apache Sedona
          Issue Type: Bug
            Reporter: Martin Andersson


Hi,

We are seeing erroneous result for some distance join queries.

 

Case 1:

The following query gives no output even though the distance between the geometries is 1.

{{select *}}
{{from (select ST_LineFromText('Linestring(1 1, 1 4)') as geom) a}}
{{join (select st_point(1.0,5.0) as geom) b}}
{{on st_distance(a.geom, b.geom) < 1.4}}

I think the issue boils down to a misuse of/error in Circle class. DistanceJoinExec.scala:60 will create a Circle from the linestring and a radius of 1.4.

Circle will compute the center point (1 2.5) and radius (1.5) for the linestring. The actual radius used is max(radius(lintestring), 1.4). See Circle.java:80 

For the query to work the Circle needs a radius 1.4 _larger_ than the linestring. Like this:

circle = new Circle(geom, 0.0);
circle.setRadius(circle.getRadius() + 1.4)

 

Case 2:

The following query matches the geometries even though the distance is not less than 0.1. Actual distance is 1.

{{select *}}
{{from (select ST_LineFromText('Linestring(1 1, 1 3, 3 3)') as geom) a}}
{{join (select st_point(2.0,2.0) as geom) b}}
{{on st_distance(a.geom, b.geom) < 0.1}}

Pseudo code for the join condition:

new Circle(a.geom, 0.1).covers(b.geom)

The circle does cover the point but the linestring is further away from the point than 0.1

 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)