首页 文章

无法在Google Map 中使用iOS绘制完整的折线

提问于
浏览
0

我想在iOS上的谷歌 Map 中的两个地方之间创建路径 . 我可以使用以下代码在两个地方之间绘制路径 . 在这段代码中我使用谷歌 Map 键和放置键 . 当我接近点时,它即将到来,但是当我给v远点绘制一条路径时,根据谷歌 Map ,它并没有完美转向 .

#import "MPOWGetDirections.h"

@implementation MPOWGetDirections

-(void) setSearchModeOption:(MPGetDirectionOption)option
    {
        searchModeOption = option;
        NSLog(@"option setted: %i",option);
    }

-(int) requestDirecionsAndshowOnMap:(GMSMapView *)aMapView
    {
        NSArray* mode = [[NSArray alloc]initWithObjects:@"transit",@"bicycling",@"walking",@"driving", nil];
        NSString *depart = [[NSString alloc] initWithFormat:@""];
        NSString *origin = [[NSString alloc] initWithFormat:@""];
        NSString *destination = [[NSString alloc] initWithFormat:@""];



    //================== set Langauge ==========================

        if (self.setLanguage)

            self.setLanguage=[NSString stringWithFormat:@"language=%@",self.setLanguage];
        else
            self.setLanguage=@"language=en";


   //================== set Search Mode ==========================

        if (searchModeOption==0)
            {
                if (self.departDate==nil)
                {
                    self.departDate=[NSDate date];
                }

                depart=[NSString stringWithFormat:@"&departure_time=%i",(int)[self.departDate timeIntervalSince1970]];
            }

   //================== set Origian ==========================

        if (self.origin)
            {
                origin = [NSString stringWithFormat:@"origin=%@",self.origin];
            }
        else if (self.originCoordinate.latitude && self.originCoordinate.longitude)
            {
                origin = [NSString stringWithFormat:@"origin=%f,%f",self.originCoordinate.latitude,self.originCoordinate.longitude];
            }
        else
            {
                NSLog(@"No origin setted");
                return -1;
            }

   //================== set Destination ==========================

        if (self.destination)
            {
                destination=[NSString stringWithFormat:@"destination=%@",self.destination];
            }
        else if (self.destinationCoordinate.latitude && self.destinationCoordinate.longitude)
            {
                destination=[NSString stringWithFormat:@"destination=%f,%f",self.destinationCoordinate.latitude,self.destinationCoordinate.longitude];
            }
        else
            {
                NSLog(@"No destination setted");
                return -1;
            }


    //================== set Full Url and Request ==========================



    NSString* URLforRequest=[[NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/directions/json?%@&%@&sensor=false&%@&alternative=true&mode=%@%@",origin,destination,self.setLanguage,[mode objectAtIndex:searchModeOption],depart] stringByAddingPercentEscapesUsingEncoding: NSASCIIStringEncoding];

        NSLog(@"%@",URLforRequest);




        NSURLRequest *requests = [NSURLRequest requestWithURL:[NSURL URLWithString:URLforRequest]];



        [NSURLConnection sendAsynchronousRequest:requests queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
         {

            if (error==nil && data)
                {
                    // NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);

                    directions = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];


                    if (error)
                        {
                            NSLog(@"%@",error);
                        }

                    NSString* status=[directions objectForKey:@"status"];
                    NSLog(@"Status: %@", status);

                    if ([status isEqualToString:@"OK"])
                        {
                            [self decodeResult];

                            if (aMapView)
                            [self showOnMap:aMapView];
                        }
                }
            else
                NSLog(@"%@",error);


            [[NSNotificationCenter defaultCenter] postNotificationName:@"Request Done" object:nil];


        }];


    return 0;
}

-(void) decodeResult
    {

    self.destination=[[[[[directions objectForKey:@"routes"] objectAtIndex:0] objectForKey:@"legs"] objectAtIndex:0] objectForKey:@"end_address"];

    self.distance=[[[[[[[directions objectForKey:@"routes"] objectAtIndex:0] objectForKey:@"legs"] objectAtIndex:0] objectForKey:@"distance"] objectForKey:@"text"] doubleValue];

    self.duration=[[[[[[directions objectForKey:@"routes"] objectAtIndex:0] objectForKey:@"legs"] objectAtIndex:0] objectForKey:@"duration"] objectForKey:@"text"];

    //Get Array of Instructions

    self.instrunctions=[[NSMutableArray alloc] init];

    for (int n=0; n<[[[[[[directions objectForKey:@"routes"] objectAtIndex:0] objectForKey:@"legs"] objectAtIndex:0] objectForKey:@"steps"]count]; n++) {
        [self.instrunctions addObject:[[[[[[[directions objectForKey:@"routes"] objectAtIndex:0] objectForKey:@"legs"] objectAtIndex:0] objectForKey:@"steps"] objectAtIndex:n] objectForKey:@"html_instructions"]];
    }

    //Get Overview Polyline ====  Path=====

    NSString *polystring=[[[[directions objectForKey:@"routes"] objectAtIndex:0] objectForKey:@"overview_polyline"]  objectForKey:@"points"];
    NSMutableArray* decodedpolystring=[self decodePolyLine:polystring];

    int numberOfCC=[decodedpolystring count];

    GMSMutablePath *path = [GMSMutablePath path];

    for (int index = 0; index < numberOfCC; index++)
        {
            CLLocation *location = [decodedpolystring objectAtIndex:index];
            CLLocationCoordinate2D coordinate = location.coordinate;
            [path addLatitude:coordinate.latitude longitude:coordinate.longitude];
        }




   self.overviewPolilyne= [GMSPolyline polylineWithPath:path];

    //Get Coordinates of origin and destination to be displayed on a map

    float lat=[[[[[[[directions objectForKey:@"routes"] objectAtIndex:0] objectForKey:@"legs"]objectAtIndex:0] objectForKey:@"end_location"] objectForKey:@"lat"] floatValue];

    float lng=[[[[[[[directions objectForKey:@"routes"] objectAtIndex:0] objectForKey:@"legs"]objectAtIndex:0] objectForKey:@"end_location"] objectForKey:@"lng"] floatValue];


    CLLocationCoordinate2D tmp;
    tmp.latitude=lat;
    tmp.longitude=lng;
    self.destinationCoordinate=tmp;


     lat=[[[[[[[directions objectForKey:@"routes"] objectAtIndex:0] objectForKey:@"legs"]objectAtIndex:0] objectForKey:@"start_location"] objectForKey:@"lat"] floatValue];
     lng=[[[[[[[directions objectForKey:@"routes"] objectAtIndex:0] objectForKey:@"legs"]objectAtIndex:0] objectForKey:@"start_location"] objectForKey:@"lng"] floatValue];


    tmp.latitude=lat;
    tmp.longitude=lng;
    self.originCoordinate=tmp;

}



-(NSMutableArray *)decodePolyLine:(NSString *)encodedStr
 {
    NSMutableString *encoded = [[NSMutableString alloc] initWithCapacity:[encodedStr length]];
    [encoded appendString:encodedStr];
    [encoded replaceOccurrencesOfString:@"\\\\" withString:@"\\"
                                options:NSLiteralSearch
                                  range:NSMakeRange(0, [encoded length])];
    NSInteger len = [encoded length];
    NSInteger index = 0;
    NSMutableArray *array = [[NSMutableArray alloc] init];
    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];
        NSNumber *longitude = [[NSNumber alloc] initWithFloat:lng * 1e-5];

        CLLocation *location = [[CLLocation alloc] initWithLatitude:[latitude floatValue] longitude:[longitude floatValue]];
        [array addObject:location];
    }

    return array;
}

