当前位置: 首页 > 知识库问答 >
问题:

找到一公里内最大的点群

司徒隐水
2023-03-14

我在研究空间日期时遇到了一个问题。我有一个包含列的表:对象id及其坐标(纬度和经度,数据类型是几何体)。我需要找到一公里内最大的一组点。我怎么能这么做?

共有1个答案

阎彬炳
2023-03-14

您可以使用ST_ClusterDBSCAN创建具有给定距离和最少点数的簇。在下面的查询中,我用最少两个点创建1000米范围内的点簇,并在外部查询中计算它们:

SELECT 
  cluster,count(*),ST_Union(geom)
FROM (
  SELECT 
    geom,
    ST_ClusterDBSCAN(geom,1000,2) OVER () AS cluster FROM t) j
WHERE cluster IS NOT NULL
GROUP BY 1
ORDER BY 2 DESC
FETCH FIRST ROW WITH TIES;

注:ST_ClusterDBSCAN预计距离以基础SRS为单位!当我使用EPSG:26986时,它是米。将此参数调整到您的SRS。还请注意,FETCH FIRST ROW WITH TIES(PostgreSQL 13)允许您从ORDER BY子句中获取第一个结果,以防它们共享相同的值。换句话说,如果两个或多个簇包含相同数量的点,它们将全部列出。如果使用限制1仅获取第一行,则只会获得一条(任意)记录。

演示:db

CREATE TABLE t (geom geometry(point,26986));
-- 100 random points over the given polygon
INSERT INTO t 
SELECT (ST_Dump(ST_GeneratePoints('SRID=26986;POLYGON((4216635.436744224 3906228.6933973604,4225112.992686871 3914713.9388259286,4237223.322966506 3902640.089526773,4228720.260658542 3894129.3145975843,4216635.436744224 3906228.6933973604))',100,42))).geom;

选择距离彼此1公里内至少有2个点的最大集群(带领带)。

SELECT count(*),ST_Union(geom)
FROM (
  SELECT geom, ST_ClusterDBSCAN(geom,1000,2) OVER () AS cluster 
  FROM t) j
WHERE cluster IS NOT NULL
GROUP BY cluster
ORDER BY 1 DESC
FETCH FIRST ROW WITH TIES

 count |                                                                                                                                        st_union                                                                                                                                        
-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     6 | 01040000206A690000060000000101000000DEF0FA99831C5041605685812CC14D410101000000949040228D1C50418B6D583ACCC24D4101010000008441B6498F1C50414E04C49555C44D41010100000020AD7813131D50410179F7E239C24D41010100000015A4562E231D5041B07FE58158C04D4101010000009F78C907301D50414A726F118CC44D41

如果我们用原始数据集覆盖这个结果集的最小边界圆,我们可以更好地可视化集群区域(仅供说明):

WITH i AS (
  SELECT count(*),ST_MinimumBoundingCircle(ST_Union(geom)) AS geom
  FROM (
    SELECT geom, ST_ClusterDBSCAN(geom,1000,2) OVER () AS cluster 
    FROM t) j
  WHERE cluster IS NOT NULL
  GROUP BY cluster
  ORDER BY 1 DESC
  FETCH FIRST ROW WITH TIES
)
SELECT geom FROM i
UNION 
SELECT geom FROM t

进一步阅读:

  • ST_MinimumBoundingCircle
  • ST_GeneratePoints

 类似资料:
  • 问题内容: 这可能不清楚,也可能不清楚,如果我不在基地或您需要更多信息,请给我评论。也许对于我想要的PHP已经有了解决方案。 我正在寻找一个函数,该函数将从经度或纬度值中增加或减去一个距离。 原因:我有一个包含所有纬度和经度的数据库,并且想要形成一个查询以提取X公里(或英里)内的所有城市。我的查询看起来像这样… 我正在使用MySql数据库使用PHP。 也欢迎任何建议!:) 问题答案: 这是一个My

  • 问题内容: 我想知道是否有人可以帮助我找到一组变量的最大值并将它们分配给另一个变量。这是我的代码段,可能有助于理解我在说什么。 问题答案: 在Java中,您可以像这样使用Math.max: 不是最优雅的,但它会起作用。 另外,为获得更强大的解决方案,请定义以下功能: 您可以通过以下方式致电给您:

  • 给定n个非负整数a1, a2,..., an,其中每个表示坐标(i, ai)处的点。绘制n条垂直线,使得线i的两个endpoint位于(i, ai)和(i,0)。找到两条线,它们与x轴一起构成一个容器,使得容器中包含最多的水。 注意:容器不能倾斜。 一种解决方案可能是我们取每一行并找到每一行的区域。这需要O(n^2)。没有时间效率。 另一种解决方案是使用DP找到每个索引的最大面积,然后在索引n处,

  • 面试问题: 给定数十亿个矩形,找到与给定点P(x,y)重叠的最小面积矩形 有一种简单的方法通过顺序地处理每个矩形来在O(n)时间内实现答案,但进一步优化它提供了大量的矩形阵列。 我最好的方法是检查每个矩形,看看点是否在里面,然后计算面积并与当前最小的面积进行比较。这可以一次完成。我想不出任何其他不需要检查所有矩形的方法

  • 我画了一条基于滑块的角度线。 我试图使线的末端Y坐标为某个数字(比如300),即使它是一个角度。 有什么办法吗?以下是我目前的工作: }

  • 我试图通过在MST中添加新顶点来更新MST。为此,我一直在关注Chin和Houck的“更新生成树”。http://www.computingscience.nl/docs/vakken/al/WerkC/UpdatingSpanningTrees.pdf 论文中的一个步骤要求我在两个给定顶点之间的路径中找到最大的边。我的想法是找到顶点之间所有可能的路径,然后从这些路径中找到最大的边。我一直在尝试在