[postgis-devel] KNN Centroid Example
Paragon Corporation
lr at pcorp.us
Mon Sep 26 19:51:51 PDT 2011
What algorithm does it use for non-points. Thought you went with centroid.
IF so how come these don't match or is it centroid of the box?
SELECT ST_Distance(line,pt) as dist, line <-> pt as knn_dist,
ST_Distance(ST_Centroid(line),pt) As dist_cent
FROM (SELECT 'SRID=3005;LINESTRING(1011102 450541, 1011103
450641)'::geometry As line,
'SRID=3005;POINT(1011102 450541)'::geometry As pt) As foo;
Gives me:
dist | knn_dist | dist_cent
------+----------+------------------
0 | 2500.25 | 50.0024999375613
> -----Original Message-----
> From: postgis-devel-bounces at postgis.refractions.net
> [mailto:postgis-devel-bounces at postgis.refractions.net] On
> Behalf Of Paul Ramsey
> Sent: Monday, September 26, 2011 6:59 PM
> To: PostGIS Development Discussion
> Subject: [postgis-devel] KNN Centroid Example
>
> So, I did a few KNN queries on my wee voting areas table (8000 polys).
>
> First the correct answer:
>
> select st_distance(geom, 'SRID=3005;POINT(1011102 450541)')
> as d,edabbr, vaabbr from va2005 order by d limit 10;
>
> d | edabbr | vaabbr
> ------------------+--------+--------
> 0 | ALQ | 128
> 5541.57712511724 | ALQ | 129A
> 5579.67450712005 | ALQ | 001
> 6083.4207708641 | ALQ | 131
> 7691.2205404848 | ALQ | 003
> 7900.75451037313 | ALQ | 122
> 8694.20710669982 | ALQ | 129B
> 9564.24289057111 | ALQ | 130
> 12089.665931705 | ALQ | 127
> 18472.5531479404 | ALQ | 002
> (10 rows)
>
> Then the KNN raw answer:
>
> select st_distance(geom, 'SRID=3005;POINT(1011102 450541)')
> as d,edabbr, vaabbr from va2005 order by geom <->
> 'SRID=3005;POINT(1011102 450541)' limit 10;
>
> d | edabbr | vaabbr
> ------------------+--------+--------
> 0 | ALQ | 128
> 5579.67450712005 | ALQ | 001
> 5541.57712511724 | ALQ | 129A
> 8694.20710669982 | ALQ | 129B
> 9564.24289057111 | ALQ | 130
> 6083.4207708641 | ALQ | 131
> 12089.665931705 | ALQ | 127
> 24795.264503022 | ALQ | 124
> 24587.6584922302 | ALQ | 123
> 26764.2555463114 | ALQ | 125
> (10 rows)
>
> Note the misordering in the actual distances and the
> different entries that actually show up in the top 10.
>
> Finally the hybrid:
>
> with index_query as (
> select st_distance(geom, 'SRID=3005;POINT(1011102 450541)')
> as d,edabbr, vaabbr
> from va2005
> order by geom <-> 'SRID=3005;POINT(1011102 450541)' limit
> 100) select * from index_query order by d limit 10;
>
> d | edabbr | vaabbr
> ------------------+--------+--------
> 0 | ALQ | 128
> 5541.57712511724 | ALQ | 129A
> 5579.67450712005 | ALQ | 001
> 6083.4207708641 | ALQ | 131
> 7691.2205404848 | ALQ | 003
> 7900.75451037313 | ALQ | 122
> 8694.20710669982 | ALQ | 129B
> 9564.24289057111 | ALQ | 130
> 12089.665931705 | ALQ | 127
> 18472.5531479404 | ALQ | 002
> (10 rows)
>
> And again we have the right entries and the right ordering.
> The trouble is the magic number (100) in the subquery. Still,
> it's fast and it uses the index, so, what the hey!
>
> P.
> _______________________________________________
> postgis-devel mailing list
> postgis-devel at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-devel
>
More information about the postgis-devel
mailing list