如何使用 Google 地图 API 路线计算每个国家/地区的距离
How to calculate distance for each country using Google Maps API Route
例如我有一个简单的溃败From Warsaw, Poland To Berlin, Germany by car。现在我可以计算所有路线的距离(572 公里)。我如何计算每个国家/地区的距离?德国 ~ 100 公里,波兰 ~ 472 公里。
我尝试使用 start_location
为 legs[]
中的每个 DirectionsLeg
检测国家边界,并通过 start_location
检测国家名称。例如:
getCountry(legs[0]) => 'pl'
getCountry(legs[1]) => 'pl'
getCountry(legs[2]) => 'pl'
//border detected
getCountry(legs[3]) => 'de'
getCountry(legs[4]) => 'de'
它的工作,但如果路线是这样"big",getCountry()
return OVER_QUERY_LIMIT
。
已更新
感谢Dr.Molle的帮助!
工作fiddle。
警告:代码工作正常,但未优化。小心!
P.S。对不起我的英语
您需要一种方法来避免对检测国家/地区的每个步骤的请求。
有一个包含国家/地区边界的 FusionTable:https://www.google.com/fusiontables/data?docid=16CTzhDWVwwqa0e5xe4dRxQ9yoyE1hVt_3ekDFQ#map:id=3
可能的工作流程:
请求受该路线影响的国家/地区的几何形状。直接使用路径在这里是行不通的,因为 URL 会太长,所以根据路线的边界过滤结果(它可能比受影响的国家多 return,但有没有其他选择)
华沙-柏林路线的示例查询为:
SELECT sovereignt,json_4326
FROM 16CTzhDWVwwqa0e5xe4dRxQ9yoyE1hVt_3ekDFQ
WHERE ST_INTERSECTS(kml_4326,
RECTANGLE(LATLNG(51.88951,13.38593),
LATLNG(52.52003,21.01219)))
此查询中使用的 RECTANGLE 将基于给定路线的 bounds
-属性 创建。样品申请:http://jsfiddle.net/doktormolle/vexqe0ps/
基于 returned 几何为每个国家/地区创建一个多边形数组(它们必须不可见)。
- 遍历路线的步骤,并为每个步骤迭代多边形数组。使用
google.maps.geometry.poly.containsLocation()
检查 start_(或 end_)位置是否位于当前多边形内。当它出现时,将当前步的距离添加到当前国家/地区的距离。
我不知道我的方法是否比您的 getCountry() 更快,但我使用说明文本并搜索 "Entering"(例如 "Entering Germany")- 这意味着您在边界处(但你必须使用下一个索引的lat-lng)
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;
}
编辑:我刚刚意识到每一步也有一个 end_location,因此您不需要下一步作为计算子距离的参考。或者干脆使用 myroute.legs[0].steps[j].distance.value
。此外,将每一步的距离相加就无需调用任何其他函数。
例如我有一个简单的溃败From Warsaw, Poland To Berlin, Germany by car。现在我可以计算所有路线的距离(572 公里)。我如何计算每个国家/地区的距离?德国 ~ 100 公里,波兰 ~ 472 公里。
我尝试使用 start_location
为 legs[]
中的每个 DirectionsLeg
检测国家边界,并通过 start_location
检测国家名称。例如:
getCountry(legs[0]) => 'pl'
getCountry(legs[1]) => 'pl'
getCountry(legs[2]) => 'pl'
//border detected
getCountry(legs[3]) => 'de'
getCountry(legs[4]) => 'de'
它的工作,但如果路线是这样"big",getCountry()
return OVER_QUERY_LIMIT
。
已更新
感谢Dr.Molle的帮助!
工作fiddle。 警告:代码工作正常,但未优化。小心!
P.S。对不起我的英语
您需要一种方法来避免对检测国家/地区的每个步骤的请求。
有一个包含国家/地区边界的 FusionTable:https://www.google.com/fusiontables/data?docid=16CTzhDWVwwqa0e5xe4dRxQ9yoyE1hVt_3ekDFQ#map:id=3
可能的工作流程:
请求受该路线影响的国家/地区的几何形状。直接使用路径在这里是行不通的,因为 URL 会太长,所以根据路线的边界过滤结果(它可能比受影响的国家多 return,但有没有其他选择)
华沙-柏林路线的示例查询为:
SELECT sovereignt,json_4326 FROM 16CTzhDWVwwqa0e5xe4dRxQ9yoyE1hVt_3ekDFQ WHERE ST_INTERSECTS(kml_4326, RECTANGLE(LATLNG(51.88951,13.38593), LATLNG(52.52003,21.01219)))
此查询中使用的 RECTANGLE 将基于给定路线的
bounds
-属性 创建。样品申请:http://jsfiddle.net/doktormolle/vexqe0ps/基于 returned 几何为每个国家/地区创建一个多边形数组(它们必须不可见)。
- 遍历路线的步骤,并为每个步骤迭代多边形数组。使用
google.maps.geometry.poly.containsLocation()
检查 start_(或 end_)位置是否位于当前多边形内。当它出现时,将当前步的距离添加到当前国家/地区的距离。
我不知道我的方法是否比您的 getCountry() 更快,但我使用说明文本并搜索 "Entering"(例如 "Entering Germany")- 这意味着您在边界处(但你必须使用下一个索引的lat-lng)
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;
}
编辑:我刚刚意识到每一步也有一个 end_location,因此您不需要下一步作为计算子距离的参考。或者干脆使用 myroute.legs[0].steps[j].distance.value
。此外,将每一步的距离相加就无需调用任何其他函数。