当前位置: 首页 > 知识库问答 >
问题:

如何使用 activerecord-postgis-adapter 处理 ruby 中的简单地理空间查询(距离)?

祝俊
2023-03-14

我在一个csv文件中有很多纬度/经度点,我创建了一个表,其中包含4326投影中的一个点(表邮政编码,字段位置)

我正在构建这样的数据:-

factory = ::RGeo::Cartesian.preferred_factory(:has_z_coordinate => false)
p  = factory.point(data_hash[:latitude], data_hash[:longitude])

并将p存储在位置字段中。

问题是,我想找到一个给定点的“接近”记录。我在以下位置看到了一些有前途的代码:-

https://github.com/rgeo/activerecord-postgis-adapter/blob/master/test/spatial_queries_test.rb

所以我写了以下内容:-

factory = ::RGeo::Cartesian.preferred_factory(:has_z_coordinate => false)
p  = factory.point(53.7492, 1.6023)
res = Postcode.where(Postcode.arel_table[:location].st_distance(p).lt(1000));

res.each do |single|
  puts single.postcode
end

但是我遇到了异常(不支持:RGeo::笛卡尔::P ointImpl)

我想我需要做一些转换什么的,任何指针赞赏!

共有1个答案

卫志泽
2023-03-14

我认为您的问题在于您使用的工厂。尝试从球形工厂生成点:

p = RGeo::Geographic.spherical_factory(srid: 4326).point(53.7492, 1.6023)

还要检查 rails 日志以查看输出查询并在 PG 中手动运行它。 确保查询运行没有问题。

 类似资料:
  • 我在PostGis中很新,我正在使用它来执行地理空间查询,但它在返回所需结果时似乎很慢。 在此之前,我使用了一个python脚本,该脚本通常在大约5秒钟内返回结果(搜索120万个元素)。 为了更快地得到这个结果,我将问题转移到postgis上,但是,正如我之前所写的,同样的工作需要20秒以上的时间。 更准确地说,每个元素由一个点(lat lon)和一个字符串(点的标签)组成 我正在使用一个停靠的p

  • 我有一个包含许多文档集合,其结构如下: 纬度范围为[25;55] 该收藏包含大约60万条记录。 我设置了2D_Sphere索引:db.myCollection.createIndex({location:“2DSphere”}) 我获得了所有的记录,但我只期望有几个记录(靠近我的坐标!) 有什么建议吗?提前致谢

  • 本文向大家介绍使用Ruby来处理JSON的简单教程,包括了使用Ruby来处理JSON的简单教程的使用技巧和注意事项,需要的朋友参考一下 环境配置 在使用 Ruby 编码或解码 JSON 数据前,我们需要先安装 Ruby JSON 模块。在安装该模块前你需要先安装 Ruby gem,我们使用 Ruby gem 安装 JSON 模块。 但是,如果你使用的是最新版本的 Ruby,可能已经安装了 gem,

  • 问题内容: 我尝试使用的库具有给定的纬度和经度,并且对表中的条目进行计算后得出的纬度/经度在此范围内。生成的SQL查询适用于MySQL,但不适用于PostgreSQL。 这是我的文件中详细说明错误和完整查询的条目: 知道了什么是SQL之后,我可以编辑生成SQL的PHP​​代码,并将PR发送回库。 问题答案: 该查询使用特定于MySql的语法。在Postgres(以及我所知的所有其他RDBMS)中,

  • 有没有想过为什么使用Dociety的ODM会在同一个查询上返回零结果? 更新#1看起来教义\MongoDB\Query\Builder::near()L363有问题。方法参数忽略第二个值($Y)。因此只传递要执行的第一个值。

  • 我有一个“places”表,其中包含lat、lng和point字段。我一直用哈弗森公式来计算lat,lng的距离,但我读到使用点场更有效?我只是找不到关于怎么做的文件。这是我的查询,因为它现在是查询所有的地方和排序他们的距离 我如何将其更改为使用表中的“point”字段而不是LAT/LNG