我正在寻找一个解决方案来构建非常简单的基于地理位置的应用程序。它应该保持当前用户位置,并选择特定坐标附近的用户。所以我不需要基于foursquare或谷歌地图api的解决方案,我需要更简单的东西。
现在我有了模型用户,它有:lat和:long字段,查询如下:
"SELECT lat, long FROM users WHERE long < :lolow AND long > :lohigh AND lat < :lalow AND long > :lahigh"
还有更优雅的方法吗?
这对我来说并不不雅。也许你会觉得这更美观:
SELECT lat, long
FROM users
WHERE long not between :lolow AND :lohigh AND
lat not between :lalow AND :lahigh
"not between"是SQL中几乎从未使用过的东西之一,但它是用来使用的。你也可以说"不(介于:lolow和:lohigh之间)"
事实上,我怀疑你的意思根本不是介于两者之间,你真正的意思是"介于":
SELECT lat, long
FROM users
WHERE long between :lolow AND :lohigh AND
lat between :lalow AND :lahigh
当"低"值在数字上小于"高"值时,原始查询将不返回任何结果。
根据您使用的数据库引擎-我使用MySQL。您应该了解"Spatial"字段类型。您可以将lat存储为一个点,然后查询它是否位于多边形内。例如,我有一个5000点的多边形,我想看看里面是否有点。
我找到了一个很好的解决方案。我使用了location=>type:point。和SQL代码:
def self.next_to_me(coordinates, distance)
where( "circle :which @> location AND updated_at > :time",
:which => "<(#{coordinates}),#{distance}>",
:time => 20.minutes.ago ).limit(100)
end