【问题标题】:number of points within a radius of another set of points另一组点的半径内的点数
【发布时间】:2015-05-11 18:23:24
【问题描述】:

我有两张桌子。一个是商店列表(带有纬度/经度)。另一个是客户地址列表(带有纬度/经度)。我想要的是一个查询,它将为我的表中的每个商店返回一定半径内的客户数量。这给了我任何商店 10,000 米范围内的客户总数,但我不确定如何循环它以为每个商店返回一行并计数。

请注意,我正在使用 cartoDB 进行此查询,其中 the_geom 基本上是 long/lat。

SELECT COUNT(*) as customer_count FROM customer_table 
WHERE EXISTS(
    SELECT 1 FROM store_table
    WHERE ST_Distance_Sphere(store_table.the_geom, customer_table.the_geom) < 10000
)

这会产生一行:

customer_count
4009

关于如何解决我的问题的建议?我愿意以其他可能更有效(更快)的方式来做这件事。

作为参考,带有商店名称的列,将在一列中是store_identifier.store_table

【问题讨论】:

  • 不要使用count(*)select * ...,然后使用 num_rows() 快速确定匹配的商店数量。
  • 我已经回答了你后来的问题 - 非常相似 - 问题。我建议您完全删除此问题,因为它似乎已被您以后的问题所取代。

标签: postgresql postgis cartodb


【解决方案1】:

我假设您使用the_geom 来表示商店和客户的坐标(纬度/经度)。我还将假设 the_geomgeography 类型。您的查询将是这样的

select s.id, count(*) as customer_count
from customers c
inner join stores s 
  on st_dwithin(c.the_geom, s.the_geom, 10000)
group by s.id

这应该会为您提供整洁的表格,其中包含商店 ID 和距离商店 10,000 米范围内的顾客数量。

如果the_geomgeometry 类型,您的查询将非常相似,但您应该使用st_distance_sphere() 来代替以公里(而不是度数)表示距离。

【讨论】:

  • 你的所有假设都是正确的,但这给了我每个商店位置的相同数字......我的客户表中的总行数。
  • 问题中的 ST_Distance_Sphere() 与 lon\lat geometry 完美配合,返回以米为单位的距离。
  • @jonmrich 显然您的 the_geom 字段不是 geography 数据类型(ST_DWithin() 使用 lon/lat 并以米为单位报告),而是 geometry 数据类型在 lon/lat单位(SRID 为 4326,WGS84),ST_DWithin() 使用 lon/lat 作为输入和输出。换言之,值“10000”被理解为表示“球体上10,000度的分离度”。因此,所有商店位置都有“附近”的所有客户。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 2015-08-23
  • 1970-01-01
相关资源
最近更新 更多