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)