经度和纬度从地点A到地点B的路线图

时间:2012-07-09 10:08:55

标签: iphone objective-c ios maps allocation

我正在处理地图和位置。我想要从一个地方到另一个地方的路线图。我提供位置(目的地和来源)的纬度和经度。所以请帮我拿这张地图。

我读过有关谷歌地图api但我没有找到完美的答案。

2 个答案:

答案 0 :(得分:1)

使用google地图API的以下网址查找两个地点之间的路线图路线

http://maps.google.com/?saddr=STARTINGADDRESS&daddr=DESTINATIONADDRESS

答案 1 :(得分:0)

首先,您必须接受Google的指示。像这样:

NSError     *error = nil;
NSString    *directionsInJSON = [NSString stringWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/directions/json?origin=%f,%f&destination=%f,%f&sensor=true",start.coordinate.latitude , start.coordinate.longitude , destination.coordinate.latitude, destination.coordinate.longitude]]encoding:NSUTF8StringEncoding error:&error];

之后,解析你上面的JSON:

if (error == nil) 
{
    NSError *JSONError = nil;
    SBJsonParser *JSONParser = [[SBJsonParser alloc] init];
    id  directions = [JSONParser objectWithString:directionsInJSON error:&JSONError];
    if (JSONError == nil) 
    {
        directions = (NSDictionary*)directions;

        NSString *status = [directions objectForKey:@"status"];
        if ([status isEqualToString:@"OK"]) 
        {
            NSArray         *routes = [directions objectForKey:@"routes"];
            NSDictionary    *route  = [routes objectAtIndex:0];
            NSDictionary    *polylineOverview = [route objectForKey:@"overview_polyline"];

            NSString *polylinePoints = [polylineOverview objectForKey:@"points"];
            NSArray *decodedPolyline = [self decodePolyLine:polylinePoints];

            [self loadRouteWithPoints:decodedPolyline];
        }
        else
        {
            UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"No routes found" message:@"Sorry , we couldn't find any routes between you two." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil] autorelease];
            [alert show];
        }
    }
}
else
{
    NSLog(@"error: %@",error.description);
}

现在你需要这些方法:

-(void) loadRouteWithPoints:(NSArray *) routes
{

    CLLocationCoordinate2D coords[[routes count]];
    for(int i = 0; i < routes.count; i++)
    {
        CLLocation* loc = (CLLocation*)[routes objectAtIndex:i];//[NSKeyedUnarchiver unarchiveObjectWithData:[routes objectAtIndex:i]];
        CLLocationCoordinate2D c;
        c.latitude  = loc.coordinate.latitude;
        c.longitude = loc.coordinate.longitude;
        coords[i]   = c;
    }

    MKPolyline *line = [[MKPolyline polylineWithCoordinates:(CLLocationCoordinate2D*)coords count:[routes count]] retain];
    [self.mapsView addOverlay:line];
}

- (NSMutableArray *)decodePolyLine: (NSString *)encoded 
{
    NSInteger len = [encoded length];
    NSInteger index = 0;
    NSMutableArray *array = [[[NSMutableArray alloc] init] autorelease];
    NSInteger lat=0;
    NSInteger lng=0;
    while (index < len) 
    {
        NSInteger b;
        NSInteger shift = 0;
        NSInteger result = 0;
        do 
        {
            b = [encoded characterAtIndex:index++] - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
        } while (b >= 0x20);

        NSInteger dlat = ((result & 1) ? ~(result >> 1) : (result >> 1));
        lat += dlat;
        shift = 0;
        result = 0;
        do 
        {
            b = [encoded characterAtIndex:index++] - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
        } while (b >= 0x20);

        NSInteger dlng = ((result & 1) ? ~(result >> 1) : (result >> 1));
        lng += dlng;
        NSNumber    *latitude   = [[[NSNumber   alloc] initWithFloat:lat * 1e-5] autorelease];
        NSNumber    *longitude  = [[[NSNumber   alloc] initWithFloat:lng * 1e-5] autorelease];
        CLLocation  *loc        = [[[CLLocation alloc] initWithLatitude:[latitude floatValue] longitude:[longitude floatValue]] autorelease];
        [array addObject:loc];
    }

    return array;
}

瞧!

干杯!