2012-07-10 119 views
3

我在使用Google地图V3 JavaScript提升服务时遇到了问题。海拔服务UNKNOWN_ERROR

根据谷歌群组发布(https://groups.google.com/forum/#!msg/google-maps-js-api-v3/Z6uh9HwZD_k/G1ur1SJN7fkJ),似乎如果使用getElevationAlongPath(),它会压缩并将整个路径作为Ajax GET请求发送到Google服务器,并在服务器上对其进行二次抽样。这意味着如果您有大量路径段,则编码的URL将超过最大URL长度,并且请求将因UNKNOWN_ERROR而失败。

任何人都可以确认这是一个URL长度问题?

我试着沿路径做我自己的二次采样,并发送我想要的高程数据作为getElevationForLocations()请求的点。这似乎是一种改进,但我仍然收到一些UNKNOWN_ERROR响应。这些发生不可预知的。有时400点的请求会成功返回。其他请求将失败,只有300点通过。我猜测这仍然是一个URL长度问题(假设getElevationForLocations()也会将URL编码数据发送给Google)。

该文档说“只要您不超过服务配额,您可以在数组中传递任意数量的多个坐标。”这似乎并非如此。

有没有人有一个可靠的方法来获得大量的高程数据点(500?)从长路径的任何建议?

感谢, 科林


多一点挖后,这似乎是这种情况。

提升的JavaScript API在幕后使用HTTP提升服务。 HTTP提升服务文档确实表示请求被限制为2048个字符。但是,如果您直接使用HTTP服务,则会构建自己的URL。这意味着您可以在发送前检查长度。如果您使用JavaScript API,则会为您构建该URL,但在发送之前,API代码不会检查URL的长度。

对于编码点,调用终点URL和必要参数占用了1970年剩余的78个字符。

这是它变得混乱。编码点中字符的数量随lat和lng值的大小和精度而变化。一般来说,每点有8到12个字符。另外一个复杂的情况是,路径编码中使用的某些字符可能需要URL编码 - 这会进一步增加每个点需要的字符数量,但数量可能会很大(但需要URL编码的每个路径字符会增加2个字符)。

所有这些复杂情况意味着它在理论上可能导致过长的网址只有55分 - 但是非常非常不可能。安全限制大概是150分(但这可能偶尔会失败)。 200应该在大部分时间工作。 250应该是最大值。

在现实中,从少数的测试: - 200工作每次 - 300通常工作 - 400,有时作品

计算和测试之间的差异表明的JavaScript API可以做一些进一步的压缩形式或者我在计算中遇到错误?

+0

你有链接到一个例子,再现这个? – bamnet 2012-07-10 22:48:46

+0

要复制到http://gb.mapometer.com/cycling/route_2113760.html,然后单击“显示高度”按钮(地图左下角)。 UNKNOWN_ERROR有很长的停顿时间。我用调试器跟踪了这一点,发送的数据看起来很好。 – ColinK 2012-07-11 17:30:00

+0

感谢@ColinK这个问题,我面临同样的问题,我需要为提升请求发送多个位置,但URI变得太大而无法接受和处理协议。 好像我将不得不多次执行这些请求。如果您有任何建议,请在4年后告诉我:) – RainierMallol 2016-06-17 03:59:04

回答

2

您的怀疑是正确的,这是一个URL长度问题。如果您在提交请求时打开Chrome的开发人员工具,则会看到HTTP 414(请求URI太大)错误。该网址约为3000个字符,大约为1000个字符(2048是常见的最大URL长度)。

Google Maps API在内部将所有这些点转换为看起来像encoded polyline的那些点,这有助于压缩数据,但这显然不足以实现这个很长的路径。当你知道你将包含N个以上的分数时(我试着用N来看看有什么作用),可能有必要将请求分成多个部分。

+0

感谢您的额外信息 - 有帮助。如果他们使用与编码折线类似的压缩,则每个点需要10个字节。因此限制应该在200点左右(右侧)。但是,它也应该是一个固定的数字(对于给定的浏览器)。我还没有发现这种情况。正如我上面所说的,有时400点有效,有时300点失败。 – ColinK 2012-07-11 20:23:27

+0

数据是URL编码的事实意味着该服务从根本上无法提供文档描述的内容。当可能发送大量数据时,使用GET请求是一个非常奇怪的设计选择。为什么不POST? – ColinK 2012-07-11 20:28:58