首页 > 解决方案 > 使用 posgis 适配器在 st_distance 和几何中面临问题

问题描述

我正在尝试从 rails 控制台运行查询,但出现错误

第一次查询

Location.order( ST_Distance(
    'SRID=4326;POINT(-72.1235 42.3521)',
    'SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'
  )).first

main:Object 的未定义方法“ST_Distance”

第二次查询

longitude_latitude = '0101000020E61000002DB29DEFA7C651C0B81E85EB51284540'

  Location.order('acc_rank desc', ST_Distance(
    'SRID=4326;POINT(-72.1235 42.3521)'::geometry,
    longitude_latitude
  )).first

“SRID=4326;POINT(-72.1235 42.3521)”的未定义方法“几何”:字符串

如果我尝试从 Postgres 控制台运行,我可以同时运行这两个查询

select  ST_Distance(
aniket_t(#     'SRID=4326;POINT(-72.1235 42.3521)'::geometry,
aniket_t(#     '0101000020E61000002DB29DEFA7C651C0B81E85EB51284540'
aniket_t(#   );
   st_distance    
------------------
 1.02017481835224
(1 row)


select ST_Distance(
aniket_t(#     'SRID=4326;POINT(-72.1235 42.3521)',
aniket_t(#     'SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'
aniket_t(#   );
     st_distance     
---------------------
 0.00150567726382822
(1 row)

对于 PostGIS 的设置,我最初安装了 gem

宝石“activerecord-postgis 适配器”

但后来我找到了几个答案,我也安装了这个 gem

宝石“rgeo”
宝石“rgeo-activerecord”

不确定运行上述查询是否需要rgeorgeo-activerecord gem

在我的 database.yml 中,我已经明确指定了适配器

default: &default
  adapter: postgis
  encoding: unicode
  pool: 10 

此外,通过阅读 StackOverflow 上的一些答案,我还在 config/initializers/rgeo.rb 中添加了 rgeo.rb

RGeo::ActiveRecord::SpatialFactoryStore.instance.tap do |config|
  # By default, use the GEOS implementation for spatial columns.
  config.default = RGeo::Geos.factory_generator

  # But use a geographic implementation for point columns.
  config.register(RGeo::Geographic.spherical_factory(srid: 4326), geo_type: "point")
end

但没有什么对我有用。在从 rails 控制台运行这些查询时,我们将不胜感激

Rails:6.0.3.7
pg gem:1.2.3
postges 版本:10.17

标签: ruby-on-railsrubypostgresqlpostgisruby-on-rails-6

解决方案


我通过向 st_distance 函数添加引号来修复查询。此外,不需要“rgeo”和“rgeo-activerecord” gem

Location.order( "ST_Distance(
    'SRID=4326;POINT(-72.1235 42.3521)',
    'SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'
  )").first

推荐阅读