如何使用带有 Google Maps Roads API 的坐标列表计算距离

Posted

技术标签:

【中文标题】如何使用带有 Google Maps Roads API 的坐标列表计算距离【英文标题】:How to calculate distance using lists of coordinates with Google Maps Roads API 【发布时间】:2018-03-25 02:33:36 【问题描述】:

我正在使用 snapToRoads 生成静态地图(因为它接受多个航点)。

鉴于我有坐标列表,我如何计算这些坐标之间的距离并将其相加得到总行驶距离

或者在 ruby 代码中还有其他更好的方法吗?

快速道路请求示例:

waypoints = [arrays of coordinates]
snap_to_roads_url = "https://roads.googleapis.com/v1/snapToRoads?path=#waypoints.join('|')&interpolate=true&key=API_KEY"
snappedPoints = HTTParty.get(URI.encode(snap_to_roads_url))

# Store snapped polyline returned by the snap-to-road service
snappedPoints['snappedPoints'].each do |snap|
  snappedCoordinates << "#snap['location']['latitude'],#snap['location']['longitude']"
  placeIdArray << snap['placeId']
end

静态地图请求:

https://maps-api-ssl.google.com/maps/api/staticmap?&size=650x550&sensor=false&zoom=16&markers=size:small&maptype=roadmap&path=weight:3%7Ccolor:red%7C54.57424022982199,-1.2351261042386523|54.57423420000001,-1.2351275000000002|54.57423420000001,-1.2351275000000002 ...many more

如果我有起点和目的地坐标,我还知道如何在上述请求中包含标记

请帮忙!

【问题讨论】:

你为什么不读一下haversine公式。这是一个链接en.wikipedia.org/wiki/Haversine_formula。我认为它可以提供帮助,有几个获取两个坐标之间距离的示例。这是一个很好的例子github.com/kristianmandrup/haversine 您能否提供您的 snapToRoads 请求示例(编辑您的 API KEY)? 问题已更新。 您添加了静态地图调用,而不是 snapToRoads 请求。您在计算它们之间的距离并将其相加以获得总距离时遇到什么问题? 【参考方案1】:

对于您的用例,我建议您改用 Directions API Web 服务。您还可以放置多个航点(每个请求最多 23 个),其返回将生成您路径的编码折线。还会提供出行距离、出行时间等信息。

在此处了解更多信息:https://developers.google.com/maps/documentation/directions/start

Snap To Roads 需要您的坐标彼此非常接近才能正常工作,并且您的静态地图网址可能会在几个点后变得太长。某些浏览器可能会达到其 url 限制,静态地图有一个 8192 character limit

以下是使用 Directions Web 服务的示例请求(只需包含您自己的 API 密钥): https://maps.googleapis.com/maps/api/directions/json?origin=-37.59431782470163%2C144.91110764394534&amp;destination=place_id%3AEipTeWRuZXkgUm9hZCwgU29tZXJ0b24sIFZpY3RvcmlhLCBBdXN0cmFsaWE&amp;mode=driving&amp;waypoints=place_id%3AEjJNaXRmb3JkIENyZXNjZW50LCBDcmFpZ2llYnVybiwgVmljdG9yaWEsIEF1c3RyYWxpYQ%7Cplace_id%3AEi5FZGluZ3RvbiBXYXksIENyYWlnaWVidXJuLCBWaWN0b3JpYSwgQXVzdHJhbGlh&amp;key=YOUR_API_KEY

要获得更直观的表示,请访问此(包括您的 API 密钥以查看 JSON 结果)link

然后在其结果中,您可以在其属性中获得编码折线:routes.overview_polyline。您可以将其用作编码的折线路径,如下所示:&amp;path=geodesic:true%7Ccolor:0x0057E7ff%7Cenc:ENCODED_POLYLINE_HERE

您的标记的坐标可以通过获取路线的每条腿来检索。以routes[0].legs[0].start_locationend_location 开头,使用这些坐标作为标记。

对于您的总行驶距离,每个leg 都有一个带有数值的distance 属性。只需添加所有legs 即可获得您的总距离甚至时间。

