Skip to content

vikaskumar113/RouteWithMultipleLocation

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 

Repository files navigation

RouteWithMultipleLocation

To draw the polyline, you don't need to also add annotations at each coordinate (but you could if you want to).

Creating and adding an MKPolyline and its corresponding MKPolylineView is very similar to MKPolygon and MKPolygonView.

simulator screen shot 23-aug-2017 3 59 42 pm

 NSString* apiUrlStr =[NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/directions/json?origin=%@,%@&destination=%@,%@&sensor=false",lat,lon, _vendorlat, _vendorlon
                          ];


NSData *data =[NSData dataWithContentsOfURL:[NSURL URLWithString:apiUrlStr]];
[self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:YES];
- (void)fetchedData:(NSData *)responseData {
NSError* error;

NSDictionary* json = [NSJSONSerialization
                      JSONObjectWithData:responseData //1
                      
                      options:kNilOptions
                      error:&error];
NSArray *arrRouts=[json objectForKey:@"routes"];
if ([arrRouts isKindOfClass:[NSArray class]]&&arrRouts.count==0) {
    UIAlertView *alrt=[[UIAlertView alloc]initWithTitle:@"Alert" message:@"didn't find direction" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
     [alrt show];
    return; 
}
NSArray *arrDistance =[[[json valueForKeyPath:@"routes.legs.steps.distance.text"] objectAtIndex:0]objectAtIndex:0];
NSString *totalDuration = [[[json valueForKeyPath:@"routes.legs.duration.text"] objectAtIndex:0]objectAtIndex:0];
NSString *totalDistance = [[[json valueForKeyPath:@"routes.legs.distance.text"] objectAtIndex:0]objectAtIndex:0];
NSArray *arrDescription =[[[json valueForKeyPath:@"routes.legs.steps.html_instructions"] objectAtIndex:0] objectAtIndex:0];
dictRouteInfo=[NSDictionary dictionaryWithObjectsAndKeys:totalDistance,@"totalDistance",totalDuration,@"totalDuration",arrDistance ,@"distance",arrDescription,@"description", nil];

NSArray* arrpolyline = [[[json valueForKeyPath:@"routes.legs.steps.polyline.points"] objectAtIndex:0] objectAtIndex:0]; //2
double srcLat=[[[[json valueForKeyPath:@"routes.legs.start_location.lat"] objectAtIndex:0] objectAtIndex:0] doubleValue];
double srcLong=[[[[json valueForKeyPath:@"routes.legs.start_location.lng"] objectAtIndex:0] objectAtIndex:0] doubleValue];
double destLat=[[[[json valueForKeyPath:@"routes.legs.end_location.lat"] objectAtIndex:0] objectAtIndex:0] doubleValue];
double destLong=[[[[json valueForKeyPath:@"routes.legs.end_location.lng"] objectAtIndex:0] objectAtIndex:0] doubleValue];
CLLocationCoordinate2D sourceCordinate = CLLocationCoordinate2DMake(srcLat, srcLong);
CLLocationCoordinate2D destCordinate = CLLocationCoordinate2DMake(destLat, destLong);

[self addAnnotationSrcAndDestination:sourceCordinate :destCordinate];

// NSArray *steps=[[aary objectAtIndex:0]valueForKey:@"steps"];

// replace lines with this may work

NSMutableArray *polyLinesArray =[[NSMutableArray alloc]initWithCapacity:0];

for (int i = 0; i < [arrpolyline count]; i++)
{
    NSString* encodedPoints = [arrpolyline objectAtIndex:i] ;
    MKPolyline *route = [self polylineWithEncodedString:encodedPoints];
    [polyLinesArray addObject:route];
}

[theMapView addOverlays:polyLinesArray];
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
theMapView.delegate=self;

}

#pragma mark - add annotation on source and destination

 -(void)addAnnotationSrcAndDestination :(CLLocationCoordinate2D )srcCord :(CLLocationCoordinate2D)destCord
  {
MKPointAnnotation *sourceAnnotation = [[MKPointAnnotation alloc]init];
MKPointAnnotation *destAnnotation = [[MKPointAnnotation alloc]init];
sourceAnnotation.coordinate=srcCord;
destAnnotation.coordinate=destCord;
sourceAnnotation.title=_startPoint;

destAnnotation.title=_endPoint;

[theMapView addAnnotation:sourceAnnotation];
[theMapView addAnnotation:destAnnotation];

MKCoordinateRegion region;


MKCoordinateSpan span;
region.center=srcCord;
region.span=span;

}

#pragma mark - decode map polyline

 - (MKPolyline *)polylineWithEncodedString:(NSString *)encodedString {
const char *bytes = [encodedString UTF8String];
NSUInteger length = [encodedString lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
NSUInteger idx = 0;

NSUInteger count = length / 4;
CLLocationCoordinate2D *coords = calloc(count, sizeof(CLLocationCoordinate2D));
NSUInteger coordIdx = 0;

float latitude = 0;
float longitude = 0;
while (idx < length) {
    char byte = 0;
    int res = 0;
    char shift = 0;
    
    do {
        byte = bytes[idx++] - 63;
        res |= (byte & 0x1F) << shift;
        shift += 5;
    } while (byte >= 0x20);
    
    float deltaLat = ((res & 1) ? ~(res >> 1) : (res >> 1));
    latitude += deltaLat;
    
    shift = 0;
    res = 0;
    
    do {
        byte = bytes[idx++] - 0x3F;
        res |= (byte & 0x1F) << shift;
        shift += 5;
    } while (byte >= 0x20);
    
    float deltaLon = ((res & 1) ? ~(res >> 1) : (res >> 1));
    longitude += deltaLon;
    
    float finalLat = latitude * 1E-5;
    float finalLon = longitude * 1E-5;
    
    CLLocationCoordinate2D coord = CLLocationCoordinate2DMake(finalLat, finalLon);
    coords[coordIdx++] = coord;
    
    if (coordIdx == count) {
        NSUInteger newCount = count + 10;
        coords = realloc(coords, newCount * sizeof(CLLocationCoordinate2D));
        count = newCount;
    }
}

MKPolyline *polyline = [MKPolyline polylineWithCoordinates:coords count:coordIdx];
free(coords);

return polyline;

}

About

RouteWithMultipleLocation is the route map view which follow multiple location

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published