【问题标题】:how to show route and calculating distance using google map or ios mapkit如何使用谷歌地图或 ios mapkit 显示路线和计算距离
【发布时间】:2013-07-11 08:24:24
【问题描述】:

我对 ios 地图应用程序有疑问。在某些方面我没有找到任何好的帮助。我尝试了 ios 和谷歌地图,但我无法找到两者的帮助。我被困在几个点上,所以任何人都可以帮助我这些点

  1. 如何在 ios 或谷歌地图中显示路线黑白两点
  2. 显示路线后,如果用户移动到该位置,如何更新路线
  3. 如何在 ios 或谷歌地图中获取自行车、汽车、步行等的黑白两点的距离和时间
  4. 如何仅通过地址获取坐标
  5. ios 或谷歌地图有没有分步导航的选项

【问题讨论】:

    标签: ios google-maps mapkit google-maps-sdk-ios


    【解决方案1】:

    我会给你一个起点——写一条路线并获取方向

    获取路线方法(google路线api):

    - (void)callAPIGetDirection:(NSString *)mode
    {
    // Start new request
    CLLocationCoordinate2D currentLocation = [(RCAppDelegate *)[[UIApplication sharedApplication] delegate]getCurrentLocation];
    
    // NSString *urlString = [NSString stringWithFormat:kAPIGetDirection, currentLocation.latitude, currentLocation.longitude, self.location.latitude, self.location.longitude];
    
    //urlString = @"http://bizannouncements.com/Vega/services/app/getDirections.php?origlat=43.653310&origlong=-79.38277000000001&destlat=43.66361000000001&destlong=-79.35547000000001";
     NSString *urlString = @"";
    if(![mode isEqualToString:@"transit"])
    {
        urlString =[NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/directions/json?origin=%f,%f&destination=%f,%f&sensor=true&mode=%@", currentLocation.latitude, currentLocation.longitude, self.location.latitude, self.location.longitude, mode];
    }
    else
    {
        urlString =[NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/directions/json?origin=%f,%f&destination=%f,%f&sensor=true&mode=%@&departure_time=%ld", currentLocation.latitude, currentLocation.longitude, self.location.latitude, self.location.longitude, mode, (long)[[NSDate date] timeIntervalSince1970] + 1800];
    }
    
    [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    NSURL *url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSDictionary *rO = [NSJSONSerialization JSONObjectWithData:responseObject options:kNilOptions error:nil];
        NSLog(@"%@", rO);
        if(![[rO objectForKey:@"status"] isEqualToString:@"INVALID_REQUEST"] && ![[rO objectForKey:@"status"] isEqualToString:@"ZERO_RESULTS"])
        {
    
    
            //OVER_QUERY_LIMIT
    
            if(![[rO objectForKey:@"status"] isEqualToString:@"OVER_QUERY_LIMIT"])
            {
                NSArray *routes = [rO objectForKey:@"routes"];
    
    
                NSArray *legs = [routes[0] objectForKey:@"legs"];
                //NSLog(@"legs %@", legs[0]);
                NSArray *steps = [legs[0] objectForKey:@"steps"];
                //NSLog(@"steps : %@", steps);
    
                Place* office = [[Place alloc] init];
                office.name = self.location.name;
                office.description = @"";
                office.latitude = [[[legs[0] objectForKey:@"end_location"] objectForKey:@"lat"] doubleValue];
                office.longitude = [[[legs[0] objectForKey:@"end_location"] objectForKey:@"lng"] doubleValue];
    
                //NSLog(@"office: %f", office.latitude);
    
                NSMutableArray *routing = [[NSMutableArray alloc] init];
    
                [_instructions removeAllObjects];
                int ii = 1;
                for(NSDictionary *step in steps)
                {
                    [_instructions addObject:[NSString stringWithFormat:@"%i: %@", ii, [step objectForKey:@"html_instructions"]]];
                    NSDictionary *suStep = [step objectForKey:@"end_location"];
                    CLLocation *loc = [[CLLocation alloc] initWithLatitude:[[suStep objectForKey:@"lat"] doubleValue] longitude:[[suStep objectForKey:@"lng"] doubleValue]];
                    [routing addObject:loc];
                    ii++;
    
                }
                [_table reloadData];
    
                //self.mainMap.routes = routing;
    
                //[self.mainMap showRouteTo:office];
            }
            else
            {
                [RCCommonUtils showMessageWithTitle:@"Error" andContent:@"Directions service is down. Please try again a bit later!"];
    
            }
    
        }
        else
        {
            [RCCommonUtils showMessageWithTitle:@"Error" andContent:@"There are no directions available!"];
    
        }
    
    
    
    
        [MBProgressHUD hideHUDForView:self.view animated:YES];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        [RCCommonUtils showMessageWithTitle:@"Error" andContent:@"Network error. Please try again later!"];
        [MBProgressHUD hideAllHUDsForView:self.view animated:YES];
    }];
    
    [operation start];
    
    
    }
    

    在地图上绘制路径:

     - (id) initWithFrame:(CGRect) frame
     {
    self = [super initWithFrame:frame];
    if (self != nil) {
        mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
        mapView.showsUserLocation = YES;
        [mapView setDelegate:self];
        [self addSubview:mapView];
        routeView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, mapView.frame.size.width, mapView.frame.size.height)];
        routeView.userInteractionEnabled = NO;
        [mapView addSubview:routeView];
    
        self.lineColor = [UIColor colorWithWhite:0.2 alpha:1.0];
    }
    return self;
     }
    
     -(void) centerMap {
    MKCoordinateRegion region;
    
    CLLocationDegrees maxLat = -90;
    CLLocationDegrees maxLon = -180;
    CLLocationDegrees minLat = 90;
    CLLocationDegrees minLon = 180;
    for(int idx = 0; idx < self.routes.count; idx++)
    {
        CLLocation* currentLocation = [self.routes objectAtIndex:idx];
        if(currentLocation.coordinate.latitude > maxLat)
            maxLat = currentLocation.coordinate.latitude;
        if(currentLocation.coordinate.latitude < minLat)
            minLat = currentLocation.coordinate.latitude;
        if(currentLocation.coordinate.longitude > maxLon)
            maxLon = currentLocation.coordinate.longitude;
        if(currentLocation.coordinate.longitude < minLon)
            minLon = currentLocation.coordinate.longitude;
    }
    region.center.latitude     = (maxLat + minLat) / 2;
    region.center.longitude    = (maxLon + minLon) / 2;
    region.span.latitudeDelta  = maxLat - minLat;
    region.span.longitudeDelta = maxLon - minLon;
    
    [mapView setRegion:region animated:YES];
    }
    
    -(void) showRouteTo:(Place*)t {
    
    if(self.routes) {
        [mapView removeAnnotations:[mapView annotations]];
    }
    
    PlaceMark* to = [[PlaceMark alloc] initWithPlace:t];
    [mapView addAnnotation:to];
    
    [self updateRouteView];
    [self centerMap];
    }
    
    -(void) updateRouteView {
    CGContextRef context =  CGBitmapContextCreate(nil, 
                                                       routeView.frame.size.width, 
                                                    routeView.frame.size.height, 
                                                  8, 
                                                  4 * routeView.frame.size.width,
                                                  CGColorSpaceCreateDeviceRGB(),
                                                  kCGImageAlphaPremultipliedLast);
    
    CGContextSetStrokeColorWithColor(context, lineColor.CGColor);
    CGContextSetRGBFillColor(context, 0.0, 0.0, 1.0, 1.0);
    CGContextSetLineWidth(context, 4.0);
    
    for(int i = 0; i < self.routes.count; i++) {
        CLLocation* location = [self.routes objectAtIndex:i];
        CGPoint point = [mapView convertCoordinate:location.coordinate toPointToView:routeView];
    
        if(i == 0) {
            CGContextMoveToPoint(context, point.x, routeView.frame.size.height - point.y);
        } else {
            CGContextAddLineToPoint(context, point.x, routeView.frame.size.height - point.y);
        }
    }
    
    CGContextStrokePath(context);
    
    CGImageRef image = CGBitmapContextCreateImage(context);
    UIImage* img = [UIImage imageWithCGImage:image];
    
    routeView.image = img;
    CGContextRelease(context);
    
    }
    

    【讨论】:

      【解决方案2】:

      按地址获取坐标

      - (CLLocationCoordinate2D) geoCodeUsingAddress: (NSString *) address
      {
         CLLocationCoordinate2D myLocation;
      
         // — modified from the stackoverflow page – we use the SBJson parser instead of the string scanner –
      
         NSString *esc_addr = [address stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
         NSString *req = [NSString stringWithFormat: @"http://maps.google.com/maps/api/geocode/json?sensor=false&address=%@", esc_addr];
         NSDictionary *googleResponse = [[NSString stringWithContentsOfURL: [NSURL URLWithString: req] encoding: NSUTF8StringEncoding error: NULL] JSONValue];
      
         NSDictionary *resultsDict = [googleResponse valueForKey:  @"results"];   // get the results dictionary
         NSDictionary *geometryDict = [   resultsDict valueForKey: @"geometry"];   // geometry dictionary within the  results dictionary
         NSDictionary *locationDict = [  geometryDict valueForKey: @"location"];   // location dictionary within the geometry dictionary
      
         // nslo (@”– returning latitude & longitude from google –”);
      
         NSArray *latArray = [locationDict valueForKey: @"lat"]; NSString *latString = [latArray lastObject];     // (one element) array entries provided by the json parser
         NSArray *lngArray = [locationDict valueForKey: @"lng"]; NSString *lngString = [lngArray lastObject];     // (one element) array entries provided by the json parser
      
         myLocation.latitude = [latString doubleValue];     // the json parser uses NSArrays which don’t support “doubleValue”
         myLocation.longitude = [lngString doubleValue];
      
         return myLocation;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-22
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 2016-09-23
        • 2016-04-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多