使用 Maps API 计算两个地址的距离,然后将每个距离保存到数据库
Use Maps API to calculate distance of two adresses then save each distance to database
我正在编写一个应用程序,它根据距离匹配 children 和幼儿园。
我正在尝试使用地图 API 来计算多个地址之间的距离。
我想使用 open-uri
https://maps.googleapis.com/maps/api/distancematrix/json?origins=[address of child]&destinations=[adress of kindergarden]&key=XYZ
这将是对 api 的请求。
我的想法是在 child 创建过程之后发送请求。
我将从数据库中获取 child 地址和幼儿园地址并构建请求。
每个 child 和幼儿园的响应距离将保存在关系 table 中
我如何访问 child 和幼儿园的数据库条目?
然后保存到关系table?
我当前的代码如下所示:
def create
@child = Child.new child_params
@child.user = current_user
@child.save
origin = @child.adress
destination = @kiga.adress
response = open('https://maps.googleapis.com/maps/api/distancematrix/json?origins=' + [address of child] + '&destinations=' + [adress of kindergarden] + '&key=XYZ').read
relations.distance = response.rows.elements[0]
respond_to do |format|
if @child.save
format.html { redirect_to @child, notice: 'Child was successfully created.' }
format.json { render :show, status: :created, location: @child }
else
format.html { render :new }
format.json { render json: @child.errors, status: :unprocessable_entity }
end
end
帮助将不胜感激?
这里的问题是您正试图将 URL 作为字符串打开,因此它正在寻找以这种方式命名的文件,但该文件不存在。
这里有两个选择:
1。使用 HTTParty gem 发出 HTTP 请求
这是我最喜欢的方法。
在您的 Gemfile
中包含 gem:
gem 'HTTParty'
在您的控制器中发出请求:
url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" \
"#{@child.adress}&destinations=#{@kiga.adress}&key=XYZ"
response = HTTParty.get(url)
现在,如果您要打印 response["rows"].first["elements"].first
的结果,您会看到如下输出:
{"distance"=>{"text"=>"15.4 km", "value"=>15405}, "duration"=>{"text"=>"17 mins", "value"=>1001}, "status"=>"OK"}
如您所见,您有距离和持续时间信息。我猜你在寻找以米为单位的距离值,所以:
relations.distance = response["rows"].first["elements"].first["distance"]["value"]
注意 1:我故意在单词地址 (@child.adress、@kiga.adress) 中复制了拼写错误,以便代码与您的设置一起使用, 但考虑将其修复为 @child.address 和 @kiga.address.
注意 2:为简单起见,我没有对响应进行任何错误检查,这是您绝对应该注意的事情。
注意 3:请记住将 api 键更改为有效键,为了简单起见,我将其硬编码为 XYZ,就像您在问题中所做的那样。
2。使用 open-uri 将您的 url 解析为有效的 URI
您必须在控制器的开头要求库 'open-uri'
和 'JSON'
:
require 'open-uri'
require 'JSON'
def create
@child = Child.new child_params
@child.user = current_user
@child.save
origin = @child.adress
destination = @kiga.adress
# Parse the string url into a valid URI
url = URI.parse(
"https://maps.googleapis.com/maps/api/distancematrix/json?origins=" \
"#{@child.adress}&destinations=#{@kiga.adress}&key=XYZ"
)
# Open the URI just like you were doing
response = open(url).read
# Parse the string response in JSON format
result = JSON.parse(response)
# Extract the distance value in meters
relations.distance = result["rows"].first["elements"].first["distance"]["value"]
respond_to do |format|
if @child.save
format.html { redirect_to @child, notice: 'Child was successfully created.' }
format.json { render :show, status: :created, location: @child }
else
format.html { render :new }
format.json { render json: @child.errors, status: :unprocessable_entity }
end
end
变量result
的内容(解析后)如下所示:
{"destination_addresses"=>["Destination address"], "origin_addresses"=>["Origin address"], "rows"=>[{"elements"=>[{"distance"=>{"text"=>"15.4 km", "value"=>15405}, "duration"=>{"text"=>"17 mins", "value"=>1001}, "status"=>"OK"}]}], "status"=>"OK"}
无论您选择 HTTParty 方式还是 open-uri + JSON 解析方式,请务必检查响应状态代码。这两种方法都已在我的计算机上进行了本地测试,并取得了成功的结果。
希望对你有所帮助,干杯!
另一种解决方案是查看此 Gem
https://github.com/alexreisner/geocoder
如果您对您的子模型和 Kiga 模型进行地理编码,那么您可以轻松地获得两者之间的距离。
enter code here
这没有进行任何 API 调用,GEM 会为您完成此操作。
它也有一个非常方便的方法来return记录附近的位置
@kiga.near(@child.coordinates, 10)
将return所有具有10公里@child坐标的Kiga
我正在编写一个应用程序,它根据距离匹配 children 和幼儿园。
我正在尝试使用地图 API 来计算多个地址之间的距离。 我想使用 open-uri
https://maps.googleapis.com/maps/api/distancematrix/json?origins=[address of child]&destinations=[adress of kindergarden]&key=XYZ
这将是对 api 的请求。
我的想法是在 child 创建过程之后发送请求。
我将从数据库中获取 child 地址和幼儿园地址并构建请求。
每个 child 和幼儿园的响应距离将保存在关系 table 中
我如何访问 child 和幼儿园的数据库条目?
然后保存到关系table?
我当前的代码如下所示:
def create
@child = Child.new child_params
@child.user = current_user
@child.save
origin = @child.adress
destination = @kiga.adress
response = open('https://maps.googleapis.com/maps/api/distancematrix/json?origins=' + [address of child] + '&destinations=' + [adress of kindergarden] + '&key=XYZ').read
relations.distance = response.rows.elements[0]
respond_to do |format|
if @child.save
format.html { redirect_to @child, notice: 'Child was successfully created.' }
format.json { render :show, status: :created, location: @child }
else
format.html { render :new }
format.json { render json: @child.errors, status: :unprocessable_entity }
end
end
帮助将不胜感激?
这里的问题是您正试图将 URL 作为字符串打开,因此它正在寻找以这种方式命名的文件,但该文件不存在。
这里有两个选择:
1。使用 HTTParty gem 发出 HTTP 请求
这是我最喜欢的方法。
在您的 Gemfile
中包含 gem:
gem 'HTTParty'
在您的控制器中发出请求:
url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" \
"#{@child.adress}&destinations=#{@kiga.adress}&key=XYZ"
response = HTTParty.get(url)
现在,如果您要打印 response["rows"].first["elements"].first
的结果,您会看到如下输出:
{"distance"=>{"text"=>"15.4 km", "value"=>15405}, "duration"=>{"text"=>"17 mins", "value"=>1001}, "status"=>"OK"}
如您所见,您有距离和持续时间信息。我猜你在寻找以米为单位的距离值,所以:
relations.distance = response["rows"].first["elements"].first["distance"]["value"]
注意 1:我故意在单词地址 (@child.adress、@kiga.adress) 中复制了拼写错误,以便代码与您的设置一起使用, 但考虑将其修复为 @child.address 和 @kiga.address.
注意 2:为简单起见,我没有对响应进行任何错误检查,这是您绝对应该注意的事情。
注意 3:请记住将 api 键更改为有效键,为了简单起见,我将其硬编码为 XYZ,就像您在问题中所做的那样。
2。使用 open-uri 将您的 url 解析为有效的 URI
您必须在控制器的开头要求库 'open-uri'
和 'JSON'
:
require 'open-uri'
require 'JSON'
def create
@child = Child.new child_params
@child.user = current_user
@child.save
origin = @child.adress
destination = @kiga.adress
# Parse the string url into a valid URI
url = URI.parse(
"https://maps.googleapis.com/maps/api/distancematrix/json?origins=" \
"#{@child.adress}&destinations=#{@kiga.adress}&key=XYZ"
)
# Open the URI just like you were doing
response = open(url).read
# Parse the string response in JSON format
result = JSON.parse(response)
# Extract the distance value in meters
relations.distance = result["rows"].first["elements"].first["distance"]["value"]
respond_to do |format|
if @child.save
format.html { redirect_to @child, notice: 'Child was successfully created.' }
format.json { render :show, status: :created, location: @child }
else
format.html { render :new }
format.json { render json: @child.errors, status: :unprocessable_entity }
end
end
变量result
的内容(解析后)如下所示:
{"destination_addresses"=>["Destination address"], "origin_addresses"=>["Origin address"], "rows"=>[{"elements"=>[{"distance"=>{"text"=>"15.4 km", "value"=>15405}, "duration"=>{"text"=>"17 mins", "value"=>1001}, "status"=>"OK"}]}], "status"=>"OK"}
无论您选择 HTTParty 方式还是 open-uri + JSON 解析方式,请务必检查响应状态代码。这两种方法都已在我的计算机上进行了本地测试,并取得了成功的结果。
希望对你有所帮助,干杯!
另一种解决方案是查看此 Gem https://github.com/alexreisner/geocoder
如果您对您的子模型和 Kiga 模型进行地理编码,那么您可以轻松地获得两者之间的距离。
enter code here
这没有进行任何 API 调用,GEM 会为您完成此操作。
它也有一个非常方便的方法来return记录附近的位置
@kiga.near(@child.coordinates, 10)
将return所有具有10公里@child坐标的Kiga