2

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

4

2 回答 2

5

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

MK折线

MKPolyLineview

google map api Direction 服务将为您提供腿(坐标)以绘制两个特定点之间的路线。

由于您已经从 Direction api 获得了 json 响应,现在您必须解析 json 并从 json 中获取所有腿点以创建坐标数组。

用于解析的 Jsonkit

这些点可能是或大部分是加密的。如何将 Google Directions API 折线字段解码为 iPhone 的 Objective-C 中的经纬度点?

如果你有坐标数组,那么首先你必须创建一个 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;
}    

现在,如果您想在两点之间显示两条不同的路线,那么您必须创建两个不同的坐标数组并将上述方法应用于两个数组

希望这会帮助你。

于 2012-12-24T07:53:39.817 回答
0

无需说集成 google sdk,您可以简单地使用 webView,因为我相信 webView 可以为您提供替代视图,但 SDK 中的用户界面比在线更简洁。但目前,我不相信 SDK 允许其他应用程序显示我使用的新 SDK 的替代路线。maps.google.com 中的代码现在与 API 中的代码有很大不同,并且可以访问不同的服务。特别是,它有一个 API 中不存在的大型外部模块 mod_suggest.js。但是您可以通过以下方式实现它

1) 向 maps.google.com 提出请求,让它执行建议,即打开一个新的浏览器窗口并传递类似 http://www.google.com/maps?f=d&source=s_d&saddr=Jurong+的内容West,+Singapore&da ddr=Ang+Mo+Kio,+Singapore&hl=en

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

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

使用 lat/lng 坐标作为航路点可能会出现问题,尤其是在涉及双车道的情况下。如果坐标是针对错误行车道上的某个点,GDirections 将开出相当大的距离,从而使您走错路。但即使使用街道名称,您也可能会在路点附近遇到奇怪的问题,如下所示:

来自:新加坡裕廊西 至:新加坡亚逸拉惹机场 至:新加坡宏茂桥

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

考虑这些例子

从:新加坡裕廊西到: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 不允许这样做。希望这可以帮助。

于 2012-12-24T07:50:49.013 回答