Google静态地图中的环球路径突破

时间:2011-07-10 20:45:08

标签: google-maps latitude-longitude google-maps-markers

我正在使用标记之间的路径创建Google静态地图,并且遇到了某些破坏路径的坐标组合。

此示例中的路径中断(标记@ Beijing,SF,NY,Azores,Rome):

http://maps.google.com/maps/api/staticmap?path=color:0xff0000cc|weight:3|39.904214,116.407413|37.77493,-122.419416|40.714353,-74.005973|38.721642,-27.220577|41.89052,12.494249&markers=39.904214,116.407413|37.77493,-122.419416|40.714353,-74.005973|38.721642,-27.220577|41.89052,12.494249&maptype=terrain&sensor=false&size=640x404

在这个例子中工作(标记@ Rome删除)

http://maps.google.com/maps/api/staticmap?path=color:0xff0000cc|weight:3|39.904214,116.407413|37.77493,-122.419416|40.714353,-74.005973|38.721642,-27.220577&markers=39.904214,116.407413|37.77493,-122.419416|40.714353,-74.005973|38.721642,-27.220577&maptype=terrain&sensor=false&size=640x404

原因并没有像我最初想的那样越过格林威治子午线。即使我在此之前添加一个标记,它似乎也会中断,看似是地图自动计算中心点以东的任何一个点...但只有当路径从-180经度的另一侧开始时才会出现。

为了证明这一点,当我将地图中心点设置为-170,35时,您可以看到北京,SF,NY,亚速尔群岛,罗马路径正确显示

http://maps.google.com/maps/api/staticmap?path=color:0xff0000cc|weight:3|39.904214,116.407413|37.77493,-122.419416|40.714353,-74.005973|38.721642,-27.220577|41.89052,12.494249&markers=39.904214,116.407413|37.77493,-122.419416|40.714353,-74.005973|38.721642,-27.220577|41.89052,12.494249&maptype=terrain&sensor=false&size=640x404&center=-170,35

不幸的是,我无法以编程方式设置这样的中心,因为我永远不会知道我将要获得的点集​​合,并且几乎不可能检测到传递的点会导致换行。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

首先:即使您在编译时不知道点(位置)的集合,您也可以计算中心:在运行时您知道所有点(否则将无法将坐标插入到URL),因此您可以轻松迭代所有点并计算中心。您可以计算所有坐标的平均值,并获得几何中心(也称为质心):这是更简单的方法。另一种方法是检查最远的一对位置(纬度和经度),然后将中间点设置为中心:这需要稍微更多的编码(例如,计算您需要考虑的经度距离)你必须在两个方向上计算距离,因为它可以在全世界范围内进行,并且它具有更高的复杂性。

我不会深入讨论这个主题,因为即使您正确计算了积分的中心,这也无法解决问题,而且Google静态地图API自动提供的中心始终是正确的:中心再次与问题有关,但不是(问题)问题。

一个微不足道但需要记住的重要方面:Google静态地图总是通过考虑最短路径,即绘制最短的直线,在两个位置之间绘制路径。

因此,如果您的路径必须从位置A到达位置B,并且A和B之间的最短路径会在全世界范围内传播。 (或者更好的是,它从图像的一侧出来),然后路径显示为“borken”#39;就像你展示的地图一样。在实践中,A和B靠近地图的左右边距,并且由于路径的其他点,地图不能沿着A和B之间的最短路径在某个点居中。这就是当你删除“罗马”时发生的事情:没有罗马,地图可以以一条路径不是中心的方式居中。

正式地,我认为当赤道上的路径投影长于360度经度时,问题出现(即路径被破坏),并且路径总是朝同一方向(即总是向西)东或永远东西。)

在这种情况下,Google静态地图只会在第一个地图旁边添加另一个世界地图:如果将缩放设置为最小,则最多可以看到三个世界地图。由于以下几个原因,这实际上是不切实际的:

  • 你无法无限缩小;

  • 如果您还想在地图中插入标记,则只会在“' main'地图;

  • 可能你可以有一条环绕世界的路径(从美国,欧洲,亚洲和美国再次依次传递......等等)很多次,拥有这么多小地图真的很糟糕一个接着一个;

我搜索了很多关于这个问题的帖子,我没有找到任何解决方案,bug跟踪器上有一个bug,但是它还没有解决。

在我看来,'权利'要做的只是以下几点:最多一个地图,如果路径必须从地图/图像的一个边缘出去,那么它应该出现在相反的边缘并继续到目的地,在同一个地图上绘制。 / p>

所以我找到了第一个解决方法:

  • 您绘制路径,并使用相同的样式(线条颜色等),您也以相反的方式绘制路径(Google静态地图允许在同一地图中绘制多条路径),即path = A | B | C& path = C | B | A,这将解决许多情况下的问题(即路径从图像的一侧退出并从另一侧进入)。不幸的是,这并不总是有效:如果你有一条连续两次越过图像边距的路径,那么你将失去一部分路径

为了解决这个问题,我找到了第二个解决方法: - 不是简单地绘制路径及其反向,而是为路径的每对位置绘制不同的路径(并反转),即路径A-> B-> C然后:路径:A | B,路径= B | C,路径= C | B,路径= B | A,这总是起作用

缺点是以这种方式,URL变得非常长,并且很容易达到URL的2048个字符的限制。

最好的解决方案是手动计算中心,手动检查路径将穿过边距的位置,并且只有路径的这一部分在边缘处的两个位置之间绘制一条额外的路径(也可能是相反的),但我认为这不值得,尽管我认为谷歌不会解决这个问题。