Module: EstimateDistance
- Defined in:
- lib/estimate_distance.rb
Constant Summary collapse
- EARTH_RADIUS =
地球半径
6378137.0
- PI =
Math::PI
Class Method Summary collapse
- .circle_distance(lat1, lng1, lat2, lng2) ⇒ Object
- .direct_calculate_distance(former_address, latter_address, ak = '') ⇒ Object
- .get_rad(d) ⇒ Object
-
.location_address_info(address, ak) ⇒ Object
def self.real_address(real_address) [real_address.city.try(:name), real_address.district.try(:name), real_address.address].compact.join end.
- .request_info(params) ⇒ Object
Class Method Details
.circle_distance(lat1, lng1, lat2, lng2) ⇒ Object
35 36 37 38 39 40 41 42 43 44 |
# File 'lib/estimate_distance.rb', line 35 def self.circle_distance(lat1, lng1, lat2, lng2) lat1, lng1, lat2, lng2 = [lat1, lng1, lat2, lng2].map(&:to_f) radLat1 = get_rad(lat1) radLat2 = get_rad(lat2) a = radLat1 - radLat2 b = get_rad(lng1) - get_rad(lng2) s = 2*Math.asin(Math.sqrt(Math.sin(a/2)**2 + Math.cos(radLat1)*Math.cos(radLat2)*Math.sin(b/2)**2)) s = s*EARTH_RADIUS return (s/1000).round(2) end |
.direct_calculate_distance(former_address, latter_address, ak = '') ⇒ Object
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/estimate_distance.rb', line 46 def self.direct_calculate_distance(former_address, latter_address, ak='') former_result = location_address_info(former_address, ak) latter_result = location_address_info(latter_address, ak) if former_result['status'] == 0 && latter_result['status'] == 0 lat1 = former_result['result']['location']['lat'] lng1 = former_result['result']['location']['lng'] lat2 = latter_result['result']['location']['lat'] lng2 = latter_result['result']['location']['lng'] circle_distance(lat1, lng1, lat2, lng2) else return { status: -1 ,message: 'ak有误或超出调用次数'} end end |
.get_rad(d) ⇒ Object
31 32 33 |
# File 'lib/estimate_distance.rb', line 31 def self.get_rad(d) return d.to_f*PI/180.0 end |
.location_address_info(address, ak) ⇒ Object
def self.real_address(real_address)
[real_address.city.try(:name), real_address.district.try(:name), real_address.address].compact.join
end
13 14 15 16 17 18 19 20 |
# File 'lib/estimate_distance.rb', line 13 def self.location_address_info(address, ak) if ak == '' params = {address: address, output: 'json', ak: 'dAYeNt1licEwUDKoyeNBskBQjHRKDDmb'} else params = {address: address, output: 'json', ak: ak} end request_info(params) end |
.request_info(params) ⇒ Object
22 23 24 25 26 27 28 29 |
# File 'lib/estimate_distance.rb', line 22 def self.request_info(params) begin result = RestClient.get('http://api.map.baidu.com/geocoder/v2/', params: params) JSON(result) rescue Exception=> e return false end end |