在iOS中的GMSMapView上绘制两个地方之间的路线
我正在开发一个iOS应用程序。 在那个应用程序中,我有2个字段从和。 我使用Google自动完成APIinput地址,同时我也能够获取2个位置的经度和纬度 ,并且能够在GMSMapView
上显示标记。
现在我想在这两个地方之间画出路线。 当我们使用MKMapView
时,我find了一个解决scheme。 但我无法findGMSMapView
的解决scheme。 请帮我在GMSMapView
绘制这两个点之间的路线。
如果可能的话请给我一些重要的链接。
谢谢。
`first get all points coordinates which are coming in route then add these points latitude and longitude in path in will draw path according to that` GMSCameraPosition *cameraPosition=[GMSCameraPosition cameraWithLatitude:18.5203 longitude:73.8567 zoom:12]; _mapView =[GMSMapView mapWithFrame:CGRectZero camera:cameraPosition]; _mapView.myLocationEnabled=YES; GMSMarker *marker=[[GMSMarker alloc]init]; marker.position=CLLocationCoordinate2DMake(18.5203, 73.8567); marker.icon=[UIImage imageNamed:@"aaa.png"] ; marker.groundAnchor=CGPointMake(0.5,0.5); marker.map=_mapView; GMSMutablePath *path = [GMSMutablePath path]; [path addCoordinate:CLLocationCoordinate2DMake(@(18.520).doubleValue,@(73.856).doubleValue)]; [path addCoordinate:CLLocationCoordinate2DMake(@(16.7).doubleValue,@(73.8567).doubleValue)]; GMSPolyline *rectangle = [GMSPolyline polylineWithPath:path]; rectangle.strokeWidth = 2.f; rectangle.map = _mapView; self.view=_mapView;
我写了下面的代码应该为你做的伎俩:
- (void)drawRoute { [self fetchPolylineWithOrigin:myOrigin destination:myDestination completionHandler:^(GMSPolyline *polyline) { if(polyline) polyline.map = self.myMap; }]; } - (void)fetchPolylineWithOrigin:(CLLocation *)origin destination:(CLLocation *)destination completionHandler:(void (^)(GMSPolyline *))completionHandler { NSString *originString = [NSString stringWithFormat:@"%f,%f", origin.coordinate.latitude, origin.coordinate.longitude]; NSString *destinationString = [NSString stringWithFormat:@"%f,%f", destination.coordinate.latitude, destination.coordinate.longitude]; NSString *directionsAPI = @"https://maps.googleapis.com/maps/api/directions/json?"; NSString *directionsUrlString = [NSString stringWithFormat:@"%@&origin=%@&destination=%@&mode=driving", directionsAPI, originString, destinationString]; NSURL *directionsUrl = [NSURL URLWithString:directionsUrlString]; NSURLSessionDataTask *fetchDirectionsTask = [[NSURLSession sharedSession] dataTaskWithURL:directionsUrl completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error) { NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; if(error) { if(completionHandler) completionHandler(nil); return; } NSArray *routesArray = [json objectForKey:@"routes"]; GMSPolyline *polyline = nil; if ([routesArray count] > 0) { NSDictionary *routeDict = [routesArray objectAtIndex:0]; NSDictionary *routeOverviewPolyline = [routeDict objectForKey:@"overview_polyline"]; NSString *points = [routeOverviewPolyline objectForKey:@"points"]; GMSPath *path = [GMSPath pathFromEncodedPath:points]; polyline = [GMSPolyline polylineWithPath:path]; } // run completionHandler on main thread dispatch_sync(dispatch_get_main_queue(), ^{ if(completionHandler) completionHandler(polyline); }); }]; [fetchDirectionsTask resume]; }
如果有人正在为@ Tarek的答案寻找一个Swift 3.0 ,你可以使用它。 这也使用Alamofire和SwiftyJSON 。
func drawPath() { let origin = "\(currentLocation.latitude),\(currentLocation.longitude)" let destination = "\(destinationLoc.latitude),\(destinationLoc.longitude)" let url = "https://maps.googleapis.com/maps/api/directions/json?origin=\(origin)&destination=\(destination)&mode=driving&key=YOURKEY" Alamofire.request(url).responseJSON { response in print(response.request) // original URL request print(response.response) // HTTP URL response print(response.data) // server data print(response.result) // result of response serialization let json = JSON(data: response.data!) let routes = json["routes"].arrayValue for route in routes { let routeOverviewPolyline = route["overview_polyline"].dictionary let points = routeOverviewPolyline?["points"]?.stringValue let path = GMSPath.init(fromEncodedPath: points!) let polyline = GMSPolyline.init(path: path) polyline.map = self.mapView } } }
这是johny kumar的答案的Swift翻译。
let cameraPositionCoordinates = CLLocationCoordinate2D(latitude: 18.5203, longitude: 73.8567) let cameraPosition = GMSCameraPosition.cameraWithTarget(cameraPositionCoordinates, zoom: 12) let mapView = GMSMapView.mapWithFrame(CGRectZero, camera: cameraPosition) mapView.myLocationEnabled = true let marker = GMSMarker() marker.position = CLLocationCoordinate2DMake(18.5203, 73.8567) marker.groundAnchor = CGPointMake(0.5, 0.5) marker.map = mapView let path = GMSMutablePath() path.addCoordinate(CLLocationCoordinate2DMake(18.520, 73.856)) path.addCoordinate(CLLocationCoordinate2DMake(16.7, 73.8567)) let rectangle = GMSPolyline(path: path) rectangle.strokeWidth = 2.0 rectangle.map = mapView self.view = mapView
对于Swift 3,要绘制折线:
func getPolylineRoute(from source: CLLocationCoordinate2D, to destination: CLLocationCoordinate2D){ let config = URLSessionConfiguration.default let session = URLSession(configuration: config) let url = URL(string: "https://maps.googleapis.com/maps/api/directions/json?origin=\(source.latitude),\(source.longitude)&destination=\(destination.latitude),\(destination.longitude)&sensor=true&mode=driving&key=YOURKEY")! let task = session.dataTask(with: url, completionHandler: { (data, response, error) in if error != nil { print(error!.localizedDescription) self.activityIndicator.stopAnimating() } else { do { if let json : [String:Any] = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String: Any]{ guard let routes = json["routes"] as? NSArray else { DispatchQueue.main.async { self.activityIndicator.stopAnimating() } return } if (routes.count > 0) { let overview_polyline = routes[0] as? NSDictionary let dictPolyline = overview_polyline?["overview_polyline"] as? NSDictionary let points = dictPolyline?.object(forKey: "points") as? String self.showPath(polyStr: points!) DispatchQueue.main.async { self.activityIndicator.stopAnimating() let bounds = GMSCoordinateBounds(coordinate: source, coordinate: destination) let update = GMSCameraUpdate.fit(bounds, with: UIEdgeInsetsMake(170, 30, 30, 30)) self.mapView!.moveCamera(update) } } else { DispatchQueue.main.async { self.activityIndicator.stopAnimating() } } } } catch { print("error in JSONSerialization") DispatchQueue.main.async { self.activityIndicator.stopAnimating() } } } }) task.resume() } func showPath(polyStr :String){ let path = GMSPath(fromEncodedPath: polyStr) let polyline = GMSPolyline(path: path) polyline.strokeWidth = 3.0 polyline.strokeColor = UIColor.red polyline.map = mapView // Your map view }
注意:您需要将googleDirection API密钥放入url中。
向Google Directions API发送URL请求,当您收到JSON文件时,请执行所有步骤并解码点对象。
– Swift 3.0&XCode 8.0 Staright Line 🙁
let cameraPosition = GMSCameraPosition.camera(withLatitude: 18.5203, longitude: 73.8567, zoom: 12) self.mapView = GMSMapView.map(withFrame: CGRect.zero, camera: cameraPosition) self.mapView.isMyLocationEnabled = true let marker = GMSMarker() marker.position = CLLocationCoordinate2DMake(18.5203, 73.8567) // marker.icon = UIImage(named: "aaa.png")! marker.groundAnchor = CGPoint(x: 0.5, y: 0.5) marker.map = mapView let path = GMSMutablePath() path.add(CLLocationCoordinate2DMake(CDouble((18.520)), CDouble((73.856)))) path.add(CLLocationCoordinate2DMake(CDouble((16.7)), CDouble((73.8567)))) let rectangle = GMSPolyline.init(path: path) rectangle.strokeWidth = 2.0 rectangle.map = mapView self.view = mapView
你好你可以使用“LRouteController”,这是一个最好的方式来显示两点之间的道路路线,如:
[_routeController getPolyline With Locations: (Array of first and last location)]
试试吧,我希望它能解决你的问题。
来自Google Directions API的DirectionResponse NSLogs可以帮助您查看您正在使用的内容。
[[GMDirectionService sharedInstance] getDirectionsFrom:origin to:destination succeeded:^(GMDirection *directionResponse) { if ([directionResponse statusOK]){ NSLog(@"Duration : %@", [directionResponse durationHumanized]); NSLog(@"Distance : %@", [directionResponse distanceHumanized]); NSArray *routes = [[directionResponse directionResponse] objectForKey:@"routes"]; // NSLog(@"Route : %@", [[directionResponse directionResponse] objectForKey:@"routes"]); GMSPath *path = [GMSPath pathFromEncodedPath:routes[0][@"overview_polyline"] [@"points"]]; GMSPolyline *polyline = [GMSPolyline polylineWithPath:path]; polyline.strokeColor = [UIColor redColor]; polyline.strokeWidth = 5.f; polyline.map = mapView; } } failed:^(NSError *error) { NSLog(@"Can't reach the server") }];
我在xCode 8.3.3和Swift 3.1中使用了AlamoFire和SwiftyJson。 把path的绘制放在一个只需要两个参数的函数中
一个string来源示例“48.7788,9.22222”和一个string目标示例“49.3212232,8.334151”
func drawPath (origin: String, destination: String) { /* set the parameters needed */ String prefTravel = "walking" /* options are driving, walking, bicycling */ String gmapKey = "Ask Google" /* Make the url */ let url = URL(string: "https://maps.googleapis.com/maps/api/directions/json?origin=\(origin)&destination=\(destination)&mode=\(prefTravel)&key=" + gmapKey) /* Fire the request */ Alamofire.request(url!).responseJSON{(responseData) -> Void in if((responseData.result.value) != nil) { /* read the result value */ let swiftyJsonVar = JSON(responseData.result.value!) /* only get the routes object */ if let resData = swiftyJsonVar["routes"].arrayObject { let routes = resData as! [[String: AnyObject]] /* loop the routes */ if routes.count > 0 { for rts in routes { /* get the point */ let overViewPolyLine = rts["overview_polyline"]?["points"] let path = GMSMutablePath(fromEncodedPath: overViewPolyLine as! String) /* set up poly line */ let polyline = GMSPolyline.init(path: path) polyline.strokeWidth = 2 polyline.map = self.mapView } } } } } }
- 我如何从我的原生应用程序中启动Google Maps iPhone应用程序?
- 在GooGle地图上添加UITextField和UiButton
- 在加载所有可见的地图切片时调用的Google地图事件
- 减小谷歌地图sdk为iOS的大小
- 更新到IOS11和Xcode9后的问题! “com.google.Maps.LabelingBehavior”,“TIC Read Status”
- 如何打开Google地图来显示使用Swift的路线
- 以相同的方式在GMSAutocomplete中使用textfield而不是searchbar
- 自定义标记使用GMUClusterManager
- iOS:Google Maps API – markerInfoWindow vs markerInfoContents