[postgis-tickets] [PostGIS] #3127: KNN geog distance doesn't match ST_Distance spheroid but uses sphere
PostGIS
trac at osgeo.org
Mon May 25 17:50:44 PDT 2015
#3127: KNN geog distance doesn't match ST_Distance spheroid but uses sphere
---------------------------+---------------------------
Reporter: robe | Owner: robe
Type: defect | Status: new
Priority: medium | Milestone: PostGIS 2.2.0
Component: documentation | Version: trunk
Keywords: |
---------------------------+---------------------------
I'm not sure if this is expected or not, but I was trying to write up
regress tests for KNN geog and found inconsistencies between what <->
returns and what ST_Distance geography returns which changes the ranking.
It seems the <-> is returning the sphere distance instead of spheroid
(e.g. I get same answer if I do
{{{
ST_Distance(geog1,geog2, false) )
}}}
If that is the case, and by design, we just need to make a note of it in
the docs, so people don't falsely report its bugged.
e.g.:
{{{
CREATE TABLE knn_recheck_geog(gid serial primary key, geog geography);
INSERT INTO knn_recheck_geog(gid,geog)
SELECT ROW_NUMBER() OVER(ORDER BY x,y) AS gid,
ST_Point(x*1.11,y*0.95)::geography As geog
FROM generate_series(-100,100, 1) AS x CROSS JOIN
generate_series(-90,90,1) As y;
SELECT a.gid, b.gid As match, RANK() OVER(PARTITION BY a.gid ORDER BY
ST_Distance(a.geog, b.geog) ) As true_rn, b.rn As knn_rn,
ST_Distance(a.geog, b.geog) As dist_spheroid, ST_Distance(a.geog, b.geog,
false) As dist_sphere,
a.geog <-> b.geog As knn_dist
FROM knn_recheck_geog As a
LEFT JOIN
LATERAL ( SELECT gid, geog, RANK() OVER(ORDER BY a.geog
<-> g.geog) As rn
FROM knn_recheck_geog As g WHERE a.gid <> g.gid
ORDER BY 'POINT(-105.45 3.8)'::Geography <-> g.geog LIMIT 5) As b ON true
WHERE a.gid = 1000
ORDER BY a.gid, b.rn;
}}}
yields:
{{{
gid | match | true_rn | knn_rn | dist_spheroid | dist_sphere |
knn_dist
------+-------+---------+--------+------------------+------------------+------------------
1000 | 1001 | 2 | 1 | 105051.447591582 | 105635.3257479 |
105635.3257479
1000 | 999 | 1 | 2 | 105049.134514627 | 105635.3257479 |
105635.3257479
1000 | 819 | 3 | 3 | 123294.778176043 | 123155.172887459 |
123155.172887459
1000 | 1181 | 4 | 4 | 123294.778176044 | 123155.17288746 |
123155.17288746
1000 | 820 | 5 | 5 | 161924.039877904 | 162197.178690157 |
162197.178690157
(5 rows)
}}}
--
Ticket URL: <http://trac.osgeo.org/postgis/ticket/3127>
PostGIS <http://trac.osgeo.org/postgis/>
The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project.
More information about the postgis-tickets
mailing list