对 Rails 3“存储定位器”功能使用 MySQL 空间能力或经纬度查找?

Posted

技术标签:

【中文标题】对 Rails 3“存储定位器”功能使用 MySQL 空间能力或经纬度查找?【英文标题】:Use MySQL spatial ability or lat-long lookups for Rails 3 "Store Locator" functionality? 【发布时间】:2010-11-20 18:27:58 【问题描述】:

我有一个 Rails 3 应用程序,我有几个用例需要支持。

给定地址或邮政编码的商店定位器。

用户来源的图形显示。

在第一个方面,我需要“在哪里购买”类型的功能的速度和准确性。

第二个,我不需要超准确的数据,无论IP服务返回什么就足够了。我基本上是想贴一张谷歌地图,里面有一堆大头针。

我现在在这方面的经验为零。我很乐意编写 javascript,并且我已经安装了 GeoKit 来进行地理编码(一个我可以拼写但我还不太明白的词)。感谢您提供的任何帮助。

我知道 mysql 具有空间扩展,并且更新看起来非常简单。也许这是一个分裂的决定,我使用空间信息来存储商店位置,然后只从他们的 IP 地址获取用户的位置。

对于站点使用用例,实时扫描日志文件还是将命中存储在数据库中更有意义?

【问题讨论】:

对于第一种情况,您需要多快?您希望每天处理多少次搜索? 1-2 秒的最长返回时间,每天最多 25,000 次搜索。不过一开始肯定没有那么多。 【参考方案1】:

地理编码正在将地址或邮政编码等内容转换为纬度/经度坐标。

我使用Google's Geocoding API,但每天的请求数限制为 2,500,除非您是 Google Maps API Premier 用户。它非常快(几乎我的 Rails 应用程序发出的每个请求都需要不到 0.1 秒)且准确。不过请阅读,因为有更多关于什么是地理编码的信息。

我使用从地理编码返回的纬度/经度来查询我的 MySQL 数据库,这是一个有点昂贵的查询,但在我相当小的表(大约 10,000 个具有纬度/长值)。这是我使用的查询(将 LAT 和 LNG 替换为您的 lat 和 long 值):

SELECT
whatever, 3963.191 * ACOS((SIN(RADIANS(LAT))*SIN(RADIANS(lat))) +(COS(RADIANS(LAT))*cos(RADIANS(lat))*COS(RADIANS(lng)-RADIANS(LNG)))) AS distance
FROM things
HAVING distance < 30
ORDER BY distance;

【讨论】:

好的,所以你使用 lat/lng 而不是 MySQL 空间扩展。 3963.191 负责地球曲率。谢谢!

以上是关于对 Rails 3“存储定位器”功能使用 MySQL 空间能力或经纬度查找?的主要内容,如果未能解决你的问题,请参考以下文章

MySQ 存储引擎选择

mysq对存在null值的字段排序

Rails 3.1 指南针和链轮。使困惑

如何在使用 MySQL 2 的 Rails 3 项目中使用 WHERE IN?

如何在 Rails 3 中使用 I18n 后备功能

Rails 3 中的联系我们功能