存储 HTML5 地理位置数据

Posted

技术标签:

【中文标题】存储 HTML5 地理位置数据【英文标题】:Storing HTML5 geolocation data 【发布时间】:2012-04-03 05:52:09 【问题描述】:

如何在 Rails 3 中存储和处理网站用户的地理位置(经纬度),以便它检查我们是否已经在每个页面请求的用户会话中保存了这些详细信息(如果我们没有保留详细信息,那么我们应该从浏览器请求用户的位置,然后将这些详细信息存储在会话中)?

【问题讨论】:

【参考方案1】:

这是 Rails 中非常常见的模式。在application_controller.rbapplication_helper.rb(如果你想从多个控制器访问它)定义一个方法,如

def lat_lng
  @lat_lng ||= session[:lat_lng] ||= get_geolocation_data_the_hard_way
end

||=位读取“如果左边部分为nil,则检查右边部分,然后将值赋给左边部分以备下次使用”。

这里的@lat_lng 是一个实例变量...对于这种情况可能有点矫枉过正,因为我怀疑获取会话数据是否有任何实际工作,但由于浏览器会请求许可,你真的只想这样做一次。也许浏览器没有位置感知浏览器,所以你需要依赖其他东西,因此调用你必须编写的方法get_geolocation_data_the_hard_way

【讨论】:

关于如何提交 ajax 请求并确保仅在需要时发生的任何指示? get_geolocation_data_the_hard_way 方法(您可以随意称呼它:-)是请求发生的地方,例如到 Google Maps API,它有一个有据可查的 javascript 界面,并提供各种漂亮的地理位置、邻近度查找和其他常规方法。如果您真的想减少对 API 的调用,该方法还可以执行诸如确定哪个 lat-lng 对对于您的应用程序足够接近(例如,如果 1/2 英里足够接近)并缓存或持久化结果你关心那个位置。但是上面的模式将确保每个会话只调用一次。 你如何从控制器/方法进行 Javascript 调用? 嗯,这是一个完全不同的问题:-)。您不在控制器中进行 (JS) 调用;而是在此处设置所需的变量,然后在视图中在包含您要执行的 javascript 的页面末尾添加一个 <script> 标记。您可以在脚本代码中引用控制器中设置的变量,就像通过 html 其余部分中的 ERB 标记引用其他变量一样。或者,如果您不想显示任何内容而只需要数据,可以从您的 Ruby 代码中调用 Google Maps Web 服务 API:developers.google.com/maps/documentation/webservices 我实际上希望在 HTML5 中使用地理定位,所以它必须是一个 ajax 请求 :) 有什么进一步的建议吗?【参考方案2】:

根据您的要求,我会说您实际上并不需要 ajax,因为大部分处理将使用 JS 完成(要求用户访问他们的位置、解析响应等),我会使用 JS 设置一个 cookie,Rails 会看到)。

在您的控制器中

def action
  @lat_lng = cookies[:lat_lng].split("|")
end

在你看来

<%- unless @lat_lng %>
<script>
  getGeoLocation();
</script>
<%- end %>

在您的一个 javascript 文件中

function getGeoLocation() 
  navigator.geolocation.getCurrentPosition(setGeoCookie);


function setGeoCookie(position) 
  var cookie_val = position.coords.latitude + "|" + position.coords.longitude;
  document.cookie = "lat_lng=" + escape(cookie_val);

请注意,上述测试都不是为了查看用户是否拥有支持地理定位的浏览器,或者用户是否已授予(或拒绝)使用其位置的权限,并且该 cookie 将是一个会话 cookie,并且JS 不会测试是否已经设置了 cookie。要在 cookie 上设置更复杂的信息,请查看 http://www.quirksmode.org/js/cookies.html 有关使用 javascript 的 GeoLocation 的更多信息,请参阅 http://diveintohtml5.info/geolocation.html

【讨论】:

此解决方案的缺点是某些浏览器(firefox、safari)会在每次页面加载时向用户询问此内容,直到他们按“始终共享”或直到足够多并按“从不允许” .关于如何解决这个问题的任何想法?

以上是关于存储 HTML5 地理位置数据的主要内容,如果未能解决你的问题,请参考以下文章

保存在变量/本地存储中的地理位置数据

Safari 中的 html5 地理定位错误

将 HTML5 地理定位与 PHP 和 MySql 结合使用

HTML5的local storage存储的数据到底存到哪去了

一个使用 HTML5 地理位置获取用户位置并保存到数据库的 Rails 应用程序

前端HTML5 地理位置定位(HTML5 Geolocation)原理及应用