【问题标题】:Splitting a city into zones, is it a good idea?将城市划分为多个区域,这是个好主意吗?
【发布时间】:2014-07-05 08:37:47
【问题描述】:

我正在从事一个基于地理位置的个人项目,我想根据用户的纬度和经度值获取供应商。而且供应商的供应半径是可变的,很少有供应商只在其半径5公里范围内供应,而有些供应商可能会在整个城市供应。

解决此问题的一般方法是为每个供应商计算供应商与用户之间的距离。如果它小于或等于它的供应半径,则在结果中显示该供应商。

但这可能会很慢,所以我想我应该把城市分成四个区域(从谷歌地图中选择四个纬度和经度值,用于东南西北)& 每当添加供应商时,我都会进行数学计算& 分配他们可以在数据库中提供的区域。现在,每当我获得用户的纬度和经度时,我都会确定区域并获取可以提供给该区域的供应商,进行距离计算并将它们过滤掉。这样我就可以对较少数量的供应商而不是整个列表进行计算。

但这是个好主意还是我可以做得更好?

【问题讨论】:

  • 您使用的是什么数据库?这就是空间索引擅长的地方,因为它们是二维的(使用 R-Trees),并且支持内部、包含、相交、距离类型的查询。
  • 我打算用postgres
  • 这种情况下,只需使用空间索引,然后使用ST_DWithin(geom1, geom2, distance) 类型查询见postgis.net/docs/ST_DWithin.html
  • 这真是太棒了!我想我什至不需要使用地理编码器 gem,我可以执行适当的 SQL 查询并获取结果。
  • 我已经写了一个更完整的答案,并在您的问题中添加了 Postgres/Postgis 标签:D

标签: ruby-on-rails ruby google-maps postgis rails-geocoder


【解决方案1】:

在你使用 Postgres/Postgis 时,你可以使用spatial indexes,然后使用 ST_DWithin(geom1, geom2, distance) 类型查询见 ST_DWithin docs。空间索引将为您划分空间,使这种查询非常高效,避免您必须提出自己的任何空间分区方案。

您可以使用的另一个运算符是 运算符,它对于空间索引非常有效,并且在 order by 子句中使用,以获取到某个点 x 的最近 y 事物,(k 最近邻搜索)见<-> operator docs. 这个运算符要与索引正常工作的一个警告,您正在搜索的点需要是一个常数,因为听起来就像您的情况一样。

【讨论】:

  • 非常感谢您的回复!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
  • 2021-11-03
  • 2010-09-08
  • 2012-01-06
  • 2021-08-08
  • 1970-01-01
相关资源
最近更新 更多