最近為了某種特殊的應用,必須透過 Google Maps API 在 Google Maps 上展現行動軌跡圖。軌跡圖繪製的方式是用 polyline 的方式,連接數百點,甚至數千點。該程式在 IE6 與 Firefox 2.x 皆可正常執行,但是在 Firefox 3 alpha、Opera 或 Safari 等瀏覽器上時,執行到一半便會卡死不動,CPU 負載飆高到 9x%。深入追蹤的結果,發現程式會死在 GMap2.panTo 或 GMap2.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 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:
居然被我search到了~ 哈哈哈~~
(因為我看不懂polyline...)
By fanncy
真厲害,我的 blog 很低調的...
Post a Comment