2012-12-24 27 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不答应。希望这可以帮助。