我不太确定我是否完全理解了您的问题(尤其是您在评论中提到“公共汽车的路线是学生家的纬度/经度”)。所以我假设你没有预定义的公交路线,但想找到最好的路线。
现在澄清一下,我们应该将任务拆分为子任务,根据我的假设,我们可以这样说:
您需要一种算法来将学生之家分配到最近的
公交车站。公共汽车站可能是预定义的,也可能不是 - 您需要
澄清是否定义了公交车站。
由于您有多条总线,因此需要将每条总线分配给一个
它们是一组公共汽车站(我们称之为公共汽车区)
负责停在。
那么你需要解决每个公交区域(公交车站组)的 TSP(旅行推销员问题)。
可能的解决方案
1 - 您要研究的是如何对由 (lat,lon) 定义的点(在这种情况下是指学生之家)进行分组。为此,您需要能够计算地球上两点之间的距离,Haversine formula 被广泛用于此目的。如果您搜索它,您可以找到很多现有的实现 - 这是一个简单的 JS 实现:
var R = 6371; // km
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).toRad();
var lat1 = lat1.toRad();
var lat2 = lat2.toRad();
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
Google Maps API v3 中还实现了一个功能,您可以在此SO question 找到更多信息。
因此,如果您有预定义的公交车站,只需计算每个学生家到每个公交车站的距离,然后将每个学生分组到最近的公交车站(即计算出的最短距离) )
根据您的项目所需的数据/计算量,您可能需要考虑将其移至后端解决方案,而不是在客户端中进行。
2 - 这同样取决于您的项目的要求,如果您有预定义的公交车区(多边形),那么您只需确定哪些公交车站属于每个公交车区。这只是解决球体Point in polygon 的问题。如果您需要自己的实现搜索 SO,有很多现有的解决方案可用。 Othwerise Google maps API v3 有一个 containsLocation() 函数,您可以使用它:
google.maps.geometry.poly.containsLocation(google.maps.LatLng(latitude, longitude),polygons);
3 - 有很多关于解决 TSP 的信息。在谷歌地图中获得最快路线的一个很好的解决方案是OptiMap。源代码也是available。您应该能够为每个公交车区(公交车站组)运行它。