处理rails中的lat / long和mysql空间点

时间:2009-07-21 19:51:28

标签: ruby-on-rails architecture spatial

关于mysql空间数据类型存在大量问题,但是我更加具体地说明了如何最好在rails MVC架构中处理它们。

我有一个输入表单,管理员用户可以创建一个新的兴趣点,比如一个餐馆并输入一些信息。他们还可以以十进制格式输入人类可读的纬度和经度。

然而,对于距离计算等...我将位置数据存储为数据库中的空间点。

因此,我的问题是如何在rails中的MVC架构中最好地处理这个问题?

以下是我的一些想法,但似乎没有什么看起来干净:

  • 调用:after_filter方法,它接受对象的新实例并执行处理“GeomFromText('POINT(lat long)'))”的原始SQL更新。“善良。这个问题是“lat / long”将是我的创建表单中的文本字段,虽然这会破坏rails提供的干净的form_for:object体系结构,因为lat / long不是真正的属性,它们只是在那里让一个人类输入值不是mysql空间。

  • 也许在数据库中创建一个触发器,在更新该行的行插入之后运行?我不知道,似乎这些触发器不会访问lat / long,除非我存储lat / long以及空间点,然后使用lat / long小数在db中创建行,然后在创建后运行触发器以更新空间。如果我将lat / long列添加到模型中,我想我也可以使用after_filter。

还有其他想法吗?我认为存储lat / long是多余的,因为我真的会使用空间点进行距离计算等等......但如果我允许进行人工编辑,则可能是必要的。

2 个答案:

答案 0 :(得分:3)

查看使用普通lat / lng列作为浮点数进行距离计算的the geokit-rails plugin for Rails(并使用geokit gem)。但是,如果您想使用数据库的地理空间能力,GeoRuby支持Point或LineString等基本空间要素作为列类型。我希望这些帮助。

答案 1 :(得分:0)

我同意绝望,geokit很好,我也使用它。

如果你想自己做,我会做一个after_filter但是将更新方法外部化到一个线程。就像你在保存时没有减速但仍然很好的代码和及时更新的列。

触发器不好,数据库应该提供数据但不能做逻辑。