在地图上显示谷歌方向api响应

时间:2012-12-24 07:38:35

标签: iphone ios google-maps-api-3

我在iOS应用中使用谷歌api V3, 我请求google api方向服务,通过http GET方法,我得到了一个非常大的json响应,我从源到目的地有很多备用路由,现在我想在地图上显示每个备选路线,我该怎么做?是否需要在iOS中集成google sdk,或者我只能使用webView,请帮助我,并提出最简单的方法。 提前致谢

2 个答案:

答案 0 :(得分:5)

您无需包含任何Google SDK即可在地图上绘制路线。看看下面的课程。

MKPolyline

MKPolyLineview

谷歌地图api方向服务将为您提供在两个特定点之间绘制路线的腿(坐标)。

由于你已经有来自Direction api的json响应,你现在必须解析json并从json获取所有腿点以创建Coordinate数组。

Jsonkit for parsing

这些要点可能是或大部分是入选的。 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;
}    

现在,如果要在两个点之间显示两条不同的路径,则必须创建两个不同的坐标数组,并对两个数组应用上述方法

希望这会对你有所帮助。

答案 1 :(得分: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 =昂+沫+的Kio,+新加坡&安培; HL = EN

2)只显示正常路线和避开高速公路路线。

3)尝试猜测合理的航路点,以便在路线中间添加 可能导致合理的替代方案。除非你有一个,否则这并不容易 高速公路或公路交叉口的数据库,可以寻找这样的 交叉点位于起点和终点之间(for 一些近似值“之间”)。

使用航点的lat / lng坐标可能会出现问题, 特别是如果涉及双车道。如果坐标 如果在错误的行车道上有一点,GDirections将驾驶一辆 相当远的距离让你走错了方向 这条路。但即使使用街道名称,您也可能会遇到奇怪的问题 在航点附近,像这样:

来自:Jurong West,新加坡:Ayer Rajah Expy新加坡:Ang Mo. Kio,新加坡

或许真正解决这个问题的唯一方法就是包括点 双车道的两侧,并且没有穿过的道路 在下面或开销,然后尝试过滤掉那些 愚蠢的。

考虑这些例子

从:Jurong West,新加坡:1.32558,103.740764:Ang Mo Kio, 新加坡

从:Jurong West,新加坡:1.32582,103.740764:Ang Mo Kio, 新加坡

其中一个通过复杂的短途旅行增加了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不允许,这可能不是合法的实施。希望这会有所帮助。