很多时候,基于空间角度,需要统计查询出噪点(密集区),利用程序的方式可能比较复杂,但是postgis 基于gis的插件可以很方便的提供一些函数给大家使用。如果有问题,欢迎留言,有空会给大家回复
1、不管三七二十一,先做好空间坐标转换
我一般以4326坐标系作为默认空间坐标系,推荐大家使用dbeaver,查看出来的话就是空间点位,而非转换后的0110203203023之类的
update xx set geom = st_geomfromtext('point('|| lon||' '||lat||')')
2、 根据最小聚合点计算集合的id【cluster_id为null的为噪点 ,即无效聚合点】
已经聚簇的数据,不会重复和其他数据聚簇的,所以不用担心重复数据的问题
eps (度,不是米):xx(米) / (2 * π * 6371004(地球半径)) * 360
minpoints(最小聚合点):int(个)
SELECT *, ST_ClusterDBSCAN(geom, eps := (30 / (2 * 3.14 * 6371004) * 360), minpoints := 3) OVER () AS cluster_id FROM xxx表
3、聚合中心点
这个就是告诉你那里是中心点,以哪个为辐射点的(相当于辐射中心)
SELECT cluster_id,ST_Centroid(ST_Collect(geom)) as center_point,
st_x(ST_Centroid(ST_Collect(geom))) as clusterCentLng,st_y(ST_Centroid(ST_Collect(geom))) as clusterCentLat FROM
( SELECT *, ST_ClusterDBSCAN(geom, eps := (30 / (2 * 3.14 * 6371004) * 360), minpoints := 3) OVER () AS cluster_id FROM xxx表
) t GROUP BY cluster_id;
4、 聚合最小面图形(最小凸包)
这个实际就是就是告诉你聚集点是哪里,什么样子,例如 夜市餐饮店,旅游集合点之类的
如果你要利用程序返回前端的话,需要转成字符串传到前端哦,各位亲们别忘记,此处直接给大家抛出函数ST_AsText,其他的大家自己有空百度即可。
select * from (SELECT ST_ConvexHull(ST_Collect(geom)) AS cluster_pt, cluster_id,COUNT(1) FROM
( SELECT *, ST_ClusterDBSCAN(geom, eps := (30 / (2 * 3.14 * 6371004) * 360), minpoints := 3) OVER () AS cluster_id FROM xx表
)t WHERE cluster_id is not null
GROUP BY cluster_id) tt