Mismatch in rgeo spatial distance vis-a-vis reality

41 views
Skip to first unread message

srs...@gmail.com

unread,
Aug 1, 2017, 10:14:03 PM8/1/17
to RGeo-Users

I am listing out nearby options from user location, in which distance plays a major role. I chose rgeo to filter me out those options within 10 kms radius using ST_DWithin. However, I am getting significant margins in rgeo computed distance with respect to google map results.

Tried with the following sample points so far, and my results:

  • Origin: (Lat, Long) - 12.918269, 77.635669

  • Table

        RGeo Distance                   Lat, Long              GMap
           (in m)                                            (in Kms)
    
      4865.012768186506,         12.960146,  77.648496          7.4         
      4865.012768186506,         12.960146,  77.648496          7.4         
      2286.5466828101517,        12.936992,  77.627002          2.7            
      3672.943407131079,         12.949931,  77.645193          7.8           
      7913.722140288826,         12.848925,  77.651733         11.7              
    
  • Model:

    class Locate < ApplicationRecord
       scope :nearby, -> (origin, dist_in_meters = 10000) {
         where("ST_DWithin(ST_GeographyFromText('SRID=4326;#{origin}'), position, #{dist_in_meters})")
        } 
    end
    
  • Controller:

    def nearby
      origin = geo_factory(77.635669,12.918269)
      options = Locate.nearby(origin)
      opt_dist = Array.new
        options.each do |option| 
          opt_dist << origin.distance(option.position)
        end
      render json: { options: options, distance: opt_dist }, status: 200
    end
    
    def geo_factory(ulong,ulat)
       RGeo::Geographic.spherical_factory(srid: 4326).point(ulong,ulat)
    end
    
  • Schema:

     create_table "locates", force: :cascade do |t|
        t.integer   "user_id"
        t.geography "position",   limit: {:srid=>4326, :type=>"st_point", :geographic=>true}
        t.datetime  "created_at", null: false
        t.datetime  "updated_at", null: false
      end
    
  • Initializer (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
    

Assuming distance calculated in rgeo represents shortest path between two points which might not be the case in reality, hence being differing with gmap results. Can someone share if they had any similar experience?

Thanks in advance!


Github: https://github.com/rgeo/rgeo/issues/171

Reply all
Reply to author
Forward
0 new messages