road map from location A to location B by latitude

2019-09-21 07:57发布

问题:

I am doing work with map and location. I want to have road map from one location to another location. I am providing latitude and longitude of both the location(destination and source). So please help me to have this map.

I read about Google map api but I didn't find perfect answer.

回答1:

Use below URL of google map API to find the road map route between two locations

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


回答2:

First you have to take the directions from Google. Like this:

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];

After that , parse the JSON you got above:

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);
}

Now you need these methods:

-(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];
}

And:

- (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;
}

Voila!

Cheers!