“bethlehem,pa”有多个搜索结果
results = Geocoder.search("bethlehem,pa")
results.size # => 8
并非所有这些结果都在美国
results.map { |r| r.country_code }
=> ["br", "us", "us", "us", "us", "us", "us", "us"]
首先是来自巴西的打击。如果结果不明确,则采用此结果(请参见下面的代码)。
我假设巴西伯利恒排在第一位,因为该州被称为“pará”,它与“pa”比“pennsylvania”更接近(使用任何度量标准的字符串距离)
distance_between
https://github.com/alexreisner/geocoder/blob/f7a83fac8cf8564b79d017091004cbb9d406e4ae/lib/geocoder/calculations.rb#L84
最终会调用coordinates
https://github.com/alexreisner/geocoder/blob/f7a83fac8cf8564b79d017091004cbb9d406e4ae/lib/geocoder.rb#L28
看起来像这样:
def self.coordinates(address, options = {})
if (results = search(address, options)).size > 0
results.first.coordinates
end
end
因此,按国家/地区扩充您的位置字符串,您会得到不同的结果:
Geocoder::Calculations.distance_between("allentown,pa, USA","bethlehem,pa, USA")
# => 4.97795894130203
归结为字符串的位置描述通常不是唯一的。有多个巴黎、伯尔尼,当然还有伯利恒:-)
所以毫不奇怪还有多个阿伦敦:
require "geocoder"
allentowns = Geocoder.search("allentown,pa")
bethlehems = Geocoder.search("bethlehem,pa")
allentowns.each do |allentown|
bethlehems.each do |bethlehem|
distance = Geocoder::Calculations.distance_between([allentown.latitude, allentown.longitude], [bethlehem.latitude, bethlehem.longitude])
puts "#{allentown.address} -> #{bethlehem.address}: #{distance}"
end
end
显示有美国宾夕法尼亚州利哈伊县阿伦敦和美国宾夕法尼亚州阿勒格尼县匹兹堡阿伦敦