# 原始点表
CREATE TABLE "public"."pointset" ("geom" "public"."geometry"
);# 数据抽稀结果表
CREATE TABLE "public"."thinout" ("geom" "public"."geometry"
);
INSERT INTO pointset SELECT
( ST_Dump ( ST_GeneratePoints ( kl.geom, 400 ) ) ).geom AS geom
FROM( SELECT ST_SetSRID ( ST_MakeBox2D ( ST_Point ( - 180, - 90 ), ST_Point ( 0, 0 ) ), 4326 ) geom ) kl;INSERT INTO pointset SELECT
( ST_Dump ( ST_GeneratePoints ( kl.geom, 400 ) ) ).geom AS geom
FROM( SELECT ST_SetSRID ( ST_MakeBox2D ( ST_Point ( 0, 0 ), ST_Point ( 180, 90 ) ), 4326 ) geom ) kl;
INSERT INTO thinout SELECT geom from
(SELECT WIDTH_BUCKET ( st_x ( geom ), -180, 180, 20 ) grid_x,WIDTH_BUCKET ( st_y ( geom ), -90, 90, 20 ) grid_y,st_centroid ( st_collect ( geom ) ) geom FROM pointset GROUP BYgrid_x,grid_y ) as t1;
另外,我们也可以通过执行sql也发现抽稀效果很明显:
select 'pointset' as tablename,count(*) from pointset
union
select 'thinout' as tablename,count(*) from thinout;
WIDTH_BUCKET
函数不是postgis特有的函数,它的主要作用是给你一个数值在哪个特定范围区间。比如下图,将分数0-100分分成5等分,求45分在第几段范围。
根据上面的问题,可以转换为如下sql语句:
select WIDTH_BUCKET (45,0,100,5)
SELECT WIDTH_BUCKET ( st_x ( geom ), -180, 180, 20 ) grid_x,WIDTH_BUCKET ( st_y ( geom ), -90, 90, 20 ) grid_y,geom
FROM pointset
相当于给-180~180分成20个段,-90~90分成20个段,即20×20的网格,然后计算每个点对应网格的坐标。这样每个网格坐标(grid_x,grid_y)包含多个点。
结合group by
,并通过聚合函数st_collect
将同一网格的点变为多点对象,最后通过st_centroid
求多点对象的中心点坐标。所以,经过抽稀的点并不会与原始点重合。
本文发布于:2024-01-30 05:08:44,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170656252819447.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |