在谷歌地图上使用地理位置,将学生按最近的位置分组回家?

时间:2013-06-17 12:32:39

标签: javascript google-maps google-maps-api-3

我在Google地图上有许多代表学生家的点

我也有很多公共汽车。

我必须根据他们的位置对学生进行分组,将最近的学生用同一辆公交车分组。

所以公交车司机会把他们送到学校。

关于算法的任何想法? 任何想法??

6 个答案:

答案 0 :(得分:4)

我不太确定我是否完全理解你的问题(特别是当你从评论中提到“公共汽车的路线是学生家的住所”时)。因此,我假设您没有预定义的公交路线,但希望找到最佳路线。

现在澄清我们应该将任务分成子任务,在我的假设之后我们可以说:

  1. 您需要一种算法将学生宿舍分配给最近的学生宿舍 巴士车站。公共汽车站可能是预定义的,也可能不是 - 您需要 澄清是否定义了公共汽车站。

  2. 由于您有多条总线,因此需要将每条总线分配给a 他们所在的公交车站(我们称之为公交车区) 负责停止。

  3. 然后你需要为每个公交区域(公交车站组)解决TSP(旅行商问题)。

  4. 可能的解决方案

    1 - 您想要研究的是如何对(lat,lon)定义的点(在本例中为 - student-homes)进行分组。要做到这一点,你需要能够计算地球上两点之间的距离,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。您应该能够为每个公交区域(公交车站组)运行它。

答案 1 :(得分:2)

答案 2 :(得分:0)

喜欢这个项目.....应该很有趣

我会正确地拆分地图,并为每个区域制作一个总线负责,而不是有一些故障安全程序(如果1区域最终有99%的学生,在这种情况下,区域将动态地改变为它更均匀)。您也可以这样做,以便如果一辆公共汽车的路线最终超过20%的其他公共汽车,而不是减少该公共汽车的学生。

从那里,每辆公共汽车都会有一名学生,您可以从中计算出路线。然而,要创建一个计算多个总线的最佳路径的算法,需要做很多工作。

您可能希望考虑已经执行此操作的服务,例如MapBox。这会让你的生活变得更轻松,但也会产生持续的成本。

希望有所帮助

答案 3 :(得分:0)

您可以尝试使用分层群集对学生进行分组。然后,您可以使用开放的tsp算法来查找路由。来自Gebweb的Optimap是一个免费解算器。要对学生进行分组,您可以查找clusterfck JavaScript。您也可以尝试使用类似保存算法的启发式方法。

答案 4 :(得分:0)

蛮力方法

如果您知道公共汽车的位置并且您拥有所有学生的位置,那么您应该计算所有学生与所有公共汽车站的距离。每个学生将他们的距离分类到每个公共汽车站,并将他们分配到最近的公共汽车站。

优化1

排除部分学生的巴士站。有一些公交车站不需要计算距离,你可以立即知道这一点。你可以说,如果某个学生属于某个象限。那么你只需要计算一部分总线的距离(只有1/4而不是全部)。这可能会在边界处产生有趣的情况,但您可以解释这一点。

优化2

根据之前的优化,您可以进一步完成此操作,直到基本保证不计算任何距离。如果用户属于某个节点,那么他们将最终进入某个公共汽车站。如果学生进入某个网格节点,他们将基本上将网格覆盖到地图上,然后他们将前往该公交车站。以前的问题基本上也解决了。如果到公共汽车站的距离稍微长一点也不重要,因为它相对微不足道。但是,您可以保证任何学生的最大行程距离。

解决方案

每辆公共汽车都有一个可维修的区域(一个命中箱)。对于某个象限/节点内的每个学生,确定它们是否属于公共汽车的服务区域。如果没有将它们冒泡到更高级别的象限/节点。

答案 5 :(得分:0)

是的,我一次使用超过500个标记,我可以发送一些链接给你帮助: first link second link

阅读并在数组的帮助下申请。