-(void)showOnMap:(GMSMapView *)aMapView{
    GMSPolyline *polyline =self.overviewPolilyne;
    polyline.strokeColor = [UIColor blueColor];
    polyline.strokeWidth = 2.f;
    polyline.geodesic = YES;
    polyline.map = aMapView;


}

@end
`

谁知道我在做什么错误?

2 回答

  • 1

    如果您使用的是Google Map ,我会更喜欢这种方式 .

    GMSPolyline *polyPath = [GMSPolyline polylineWithPath:[GMSPath pathFromEncodedPath:encodedPath]];
    

    以下是完整的代码段 .

    -(void)drawPathFrom:(CLLocation*)source toDestination:(CLLocation*)destination{
    
        NSString *baseUrl = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/directions/json?origin=%f,%f&destination=%f,%f&sensor=true", source.coordinate.latitude,  source.coordinate.longitude, destination.coordinate.latitude,  destination.coordinate.longitude];
    
        NSURL *url = [NSURL URLWithString:[baseUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
        NSLog(@"Url: %@", url);
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
            if(!connectionError){
                NSDictionary *result        = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
                NSArray *routes             = [result objectForKey:@"routes"];
                NSDictionary *firstRoute    = [routes objectAtIndex:0];
                NSString *encodedPath       = [firstRoute[@"overview_polyline"] objectForKey:@"points"];
    
                GMSPolyline *polyPath       = [GMSPolyline polylineWithPath:[GMSPath pathFromEncodedPath:encodedPath]];
                polyPath.strokeColor        = [UIColor redColor];
                polyPath.strokeWidth        = 3.5f;
                polyPath.map                = _mapView;
            }
        }];
    
    }
    
  • 0

    如果要绘制两条路径BTW两个地方使用此方法 . 其演示 swift 方法找到两个地方的溃败 .

    //MARK: API CALL
    func GetRoughtofTwoLocation(){
        let originString: String = "\(23.5800),\(72.5853)"
        let destinationString: String = "\(24.5836),\(72.5853)"
        let directionsAPI: String = "https://maps.googleapis.com/maps/api/directions/json?"
        let directionsUrlString: String = "\(directionsAPI)&origin=\(originString)&destination=\(destinationString)&mode=driving"
    
        APICall().callApiUsingWithFixURLGET(directionsUrlString, withLoader: true) { (responceData) -> Void in
            let json = responceData as! NSDictionary
            let routesArray: [AnyObject] = (json["routes"] as! [AnyObject])
            var polyline: GMSPolyline? = nil
            if routesArray.count > 0 {
                let routeDict: [NSObject : AnyObject] = routesArray[0] as! [NSObject : AnyObject]
                var routeOverviewPolyline: [NSObject : AnyObject] = (routeDict["overview_polyline"] as! [NSObject : AnyObject])
                let points: String = (routeOverviewPolyline["points"] as! String)
                let path: GMSPath = GMSPath(fromEncodedPath: points)!
                polyline = GMSPolyline(path: path)
                polyline!.strokeWidth = 2.0
                polyline!.map = self.mapView
            }
    
        }
    }
    

相关问题