我正在使用PostGIS在Postgres 9.6中工作。我有一张非常大的桌子(约30GB):
Table "public.parcels"
Column | Type | Modifiers
--------------+-------------------------+------------------------------------------------------------------
ogc_fid | integer | not null default nextval('parcels_ogc_fid_seq'::regclass)
wkb_geometry | geometry(Polygon,4326) |
county | character varying |
我想创建一个新表,每个县包含一个多边形,多边形是该县多边形的并集。我已按如下方式定义了我的新表:
gid | integer | not null default nextval('newtable_gid_seq'::regclass)
the_geom | geometry(Polygon,4326) |
我知道如何从第一张表到第二张表一次插入一个县:
INSERT INTO by_county(the_geom) values
((SELECT ST_Union(wkb_geometry) FROM parcels where county='Warwick'));
但是我怎么能以编程方式为所有县做这个呢?我目前的方法是用psycopg2编写一个Python脚本,首先检索DISTINCT
县名,然后为每个县手动运行上面的命令:但是我想知道是否有更少的手动方式。
如上所述,这是一个大型数据集,我正在使用16GB RAM的机器上工作。那么我的一次性命令可能是最好的吗?
答案 0 :(得分:1)
由于ST_Union是一个聚合函数,您可以在select
中执行GROUP BYINSERT INTO by_county(county, the_geom)
SELECT country, ST_Union(wkb_geometry) FROM parcels GROUP BY county
如上所述,这是一个大型数据集,我正在使用一台机器 16GB的RAM。所以可能是我的一次命令一次性的方法 毕竟是最棒的?
可能不是因为postgresql非常擅长处理大型数据集。根据经验,一个大查询将比一组小查询更快。
答案 1 :(得分:0)
您可以尝试使用COPY命令。你可以试一试
psql -d <DATABASE> -c "copy (SELECT country, ST_Union(wkb_geometry) FROM parcels GROUP BY county) to STDOUT" | psql -d <DATABASE> -c "copy by_county from STDIN"
您必须确保您指定的列是有序的。