【问题标题】:Unable to draw a Full Fledged polyline in google Map With iOS无法在使用 iOS 的谷歌地图中绘制完整的折线
【发布时间】:2014-05-13 07:34:35
【问题描述】:

我正在尝试在 iOS 上的谷歌地图中的两个地方之间创建路径。我可以使用以下代码在两个地方之间绘制路径。在这段代码中,我使用的是谷歌地图键和位置键。当我在附近给出点时,时间就到了,但是当我给出 v 个远点来绘制路径时,根据谷歌地图,它并没有完美地转动。

#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
`

有人知道我在做什么错吗?

【问题讨论】:

标签: ios google-maps path google-maps-sdk-ios polyline


【解决方案1】:

如果您使用的是 GOOGLE 地图,我更喜欢这种直截了当的方式。

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

以下是完整的代码sn-p。

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

}

【讨论】:

    【解决方案2】:

    如果你想画两条路径顺便说一句两个地方使用这个方法。它的演示 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
            }
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 2018-03-06
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      相关资源
      最近更新 更多