我维护两个postgis表:“track_points”和“buffers”。 “track_point”表包含大量(近10亿)个点,“缓冲”表包含大约20个多边形。
我想要做的是,检查它们所包含的缓冲区中的所有点,并将相应的缓冲区ID分配给点记录。在搜索网络后,我发现“空间关节”在这里可能是一个很大的帮助。基于我在网络上发现的内容,我将一个看起来像这样的查询({schema}只是模式名称的占位符):
WITH join_query AS (
SELECT
points.id AS point_id,
buffers.profile_id AS profile_id
FROM {schema}.buffers AS buffers
JOIN {schema}.track_points AS points
ON ST_Contains(buffers.geom, points.geom)
)
UPDATE {schema}.track_points
SET profile_id = join_query.profile_id
FROM join_query
WHERE id = join_query.point_id
我运行了查询,但track_points表中没有任何profile_id值发生了变化。所以我猜我的查询一定有问题?!??
此外,是否有人建议如何更有效地实现我的目标(关于track_points表中的大量点数)?
顺便说一下,我正在使用Python的psycopg2来连接数据库。
如果您的点数表是十亿条记录,甚至不尝试更新它 - 或者您可以等待几天/几周来结束此更新;)。对于这种大规模操作,完美的解决方案是CTAS(创建表格选择);我假设你的多边形不相互交叉,如果是,那么告诉我你想要哪个缓冲区的profile_id(max,min ....);
create table track_points2 as
select your_columns_for_track_points(expect profile_id), b.profile_id
from track_points tp, buffers b
where st_dwithin(tp.geom, b.geom,0);
接下来,删除现有的表track_points并将其替换为新的;
drop table track_points;
alter table track_points2 alter rename to track_points;
并为新表创建所有需要的索引和约束。
如果您不能删除数据库中的表,更改表等,那么当然,您必须更新但是可以等待很长时间。
update track_points tp
set profile_id=b.profile_id
from buffers b
where st_dwithin(tp.geom, b.geom,0);
正如我之前写的那样,如果你有相交的缓冲区/多边形,那么你将不得不更改更新以从许多choice_id选项中获得你想要的东西。