我正在尝试使用Postgis 2.0新功能<->(几何距离质心),以便为我的表格(cosn1)的每一行计算到同一类最近的多边形的距离。
我正在尝试使用以下代码:
WITH index_query AS (
SELECT g1.gid As ref_gid, ST_Distance(g1.the_geom,g2.the_geom) As ENN
FROM "cosn1" As g1, "cosn1" As g2
WHERE g1.gid <> g2.gid AND g1.class = g2.class
ORDER BY g1.gid, g1.the_geom <-> g2.the_geom)
SELECT DISTINCT ON (ref_gid) ref_gid, ENN
FROM index_query
ORDER BY ref_gid, ENN;
但是后来我意识到了警告:
注意:仅当其中一种几何形状为常数时,索引才会插入(不是在子查询/ cte中)。例如'SRID = 3005; POINT(1011102 450541)':: geometry而不是a.geom
这意味着完全不会使用索引,并且查询将与使用之前几乎相同的时间:
SELECT DISTINCT ON(g1.gid) g1.gid As ref_gid, ST_Distance(g1.the_geom,g2.the_geom) As ENN
FROM "cosn1" As g1, "cosn1" As g2
WHERE g1.gid <> g2.gid AND g1.class = g2.class
ORDER BY g1.gid, ST_Distance(g1.the_geom,g2.the_geom)
谁能为我指出一种解决方法,使我能够提高查询性能?
非常感谢你。
尚无答复,您可能想在PostGIS邮件列表中询问。
—
GIS乔纳森(Jonathan)
我已经做了,但是也没有任何回应。
—
亚历山大·内托
您可以在where子句中使用g1.gid> g2.gid,这将减少您必须执行的距离计算的次数。不幸的是,直到<->运算符在没有常量的情况下工作,在这种查询中我们看不到速度的改善。
—
约翰·鲍威尔
约翰,我需要保留所有gid,即使是重复的gid,因为我需要为“ cosn1”表中的每个多边形更新EEN。但是你说的给了我一个主意。我可以按照您说的使用g1.gid> g2.gis来减少距离计算,但是将g1.gid和g2.gid保留在结果中。之后,我可以合并它的两个子查询(一个以g1.gis作为gid,另一个与g2.gid)。谢谢
—
亚历山大·内托
我发现解决该恒定问题的一种可能的解决方案是在SQL函数内使用<->,并使用the_geom作为参数。我进行了一些测试,在某些情况下,它的速度要快得多()。但就我而言,由于距离位于同一张表中,因此在此过程中会重复进行许多距离计算,这使其比使用直接查询要慢。
—
亚历山大·内托