Module: EstimateDistance

Defined in:
lib/estimate_distance.rb

Constant Summary collapse

EARTH_RADIUS =

地球半径

6378137.0
PI =
Math::PI

Class Method Summary collapse

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