2007-11-01

Google Maps API 卡死,CPU 負載飆高

最近為了某種特殊的應用,必須透過 Google Maps APIGoogle Maps 上展現行動軌跡圖。軌跡圖繪製的方式是用 polyline 的方式,連接數百點,甚至數千點。該程式在 IE6 與 Firefox 2.x 皆可正常執行,但是在 Firefox 3 alpha、Opera 或 Safari 等瀏覽器上時,執行到一半便會卡死不動,CPU 負載飆高到 9x%。深入追蹤的結果,發現程式會死在 GMap2.panToGMap2.setCenter 之類移動地圖的函式,狀似進入無限迴圈。而且在這幾個瀏覽器上執行都是死在同個地方,看起來很像跟座標資料有關,但我實在很難相信事實會是如此。

程式卡死在 Google Maps API 函式裡的情況,看起來不大好搞。上網搜尋一下相關討論,發現也有一些人發生類似的問題,雖然沒有找到什麼明確的解決方案,不過大概可以歸納出問題是出現在處理 polyline (GPolyline) 上。偶然之間,看到有人提到 API 版本不同所引發的其他問題,靈機一動便試著替換不同的 API 版本試看看。最後,我把原來預設的 v=2 換成 v=2.x,便神奇地解決了這個問題。而 v=2 與 v=2.x 有什麼差別呢?根據 Google Maps API 官方文件

  • v=2 (default) 是使用預設的 API 版本。
  • v=2.x (latest) 是使用最新的 API 版本,加入新功能與 bugfix,但可能沒有 v=2 來得穩定。
  • v=2.s (stable) 是使用最穩定的 API 版本,但功能可能比較陽春。
看來 Google 也有發現處理 polyline 上的瑕疵,在 v=2.x 版上解決了這個問題。事實上,Google Maps 在處理 polyline 上並沒有那麼單純。為了能快速繪製 polyline,Google Maps 使用了不少方法輔助,甚至在伺服器端有一些輔助的設計。細節我就沒有研究了,等有空或有需要的時候再說吧!

Google Maps API 的版本有實際的數字代碼,而且更新的速度也很快。目前 v=2 代表 2.91a,v=2.x 為 2.92,而 v=2.s 為 2.73。Google Maps API 並沒有提供取得版本資訊的方法,有興趣的想知道確切版本,可以參考 Mapki 這個網站。如果非得要在程式中動態判斷版本,底下這一段 PHP 程式碼可以提供給你參考:

function get_gmaps_api_version($url) {
if (preg_match('/mapfiles\/([\d\w]+)\/maps2/',
file_get_contents($url), $m))
return "2." . $m[1];
return "N/A";
}


其中輸入的 $url 是 script URL:

  • v=2 → http://maps.google.com/maps?file=api&v=2
  • v=2.x → http://maps.google.com/maps?file=api&v=2.x
  • v=2.s → http://maps.google.com/maps?file=api&v=2.s

2 comments:

Anonymous said...

居然被我search到了~ 哈哈哈~~
(因為我看不懂polyline...)
By fanncy

JY said...

真厲害,我的 blog 很低調的...