Javascript 如何使用谷歌地图API路线计算每个国家的距离

Javascript 如何使用谷歌地图API路线计算每个国家的距离,javascript,google-maps,google-maps-api-3,Javascript,Google Maps,Google Maps Api 3,例如,我有一个简单的路线。现在我可以计算所有路线的距离(572公里)。如何计算每个国家的距离?德国约100公里,波兰约472公里 我尝试使用start\u location在legs[]中为每个方向leg检测国家边界,并通过start\u location检测国家名称。例如: getCountry(legs[0]) => 'pl' getCountry(legs[1]) => 'pl' getCountry(legs[2]) => 'pl' //border detected

例如,我有一个简单的路线。现在我可以计算所有路线的距离(572公里)。如何计算每个国家的距离?德国约100公里,波兰约472公里

我尝试使用
start\u location
legs[]
中为每个
方向leg
检测国家边界,并通过
start\u location
检测国家名称。例如:

getCountry(legs[0]) => 'pl'
getCountry(legs[1]) => 'pl'
getCountry(legs[2]) => 'pl'
//border detected
getCountry(legs[3]) => 'de'
getCountry(legs[4]) => 'de'
这是可行的,但如果路线太大,
getCountry()
return
OVER\u QUERY\u LIMIT

已更新

谢谢你的帮助

工作。 警告:代码工作正常,但未进行优化。小心点


顺便说一句,我的英语很抱歉

您需要一种方法,避免每一步都要求检测国家

有一个包含国家边界的Fusionable:

可能的工作流程:

  • 请求受路线影响国家的几何图形。直接使用路径在这里不起作用,因为URL太长,所以根据路由的边界过滤结果(返回的结果可能比受影响的国家多,但没有其他选择)

    华沙-柏林路线的示例查询如下:

    SELECT sovereignt,json_4326 
    FROM 16CTzhDWVwwqa0e5xe4dRxQ9yoyE1hVt_3ekDFQ 
    WHERE ST_INTERSECTS(kml_4326,
                        RECTANGLE(LATLNG(51.88951,13.38593),
                                  LATLNG(52.52003,21.01219))) 
    
    此查询中使用的矩形将基于给定路由的
    边界
    -属性创建。样本请求:

  • 根据返回的几何图形,为每个国家/地区创建多边形阵列(它们不得可见)

  • 在路线的步骤上循环,并对每个步骤在多边形数组上迭代。使用
    google.maps.geometry.poly.containsLocation()
    检查开始位置(或结束位置)是否放置在当前多边形中。执行此操作时,将当前步长的距离添加到当前国家/地区的距离中

  • 我不知道我的方法是否比你的getCountry()快,但我使用说明文本并搜索“进入”(如“进入德国”)——这意味着你在边境(但你必须使用下一个索引的lat lng)


    编辑:我刚刚意识到每一步都有一个结束位置,所以你不需要下一步作为计算子站的参考。或者简单地使用
    myroute.legs[0]。步长[j]。距离。值
    。此外,将每一步的距离加在一起,无需调用任何进一步的函数。

    请向我们展示您的代码,以获取答复。“请求受路线影响国家的几何图形”-我怎么能做到?因为我刚才没有机会测试它,所以花了很多时间,但非常感谢,它是有效的。注意,Fusion Tables将于2019年12月3日关闭。可以使用相同的算法,但需要不同的多边形源。
                var instr = myroute.legs[0].steps[i].instructions;
                isBorder=instr.includes("Entering");
                if(isBorder) {
                    // calculate partial distance with myroute.legs[0].steps[i+1].start_location.lat() etc;
                 }