您的静态地图请求将类似于下面的附加代码。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
<img src="https://maps.googleapis.com/maps/api/staticmap?size=800x800
            &maptype=roadmap
  &key=AIzaSyCD0rWgXRVBa7PgaTWXVp_gU51pgHGviYY&markers=color:blue%7Clabel:A%7C-37.5943328,144.9110993&markers=color:blue%7Clabel:B%7C-37.60746779999999,144.9393146&markers=color:blue%7Clabel:C%7C-37.6118511,144.9329711&markers=color:blue%7Clabel:D%7C-37.6302591,144.9490315&path=geodesic:true%7Ccolor:0x0057E7ff%7Cenc:psmdFkmsZeApE~APxAJvK~@pCLdA@dD?fACbESlEYbAIlB[`Dg@bBYtJeCbEcAfDo@q@_D]cBM_AEg@Eu@@sAJyAVuArAoFRqAJ_A?o@CACECG@OFKBABCJu@NyBEeAq@kEaAsGI@EwA^uG@[AACGAEBMBC@A?@@M?o@QuAa@sAq@yASu@Ko@IA?u@VDLyBAQA[?SAAAG?OFKLAHFbAL|JdALBRHZ@P?H@@ABEBAFg@FKj@gJTCTqAZeAVs@bCEVk@Lc@NaAFaAAy@IkAUq@A?EAGK?O?AOg@U_@o@q@g@[e@Q[Ie@G_CS_ACgAH_D^KFSF?@A@A@C@EA?AYAGC[?u@Es@Ok@Sm@_@k@e@eBmBUY`CkClEEh@[\Gd@Ce@B]FWLQLmE|EaCjCTXdBlBj@d@l@^j@Rr@Nt@DZ?FEJAJA@A?ABAF@RAL@dEe@bAAfAFfBN^Hb@Lf@Vf@`@n@v@`@^F@BBDLALDb@AXHjA@x@G`AGh@VHl@Z`@\x@fAy@gAa@]m@[WIFi@FaAAy@IkAUq@A?EAGK?O?AOg@U_@o@q@g@[e@Q[Ie@G_CS_ACgAH_D^KFSF?@A@A@G@AA?AYAGC[?u@Es@Ok@Sm@_@k@e@eBmBe@q@a@s@w@gBg@cBEEKe@A?CC?A?I?AG@KcAGoACwBGk@Ok@Qi@Ye@YWSSUKA@CAGE?Ec@I_@Ka@QmKkD_@Ec@Mc@]ICCCQGe@EKAiAHUDa@NOLGRU`BKb@Gf@?h@DH@LELGFIBKAIGAA?Ai@GOKi@O@Y_@E]Mo@c@e@s@Se@Mi@E[?S?GRCzBW~A]vBu@tFqCtCyAzAi@lA[rC]hCOnIa@`[uApQAvL_A~D]nBMhBQdBKdSkBnUsBfb@aDzD]Bv@q@H"/> 


</body>
</html>

如果您希望事物具有交互性(类似于我链接的 Directions webapp),那么您需要使用 [Google Maps javascript API Directions Service] (https://developers.google.com/maps/documentation/javascript/directions)。

希望这些帮助!

这里有更多关于带静态地图的编码折线和标记的信息: https://developers.google.com/maps/documentation/static-maps/intro#Markers https://developers.google.com/maps/documentation/static-maps/intro#Paths

【讨论】:

嗨 henrisycip,我的航路点已超过 50 个,我尝试了 Directions API Web 服务,但出现错误,超出每个请求 8 个航路点的限制,这就是我转向快速道路的原因 您现在在免费层级中有 23 个航路点的限制,包括您的出发地和目的地。您可以简单地将 2-3 个方向 Web 服务请求连接在一起,为 50 个航点创建输出。更多关于 here

以上是关于如何使用带有 Google Maps Roads API 的坐标列表计算距离的主要内容,如果未能解决你的问题,请参考以下文章

Google Maps Roads API 返回重复的坐标和 placeIds

Google Maps 的 Roads API 不适用于 XHR

有没有一种好方法可以最大限度地减少 Google Maps Roads API 的负载?

如何从 Google Maps v3 API 中删除带有 mysql 数据的标记?

带有 OpenWeatherMap 平铺层叠加的 Google Maps Javascript API

带有适用于 iOS 的 Google Maps SDK 的可拖动标记