Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google maps 地图路由,谷歌地图?_Google Maps_Google Maps Api 3_Mapping_Gis - Fatal编程技术网

Google maps 地图路由,谷歌地图?

Google maps 地图路由,谷歌地图?,google-maps,google-maps-api-3,mapping,gis,Google Maps,Google Maps Api 3,Mapping,Gis,我一直对地图布线感兴趣,但我从来没有找到任何好的入门级(甚至高级!)教程。有人有什么指示、提示等吗 更新:我主要是寻找地图系统如何实现(数据结构、算法等)的指针。看一看地图系统,看看在一个真正的自由软件项目中如何解决这类问题,该项目只使用用户提供的和许可的数据,并且有一个 几年前,这些人很容易参与其中,回答了我的许多问题,因此我看不出为什么他们仍然不是一个很好的群体。与其向每个地图服务提供商学习api(如Gmaps、Ymaps api),不如学学学 “Mapstraction是一个为各种java

我一直对地图布线感兴趣,但我从来没有找到任何好的入门级(甚至高级!)教程。有人有什么指示、提示等吗

更新:我主要是寻找地图系统如何实现(数据结构、算法等)的指针。

看一看地图系统,看看在一个真正的自由软件项目中如何解决这类问题,该项目只使用用户提供的和许可的数据,并且有一个


几年前,这些人很容易参与其中,回答了我的许多问题,因此我看不出为什么他们仍然不是一个很好的群体。

与其向每个地图服务提供商学习api(如Gmaps、Ymaps api),不如学学学

“Mapstraction是一个为各种javascript映射API提供公共API的库”


我建议您访问URL并学习通用API。还有大量的How-to。

通过地图路由,你的意思是沿着街道网络寻找最短路径

Dijkstra最短路径算法是最著名的。维基百科有一个不错的介绍:

这里有一个Java小程序,您可以在其中看到它的运行情况:通过Google,您可以找到几乎任何语言的源代码


生成驾驶路线的任何实际实现都将包括街道网络上的大量数据,这些数据描述了与穿越路段和节点相关的成本道路网络层次结构、平均速度、交叉口优先级、交通信号连接、,禁止转弯等。

我还没有找到关于路线的好教程,但有很多代码需要阅读:

有一些GPL路由应用程序使用Openstreetmap数据,例如在Windows(+mobile)和Linux上工作。有许多有趣的应用程序使用相同的数据,但gosmore有一些很酷的用途


路由的最大问题是糟糕的数据,而你永远也得不到足够好的数据。因此,如果你想尝试,请将测试保持在本地,以便更好地控制数据。

谷歌地图路由查找功能的工程师之一巴里·布鲁米特(Barry Brumitt)就可能感兴趣的主题写了一篇文章:


2007年11月06日03:47:00 PM

A*实际上更接近生产映射算法。与Dijikstra的原始算法相比,它需要的探索更少。

从概念角度来看,想象一下将一块石头扔到池塘中并观察涟漪。路线将代表池塘和石头的起始位置

当然,随着距离n的增加,算法必须搜索一定比例的n^2条路径。您可以选择起始位置并检查从该点开始的所有可用路径。然后递归调用这些路径末尾的点,依此类推

您可以通过以下方式提高性能:不在路径上重复备份,不在已覆盖的点上重新检查路由,以及放弃耗时过长的路径

另一种方法是使用蚂蚁信息素方法,蚂蚁从一个起点随机爬行并留下一条气味轨迹,这会让更多的蚂蚁穿过给定的路径蚂蚁从起点和终点出发,最后气味最强的路径将是最短的。这是因为在给定的时间段内,如果蚂蚁以统一的速度行走,最短的路径将被访问更多次

编辑@Spikie

作为如何实现pond算法的进一步说明,重点介绍了可能需要的数据结构:

您需要将地图存储为一个网络。这只是它们之间的一组
节点和
边。一组
节点构成一条
路线
。一条边连接两个节点(可能都是同一个节点),并具有相关的
成本
,如穿过边缘的
距离
时间
。边缘可以是双向的,也可以是单向的。可能最简单的方法是仅具有单向的,并在节点之间双向移动(即,从A到B的一条边缘和从B到A的另一条边缘)

举例来说,假设三个火车站排列成一个向上的等边三角形。在它们中间还有另外三个车站。边缘将所有相邻的车站连接在一起,最终的图表将在较大的三角形内有一个倒三角形

将节点从左下角开始,从左到右再向上标记为A、B、C、D、E、F(F在顶部)

假设这些边可以在任意方向上穿过。每条边的成本为1公里

好的,我们希望从左下角的A站到顶部的F站。有很多可能的路线,包括那些自行返回的路线,例如ABCEBDEF

我们有一个例程,比如说,
NextNode
,它接受一个
节点和一个
成本
,并为它可以到达的每个节点调用自己

显然,如果我们让这个例程运行,它将最终发现所有路由,包括可能无限长的路由(如阿巴巴布等)。我们通过检查
成本
来阻止这种情况的发生。每当我们访问以前未访问过的节点时,我们都会将成本和来自该节点的节点放在该节点上。如果在我们检查现有成本之前已访问过某个节点,并且如果我们更便宜,则我们会更新该节点并继续(递归)。如果成本更高,则跳过节点。如果跳过所有节点,则退出例程

如果我们击中了目标节点,那么我们也会退出例程

通过这种方式,所有可行的路由都会被检查,但关键是只有那些成本最低的路由。到流程结束时,每个节点到达该节点的成本最低,包括我们的目标节点

为了获得路径,我们从目标节点向后工作。因为