【发布时间】: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