【问题标题】:Around-the-world path breaking in Google Static Maps谷歌静态地图中的环游世界路径
【发布时间】:2011-10-02 09:08:53
【问题描述】:

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

本例中的路径中断(标记@北京、旧金山、纽约、亚速尔群岛、罗马):

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 时,您可以看到北京、旧金山、纽约、亚速尔群岛、罗马的路径正确显示

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

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

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    因此,如果您的路径必须从位置 A 到位置 B,而 A 和 B 之间的最短路径“环游世界”(或者更好的是,它从图像),然后路径显示为“borken”,如您显示的地图中所示。在实践中,A 和 B 靠近地图的左右边缘,由于路径的其他点,地图不能在 A 和 B 之间的最短路径上的某个点居中。这就是当您删除“罗马”时会发生的情况:没有罗马,地图可以以不中断路径的方式居中。

    形式上,我认为问题出现了(即路径断了),当路径在赤道上的投影长于经度360度,并且路径总是在同一个方向上(即总是西到东或总是从东到西)。

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

    • 不能无限缩小;

    • 如果您还想在地图中插入标记,它们将仅绘制在“主”地图上;

    • 可能你可以有一条环游世界的路径(从美洲、欧洲、亚洲和美洲依次经过……),而且有这么多小地图真的很糟糕一个接一个;

    我google了很多关于这个问题,我没有找到任何解决方案,在错误跟踪器上打开了一个错误,但没有解决。

    在我看来,“正确”的做法很简单:最多一张地图,如果一条路径必须从地图/图像的一个边距出去,那么它应该出现在相反的边距上并继续目的地,绘制在同一张地图上。

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

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

    为了解决这个问题,我找到了第二种解决方法: - 不要简单地绘制路径及其反向,而是为路径的每一对位置(和反向)绘制不同的路径,即对于路径 A->B->C 然后:path:A|B,path=B |C,path=C|B,path=B|A 这总是有效的

    缺点是这样URL会变得很长,很容易达到2048个字符的限制。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      • 2012-09-12
      相关资源
      最近更新 更多