2011-07-10 69 views
2

我正在用標記之間的路徑創建Google靜態地圖,並遇到了某些破壞路徑的座標組合。谷歌靜態地圖中的世界各地的路徑打破

的路徑打破了這個例子(標記@北京,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

而且在這個例子中工作(標記@羅馬移除)

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經度的另一邊開始時,它纔會打破。

爲了證明這一點,你可以看到,北京,SF,NY,亞速爾羣島,羅馬路徑正確顯示當我設置地圖中心點到-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

不幸的是,我可以」像這樣以編程方式設置中心,因爲我永遠不知道我將獲得的點的集合,並且幾乎不可能檢測到通過的點會導致換行。

任何想法?

回答

0

第一:即使您在編譯時不知道點(位置)的集合,也可以計算中心:在運行時,您知道所有點(否則無法將座標插入到URL中),因此您可以輕鬆地遍歷所有點並計算中心。你可以計算所有座標的平均值,並得到幾何中心(也稱爲質心):這是更簡單的方法。另一種方法是檢查距離最遠的一對位置(緯度和經度),然後將中間點設置爲中心:這需要稍微更多的編碼(例如計算您需要考慮的經度距離你必須在兩個方向上計算距離,因爲它有可能在世界各地出現,而且它具有更高的複雜性。

我不會深究這個主題,因爲即使您正確計算了點的中心點,這也不能解決問題,而且由Google靜態地圖API自動提供的中心始終是正確的:再次該中心與問題有關,但不是(問題的)問題。

一個微不足道但重要的要點是:Google靜態地圖總是通過考慮最短路徑(即通過繪製最短直線)在兩個位置之間繪製路徑。

因此,如果您處於一種情況,即您的路徑必須從A地點移到B地點,並且A和B之間的最短路徑走向「世界各地」(或者更好,它會從一側),那麼路徑將顯示爲「borken」,如同您已經顯示的地圖一樣。在實踐中,A和B靠近地圖的左右邊界,並且由於路徑的其他點,地圖不能沿着A和B之間的最短路徑的某個點居中。當你移除'羅馬'時會發生這種情況:如果沒有羅馬,地圖可以以路徑不是borken的方式爲中心。

形式上,我認爲當赤道上的路徑投影長於360度的經度時,問題出現(即路徑被破壞),並且路徑總是沿着相同的方向(即總是西向東或總是東向西)。

在這種情況下,Google靜態地圖只是在第一個地圖旁添加另一個世界地圖:如果將縮放比例設置爲最小,則最多可以查看三個世界地圖。由於以下幾個原因,這實際上是不切實際的:

  • 你無法無限縮小;

  • 如果您還想在地圖中插入標記,則只會在'主'地圖上繪製標記;

  • 很多時候,你可能有一條走遍世界的道路(從美國,歐洲,亞洲和美國等等再次順序傳遞),如此多的小事情真的很可怕映射一個接一個;

我搜索了很多關於這個問題,我沒有找到任何解決方案,有一個錯誤跟蹤器打開的錯誤,但它沒有解決。

在我看來,「正確」的做法只是簡單的如下:最多一張地圖,如果一個路徑必須從地圖/圖像的一個邊界出去,那麼它應該出現在相反的邊界並繼續到目的地,繪製在同一張地圖上。

於是我找到了第一個解決方法:

  • 您繪製路徑,並用相同的風格(線的顏色等),你也畫以相反的方式路徑(谷歌靜態地圖允許繪製多個路徑在相同的地圖中),即path = A | B | C path = C | B | A並且這將在許多情況下解決該問題(即路徑從圖像的一側退出並從另一側進入)。不幸的是這不工作始終:如果你有穿越的圖像邊緣連續兩次的路徑,那麼你失去了你的路徑的一部分

爲了解決這個問題,我找到了第二個解決方法: - 不是簡單地畫但是爲路徑的每一對位置(並且顛倒)繪製不同的路徑,即對於路徑A-> B-> C,則路徑:A | B,路徑= B | C,路徑= C | B,路徑= B | A,並且此作品始終爲

缺點是以這種方式URL變得非常長,並且URL的2048個字符的限制很容易達到。

最好的解決方案是手動計算中心,手動檢查路徑跨越邊界的位置,只有路徑的這一部分在邊界的兩個位置之間繪製額外的路徑(也可能是反過來),但我認爲它並不值得,儘管我認爲谷歌永遠不會解決這個問題。