[
https://issues.apache.org/jira/browse/SEDONA-178?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17616504#comment-17616504
]
Martin Andersson commented on SEDONA-178:
-----------------------------------------
Distance queries where the driving side is of type point still works. Other
types of distance queries are incorrect.
I think the circle only makes sense for points. A circle around a long
horizontal line would be larger vertically than necessary.
One option would by to introduce a new class BuffedGeometry and use that for
distance joins.
Pseudo code:
{{class BufferedGeometry extends Geometry {}}
{{ BufferedGeometry(wrappedGeometry, bufferSize) \{...}}}
{{ Envelope getEnvelopeInternal() {}}
{{ // Used for partitioning. Return wrappedGeomtry extended with bufferSize}}
{{ } }}
{{ boolean contains(otherGeom) {}}
{{ return wrappedGeometry.distance(otherGeom) < bufferSize}}
{{ }}}
{{ boolean intersects(otherGeom) {}}
{{ return wrappedGeometry.distance(otherGeom) <= bufferSize}}
{{ }}}
{{}}}
> 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
> Priority: Major
>
> 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)