我有以下查询检查点(T.latitude, T.longitude)
是否在POLYGON
query = """
SELECT id
FROM T
WHERE ST_Intersects(ST_Point(T.latitude, T.longitude), 'POLYGON(({points}))')
"""
但它运行缓慢,如果我有以下索引,我怎么能加快它:
(latitude, longitude)
?
查询很慢,因为它必须为每对可能的点计算公式。所以它使得postgress服务器做了很多数学运算,它迫使它扫描你的整个位置表。我们怎样才能优化这个?也许我们可以消除太远的北方或太远的南方或太远的东方或西方的分数?
答案 0 :(得分:3)
1)添加Geometry(Point)类型的几何列并填充它:
ALTER TABLE T add COLUMN geom geometry(Point);
UPDATE T SET geom = ST_Point(T.latitude, T.longitude);
2)创建spatial index:
CREATE INDEX t_gix ON t USING GIST (geom);
3)使用ST_DWithin代替ST_Intersect:
WHERE ST_DWithin('POLYGON(({points}))', geom, 0)
您希望实际找到多边形内的点,因此ST_DWithin()就是您所需要的。来自documentation:
此函数调用将自动包含一个边界框 比较将使用任何可用的索引
PS:
如果由于某种原因无法取得积分1和2,那么至少使用ST_Dwithin代替ST_Intersect:
WHERE ST_DWithin('POLYGON(({points}))', ST_Point(T.latitude, T.longitude), 0)
最后一个参数是公差。
答案 1 :(得分:0)
您可以轻松加快向脚本添加t1.geom&&t2.geom
条件的空间查询
这种情况;
以下是我的数据库和查询时间的示例;
select p.id,k.id, p.poly&&k.poly as intersects
from parcel p , enterance k
where st_contains(p.poly,k.poly) and p.poly&&k.poly
--without && 10.4 sec
--with && 1.6 sec
select count(*) from parcel --34797
select count(*) from enterance --70715