使用空间连接子查询更新postgis表

问题描述 投票:2回答:1

我维护两个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来连接数据库。

python postgis psycopg2
1个回答
2
投票

如果您的点数表是十亿条记录,甚至不尝试更新它 - 或者您可以等待几天/几周来结束此更新;)。对于这种大规模操作,完美的解决方案是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选项中获得你想要的东西。

© www.soinside.com 2019 - 2024. All rights reserved.