如何使用postgis计算距离中心点一定距离内的点数?

如何使用postgis计算距离中心点一定距离内的点数?,postgis,spatial-query,Postgis,Spatial Query,我正在寻找以下问题的解决方案: 我在postgress 9.3中有数千个点特征的表格。我想去掉一些无关紧要的地方。通过这个例子,我理解了邻域不多的点,可以通过距离或扩展的bbox来定义什么。我最好数一数这些邻居,然后决定他们中有多少是重要的。欢迎任何意见 最简单的方法是使用空间自联接来计算一个表中与另一个表中每个点的缓冲区相交的点的数量(其中两个表是相同的,即,您看到的是笛卡尔积,尽管通过使用空间索引可以缓解这一问题,请参见下文)。假设您有一个名为points的表,您的点域名为geom,每个点都

我正在寻找以下问题的解决方案:
我在postgress 9.3中有数千个点特征的表格。我想去掉一些无关紧要的地方。通过这个例子,我理解了邻域不多的点,可以通过距离或扩展的bbox来定义什么。我最好数一数这些邻居,然后决定他们中有多少是重要的。欢迎任何意见

最简单的方法是使用空间自联接来计算一个表中与另一个表中每个点的缓冲区相交的点的数量(其中两个表是相同的,即,您看到的是笛卡尔积,尽管通过使用空间索引可以缓解这一问题,请参见下文)。假设您有一个名为points的表,您的点域名为geom,每个点都有一个ID域,并且您对每个点1km范围内的所有点都感兴趣,那么您可以执行以下操作:

select a.id, count(b.id) as num_neighbors 
from 
    points a, points b 
where st_dwithin(a.geom, b.geom, 1000) and a.id != b.id 
group by a.id 
order by num_neighbors;
使用order by和limit x查找邻居数最少的x点

如果要使用矩形区域而不是圆形区域来计算相邻点的数量,请使用函数(与ST_相交一起)而不是。然而,由于ST_DWithin直接使用索引,这将更慢,也更不准确

出于性能方面的原因,请确保在几何体字段上有一个属性

编辑2:在您的问题更新之后,我建议您尝试以下方法:在更新、设置、发件人、位置顺序之后,Postgres使用该顺序从子查询进行更新

update point SET num_neighbors=agg.num_neighbors 
   from (
      select count(b.id) as num_neighbors, a.id 
      from 
          point a, point b 
       where st_dwithin(a.geom, b.geom, 1000) and a.id != b.id group by a.id) 
   agg 
where agg.id=point.id;
在此查询前使用
解释
,并将预期执行时间与您的查询进行比较。我没有你的确切数据,但通过一组随机点的测试,这个查询比你在更新的问题中提出的查询快了几个数量级


编辑1:原始答案经过编辑,以考虑Mike T建议的使用ST_DWithin的更好方法。

最简单的方法是使用空间自连接来计算一个表中与另一个表中每个点的缓冲区相交的点的数量(如果两个表都相同,即,您看到的是笛卡尔积,尽管通过使用空间索引可以缓解这一问题——请参见下文)。假设您有一个名为points的表,并且您的点域名为geom,每个点都有一个ID域,并且您对每个点1km范围内的所有点都感兴趣,您可以:

select a.id, count(b.id) as num_neighbors 
from 
    points a, points b 
where st_dwithin(a.geom, b.geom, 1000) and a.id != b.id 
group by a.id 
order by num_neighbors;
使用order by和limit x查找邻居数最少的x点

如果要使用矩形区域而不是圆形区域来计算相邻点的数量,请使用函数(与ST_相交一起)而不是。但是,由于ST_DWithin直接使用索引,这将更慢,也更不准确

出于性能方面的原因,请确保在几何体字段上有一个属性

编辑2:在您的问题更新之后,我建议您尝试以下方法:在更新、设置、发件人、位置顺序之后,Postgres使用该顺序从子查询进行更新

update point SET num_neighbors=agg.num_neighbors 
   from (
      select count(b.id) as num_neighbors, a.id 
      from 
          point a, point b 
       where st_dwithin(a.geom, b.geom, 1000) and a.id != b.id group by a.id) 
   agg 
where agg.id=point.id;
在此查询前使用
解释
,并将预期执行时间与您的查询进行比较。我没有您的确切数据,但使用随机点测试集,此查询比您在更新的问题中输入的查询快几个数量级


编辑1:原始答案经过编辑,以考虑Mike T建议的使用ST_DWithin的更好方法。

最简单的方法是使用空间自连接来计算一个表中与另一个表中每个点的缓冲区相交的点的数量(如果两个表都相同,即,您看到的是笛卡尔积,尽管通过使用空间索引可以缓解这一问题——请参见下文)。假设您有一个名为points的表,并且您的点域名为geom,每个点都有一个ID域,并且您对每个点1km范围内的所有点都感兴趣,您可以:

select a.id, count(b.id) as num_neighbors 
from 
    points a, points b 
where st_dwithin(a.geom, b.geom, 1000) and a.id != b.id 
group by a.id 
order by num_neighbors;
使用order by和limit x查找邻居数最少的x点

如果要使用矩形区域而不是圆形区域来计算相邻点的数量,请使用函数(与ST_相交一起)而不是。但是,由于ST_DWithin直接使用索引,这将更慢,也更不准确

出于性能方面的原因,请确保在几何体字段上有一个属性

编辑2:在您的问题更新之后,我建议您尝试以下方法:在更新、设置、发件人、位置顺序之后,Postgres使用该顺序从子查询进行更新

update point SET num_neighbors=agg.num_neighbors 
   from (
      select count(b.id) as num_neighbors, a.id 
      from 
          point a, point b 
       where st_dwithin(a.geom, b.geom, 1000) and a.id != b.id group by a.id) 
   agg 
where agg.id=point.id;
在此查询前使用
解释
,并将预期执行时间与您的查询进行比较。我没有您的确切数据,但使用随机点测试集,此查询比您在更新的问题中输入的查询快几个数量级


编辑1:原始答案经过编辑,以考虑Mike T建议的使用ST_DWithin的更好方法。

最简单的方法是使用空间自连接来计算一个表中与另一个表中每个点的缓冲区相交的点的数量(如果两个表都相同,即,您看到的是笛卡尔积,尽管通过使用空间索引可以缓解这一问题——请参见下文)。假设您有一个名为points的表,并且您的点域名为geom,每个点都有一个ID域,并且您对每个点1km范围内的所有点都感兴趣,您可以:

select a.id, count(b.id) as num_neighbors 
from 
    points a, points b 
where st_dwithin(a.geom, b.geom, 1000) and a.id != b.id 
group by a.id 
order by num_neighbors;
使用order by和limit x查找邻居数最少的x点

如果要使用矩形区域而不是圆形区域