【发布时间】:2019-02-25 14:05:49
【问题描述】:
我有以下查询,它对位置进行聚类,并返回一个聚类 ID,以及一个包含该聚类内原始点的结构:
SELECT
cluster_id,
ST_AsGeoJSON(ST_Collect(origin)) AS points
FROM (
SELECT
origin,
ST_ClusterDBSCAN(origin, eps := 0.01, minPoints := 5) OVER(ORDER BY id) AS cluster_id
FROM
ride
WHERE
region_id = 1 AND
created_at > now() - interval '1 week'
) a
WHERE cluster_id IS NOT NULL
GROUP BY cluster_id
示例输出:
3 {"type":"MultiPoint","coordinates":[ ... ]}
4 {"type":"MultiPoint","coordinates":[ ... ]}
我想返回集群的边界圆(中心和半径),而不是返回原始点,这可以使用ST_MinimumBoundingRadius:
SELECT
ST_AsGeoJSON(center),
radius
FROM
ST_MinimumBoundingRadius(
ST_GeomFromGeoJSON('{"type":"MultiPoint","coordinates":[ ... ]}')
)
示例输出:
{"type":"Point","coordinates":[ ... ]} 0.002677744742706528
然而,ST_MinimumBoundingRadius 返回两列,下面会抛出错误:
SELECT
cluster_id,
ST_MinimumBoundingRadius(ST_Collect(origin))
FROM (
...
) a
WHERE cluster_id IS NOT NULL
GROUP BY cluster_id;
我发现this 问题提到使用LATERAL,但我无法获得有效的查询。
这样做的正确方法是什么?
【问题讨论】:
标签: postgresql postgis