在postgis和rails 4中使用ST_Distance无法找到两个坐标之间的距离

时间:2016-07-21 13:04:00

标签: sql ruby-on-rails ruby postgresql postgis

我有一个包含以下架构的供应商模型

create_table "vendors", force: :cascade do |t|
t.string   "name"
t.decimal  "latitude",   precision: 9, scale: 6
t.decimal  "longitude",  precision: 9, scale: 6
t.datetime "created_at",                         null: false
t.datetime "updated_at",                         null: false
end

我使用Faker gem填充数据库,并使用少量硬编码值来获取经度和纬度

我需要在特定的距离内找到附近的供应商。我能够通过我的vendor.rb中的以下代码实现此目的.rb

scope :close_to, -> (latitude, longitude, distance_in_meters = 2000) {
      where(%{
        ST_DWithin(
          ST_GeographyFromText(
            'SRID=4326;POINT(' || vendors.longitude || ' ' || 
            vendors.latitude || ')'
          ),
          ST_GeographyFromText('SRID=4326;POINT(%f %f)'),
          %d
        )
      } % [longitude, latitude, distance_in_meters])
    }

所以,如果我打电话

Vendor.close_to(39.000000, -76.000000, 500) 

在我的rails控制台中我得到了四行。现在我需要找到每个行坐标和close_to范围内提到的坐标之间的实际距离。为了实现这一点,我在vendor.rb中编写了以下代码

class Vendor < ActiveRecord::Base
scope :close_to, -> (latitude, longitude, distance_in_meters = 2000) {
      where(%{
        ST_DWithin(
          ST_GeographyFromText(
            'SRID=4326;POINT(' || vendors.longitude || ' ' || 
             vendors.latitude || ')'
          ),
          ST_GeographyFromText('SRID=4326;POINT(%f %f)'),
          %d
        )
      } % [longitude, latitude, distance_in_meters])
    }

  scope :dist, -> { 
        where(%{
          ST_Distance(
              ST_GeographyFromText(
                'SRID=4326;POINT(' || vendors.longitude || ' ' || 
                 vendors.latitude || ')'
              ),
              ST_GeographyFromText('SRID=4326;POINT(-76.000000 
              39.000000)'),
            ) as distance;
        } % )
     }
end

然而,当我打电话

Vendor.close_to(39.000000, -76.000000).dist 

它没有给我四行的距离,实际上会引发语法错误。我是新手rails和postgres开发者。我相信我的概念完全错了。请求帮助我纠正它,如何从特定范围内的给定坐标中找到附近的供应商,以及从给定的坐标中找出供应商附近的每个供应商之间的距离

0 个答案:

没有答案