2012-12-24 62 views
2

我在我的iOS應用中使用谷歌api V3, 我請求谷歌api方向服務,通過http GET方法,我得到了非常大的json響應,我從原點獲得了很多替代路線到目的地,現在我想在地圖上顯示每種選擇的路線,我應該怎麼做?是否有任何需要在iOS中集成谷歌SDK,或者我可以只使用WebView,請幫助我,並建議最簡單的方法。 在此先感謝在地圖上顯示谷歌方向api響應

回答

5

您不需要包含任何Google SDK來繪製地圖上的路線。看看下面的課程。

MKPolyline

MKPolyLineview

的谷歌地圖API服務的方向會給你的雙腿(座標)繪製兩個特定點之間的路線。

由於您已經有了來自Direction api的json響應,現在您必須解析json並從json中獲取所有的腿點來創建座標數組。

Jsonkit for parsing

這些點可能是或大部分encripted。 How to decode the Google Directions API polylines field into lat long points in objective-C for iPhone?

如果你有座標數組,那麼首先你必須創建一個CLLocationCoordinate2D數組像以下:

CLLocationCoordinate2D *pointArr  =  malloc(sizeof(CLLocationCoordinate2D) * [your_CoordinateArray count]); 

for(int i = 0; i < [your_CoordinateArray count]; i++){ 
    pointArr[i]  =  [your_CoordinateArray objectAtIndex:i]; 
} 

然後,你必須折線添加到地圖

MKPolyline *line      = [MKPolyline polylineWithCoordinates:pointArr count:[your_CoordinateArray count]]; 

    if (nil != line) 
    { 
     [your_Map addOverlay:line]; 

    } 

然後,你必須實施以下地圖代理:

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay 
{  

MKOverlayView* overlayView = nil; 

lineView     =  [[MKPolylineView alloc] initWithPolyline:overlay];// lineView is an ivar, object of MKPolylineView 
lineView.fillColor   =  [UIColor greenColor]; 
lineView.strokeColor  =  [UIColor greenColor]; 

lineView.lineWidth   =  10.0; 
lineView.alpha    =  0.9; 
overlayView     =  lineView; 

return overlayView; 
}  

現在,如果你想在兩點之間顯示兩條不同的路線,那麼你必須創建兩個不同的座標陣列,並將上述方法應用於兩個陣列。

希望這會對你有所幫助。

+0

感謝superGokuN,我會盡力實施這個解決方案。 – prabhu

+0

嗨superGokuN,我認爲有一個規則從谷歌的方向api,如果我們使用谷歌**的服務,我們必須顯示谷歌地圖**,所以我們必須在我們的地圖集成谷歌API,或者應該嘗試在WebView中顯示Google地圖。你有什麼建議? – prabhu

0

沒有必要說,整合谷歌SDK,你可以簡單地使用WebView,因爲我相信WebView給你的替代視圖,但用戶界面比在線更清潔的SDK。但目前,我不相信SDK允許其他應用程序顯示我使用新SDK的替代路線。 maps.google.com中的代碼現在與API中的 顯着不同,並且可以訪問不同的服務。特別是,它有一個很大的外部模塊mod_suggest.js,它不存在於API中。但是,您可以通過

1來實現它)扔在maps.google.com的要求,並讓它做的建議,即 打開一個新的瀏覽器窗口,通過它像 http://www.google.com/maps?f=d&source=s_d&saddr=Jurong+West,+Singapore&da DDR =昂的東西+ Mo + Kio +新加坡& hl = en

2)只顯示正常路線和避開高速公路路線。

3)嘗試猜測合理的航點,以增加他的路線中間, 可能會導致合理的選擇。這並不容易,除非你有一個高速公路或高速公路交叉口的數據庫,並且可以尋找這樣一個位於你的起點和終點之間的交點(對於 的一些近似值「之間」)。

使用緯度/經度座標作爲航點, 可能會出現問題,特別是涉及到雙車道時。如果座標 適用於錯誤車道上的某一點,則GDirections將驅動一個相當大的距離,以便您訪問道路的錯誤一側 。但是,即使使用街道名稱,你可能會得到奇怪的扭結 航點附近,像這樣:

來自:裕廊西,新加坡:亞逸拉惹Expy開行新加坡:宏茂 錦鯉,新加坡

也許唯一真正處理的方法是在雙車道的兩側包括 兩點,並且清除在下方或頭頂上穿過 的道路,然後嘗試過濾掉那些很愚蠢的道路。

考慮這些例子

來自:裕廊西,新加坡:1.32558,103.740764到:宏茂橋,新加坡

來自:裕廊西,新加坡:1.32582,103.740764到:宏茂橋, 新加坡

其中一個增加了7分鐘的旅行由一個複雜的遊覽 訪問錯誤的一邊的道路。

編寫代碼來過濾掉愚蠢的路由並不容易。作爲第一個近似值,您可以丟棄估計時間爲 的路線比初始路線長10%以上。而且,您還可以比較雙重對角線上的兩對點的持續時間,並始終放棄較慢的一對。

編寫丟棄重複路由的代碼也不容易。例如, Bukit Timah Expy或Kranji Expy上的某個點可能會創建一條路線,該路線與Google的Seletar Expy建議重複。

你可能想看看:http://www.geocodezip.com/example_geo2.asp?waypts=yes&addr1=Jurong+West,+Singapore&addr2=Ang+Mo+Kio,+Singapore&waypt=Ayer+Rajah+Expy+singapore&geocode=1&geocode=2

但是,這可能不是一個合法的實現,因爲API不答應。希望這可以幫助。