Google Maps iOS SDK,获取2个位置之间的路线
在使用Google Maps SDK的同时,我试图在iOS上的两个位置之间取得驾驶方向。 我知道我们可以用两种方法做到这一点:
1.)使用URL Scheme,为此,需要将Google Maps App安装在您的设备上。
2.)使用Directions API,通过请求响应,然后parsingJSON。 显示标记以显示方向。
现在,我的问题是有什么其他方式可以在iOS上做到这一点? 我需要显示从我的当前位置到具有纬度/经度的特定位置的方向。
我的意思是真的不可能简单地通过2位置作为参数和谷歌地图SDK,会给我的方向?
谢谢,
这听起来像你正在寻找像谷歌地图应用程序显示方向的用户界面的Chrome。 Google Maps SDK for iOS会为您绘制一张地图,但是您需要负责其他导航栏。
您可以使用Google Directions API来请求路线,然后使用GMSPath的pathFromEncodedPath:方法使用从服务返回的编码path绘制GMSPolyline 。
NSString *urlString = [NSString stringWithFormat: @"%@?origin=%f,%f&destination=%f,%f&sensor=true&key=%@", @"https://maps.googleapis.com/maps/api/directions/json", mapView.myLocation.coordinate.latitude, mapView.myLocation.coordinate.longitude, destLatitude, destLongitude, @"Your Google Api Key String"]; NSURL *directionsURL = [NSURL URLWithString:urlString]; ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:directionsURL]; [request startSynchronous]; NSError *error = [request error]; if (!error) { NSString *response = [request responseString]; NSLog(@"%@",response); NSDictionary *json =[NSJSONSerialization JSONObjectWithData:[request responseData] options:NSJSONReadingMutableContainers error:&error]; GMSPath *path =[GMSPath pathFromEncodedPath:json[@"routes"][0][@"overview_polyline"][@"points"]]; GMSPolyline *singleLine = [GMSPolyline polylineWithPath:path]; singleLine.strokeWidth = 7; singleLine.strokeColor = [UIColor greenColor]; singleLine.map = self.mapView; } else NSLog(@"%@",[request error]);
注意:请确保您的Google方向API Sdk已在您的Google开发者控制台中启用。
这些线条显示给定纬度/经度和用户位置之间的位置;
NSString *googleMapUrlString = [NSString stringWithFormat:@"http://maps.google.com/?saddr=%f,%f&daddr=%@,%@", mapView.userLocation.coordinate.latitude, mapView.userLocation.coordinate.longitude, destinationLatitude, destinationLongtitude]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:googleMapUrlString]];
我已经做了,因为它也显示在方向路线地图上的PINS DISTANCE和DURATION 。 但是不要忘记在您的GOOGLE开发者控制台中设置您的GOOGLE DIRECTION API以启用
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; NSString *urlString =@"https://maps.googleapis.com/maps/api/directions/json"; NSDictionary *dictParameters = @{@"origin" : [NSString stringWithFormat:@"%@",_sourceAdd], @"destination" : [NSString stringWithFormat:@"%@",_destinationAdd], @"mode" : @"driving", @"key":@"AIzaSyD9cWTQkAxemELVXTNUCALOmzlDv5b9Dhg"}; [manager GET:urlString parameters:dictParameters success:^(AFHTTPRequestOperation *operation, id responseObject) { GMSPath *path =[GMSPath pathFromEncodedPath:responseObject[@"routes"][0][@"overview_polyline"][@"points"]]; NSDictionary *arr=responseObject[@"routes"][0][@"legs"]; NSMutableArray *loc=[[NSMutableArray alloc]init]; loc=[[arr valueForKey:@"start_location"]valueForKey:@"lat"]; _sourceloc.latitude=[loc[0] doubleValue]; loc=[[arr valueForKey:@"start_location"]valueForKey:@"lng"]; _sourceloc.longitude=[loc[0] doubleValue]; loc=[[arr valueForKey:@"end_location"]valueForKey:@"lat"]; _destinationloc.latitude=[loc[0] doubleValue]; loc=[[arr valueForKey:@"end_location"]valueForKey:@"lng"]; _destinationloc.longitude=[loc[0] doubleValue]; NSString *dis,*dur; loc=[[arr valueForKey:@"distance"]valueForKey:@"text"]; dis=loc[0]; loc=[[arr valueForKey:@"duration"]valueForKey:@"text"]; dur=loc[0]; NSString *sa,*da; loc=[arr valueForKey:@"start_address"]; sa=loc[0]; loc=[arr valueForKey:@"end_address"]; da=loc[0]; UIAlertView *av=[[UIAlertView alloc]initWithTitle:@"Route Info" message:[NSString stringWithFormat:@"Distance:%@ \nDuration:%@",dis,dur] delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil, nil]; [av show]; GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:_sourceloc.latitude longitude:_sourceloc.longitude zoom:10]; mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; GMSMarker *marker = [GMSMarker markerWithPosition:_sourceloc]; marker.title=@"Source"; marker.snippet =sa; marker.appearAnimation = kGMSMarkerAnimationPop; marker.map = mapView; GMSMarker *marker2 = [GMSMarker markerWithPosition:_destinationloc]; marker2.title=@"Destination"; marker2.snippet =da; marker2.appearAnimation = kGMSMarkerAnimationPop; marker2.map = mapView; GMSPolyline *singleLine = [GMSPolyline polylineWithPath:path]; singleLine.strokeWidth = 4; singleLine.strokeColor = [UIColor blueColor]; singleLine.map = mapView; self.view = mapView; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }];
Swift 3.0&XCode 8.0使用AFNetworking&SwiftJson
let destLatitude="26.9124" let destLongitude="75.7873" mapView.isMyLocationEnabled = true var urlString = "\("https://maps.googleapis.com/maps/api/directions/json")?origin=\("28.7041"),\("77.1025")&destination=\(destLatitude),\(destLongitude)&sensor=true&key=\("Your-Api-key")" urlString = urlString.addingPercentEncoding( withAllowedCharacters: .urlQueryAllowed)! let manager=AFHTTPRequestOperationManager() manager.responseSerializer = AFJSONResponseSerializer(readingOptions: JSONSerialization.ReadingOptions.allowFragments) as AFJSONResponseSerializer manager.requestSerializer = AFJSONRequestSerializer() as AFJSONRequestSerializer manager.responseSerializer.acceptableContentTypes = NSSet(objects:"application/json", "text/html", "text/plain", "text/json", "text/javascript", "audio/wav") as Set<NSObject> manager.post(urlString, parameters: nil, constructingBodyWith: { (formdata:AFMultipartFormData!) -> Void in }, success: { operation, response -> Void in //{"responseString" : "Success","result" : {"userId" : "4"},"errorCode" : 1} //if(response != nil){ let parsedData = JSON(response) print_debug("parsedData : \(parsedData)") var path = GMSPath.init(fromEncodedPath: parsedData["routes"][0]["overview_polyline"]["points"].string!) //GMSPath.fromEncodedPath(parsedData["routes"][0]["overview_polyline"]["points"].string!) var singleLine = GMSPolyline.init(path: path) singleLine.strokeWidth = 7 singleLine.strokeColor = UIColor.green singleLine.map = self.mapView //let loginResponeObj=LoginRespone.init(fromJson: parsedData) // } }, failure: { operation, error -> Void in print_debug(error) let errorDict = NSMutableDictionary() errorDict.setObject(ErrorCodes.errorCodeFailed.rawValue, forKey: ServiceKeys.keyErrorCode.rawValue as NSCopying) errorDict.setObject(ErrorMessages.errorTryAgain.rawValue, forKey: ServiceKeys.keyErrorMessage.rawValue as NSCopying) })
在Google开发人员控制台中创build一个密钥,确保您的项目是使用App bundleID创build的,然后添加以下代码
NSString *KEY=@""; NSString *Origin=@""; NSString *Destination=@""; NSString *str_maps=[NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/directions/json?origin=%@&destination=%@&key=%@",Origin,Destination,KEY]; NSURL *url=[NSURL URLWithString:str_maps]; NSData *dta=[NSData dataWithContentsOfURL:url]; NSDictionary *dict=(NSDictionary *)[NSJSONSerialization JSONObjectWithData:dta options:kNilOptions error:nil]; NSLog(@"%@",dict);
(void)viewDidLoad { [super viewDidLoad]; GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:30.692408 longitude:76.767556 zoom:14]; GMSMapView *mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; mapView.myLocationEnabled = YES; // Creates markers in the center of the map. GMSMarker *marker = [[GMSMarker alloc] init]; marker.position = CLLocationCoordinate2DMake(30.6936659, 76.77201819999999); marker.title = @"Chandigarh 47c"; marker.snippet = @"Hello World"; marker.map = mapView; GMSMarker *marker1 = [[GMSMarker alloc] init]; marker1.position = CLLocationCoordinate2DMake(30.742138, 76.818756); marker1.title = @"Sukhna Lake"; marker1.map = mapView; //creating a path GMSMutablePath *path = [GMSMutablePath path]; [path addCoordinate:CLLocationCoordinate2DMake(@(30.6936659).doubleValue,@(76.77201819999999).doubleValue)]; [path addCoordinate:CLLocationCoordinate2DMake(@(30.742138).doubleValue,@(76.818756).doubleValue)]; GMSPolyline *rectangle = [GMSPolyline polylineWithPath:path]; rectangle.strokeWidth = 2.f; rectangle.map = mapView; self.view=mapView; }
使用Swift我绝对是这样解决的。
我的目的是find两个坐标之间的距离:
import AFNetworking /** Calculate distance between two valid coordinates - parameter origin: origin coordinates - parameter destination: destination coordinates - parameter completion: completion callback */ func calculateDistance(origin origin: CLLocation, destination: CLLocation, completion: (distance: Double?) -> Void) { let service = "https://maps.googleapis.com/maps/api/directions/json" let originLat = origin.coordinate.latitude let originLong = origin.coordinate.longitude let destLat = destination.coordinate.latitude let destLong = destination.coordinate.longitude let urlString = "\(service)?origin=\(originLat),\(originLong)&destination=\(destLat),\(destLong)&mode=driving&units=metric&sensor=true&key=<YOUR_KEY>" let directionsURL = NSURL(string: urlString) let request = NSMutableURLRequest(URL: directionsURL!) request.HTTPMethod = "GET" request.addValue("application/json", forHTTPHeaderField: "Content-Type") request.addValue("application/json", forHTTPHeaderField: "Accept") let operation = AFHTTPRequestOperation(request: request) operation.responseSerializer = AFJSONResponseSerializer() operation.setCompletionBlockWithSuccess({ (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) -> Void in if let result = responseObject as? NSDictionary { if let routes = result["routes"] as? [NSDictionary] { if let lines = routes[0]["overview_polyline"] as? NSDictionary { if let points = lines["points"] as? String { let path = GMSPath(fromEncodedPath: points) let distance = GMSGeometryLength(path) print("wow \(distance / 1000) KM") } } } } }) { (operation: AFHTTPRequestOperation!, error: NSError!) -> Void in print("\(error)") } operation.start() }