1

とユーザーが行きたいpolyline間に作成するナビゲーション iPhone アプリを作成しています。user locationdestination

を作成できますpolyline。しかし、私がする必要があるのは、ユーザーがポリラインを進むにつれて、ポリラインが徐々に減少し、ユーザーが軌道に乗っていることを示す必要があることです。また、ユーザーがパスから外れたかどうかを検出する必要もあります。

たとえば、ユーザーが左に行かなければならないのにそうしない場合、どうすればそれを検出できますか?

どんな助けでも大歓迎です。ありがとう。

編集 :

次のコードを使用してポリラインを描画しました

-(void)drawPolyline{
    //Draw polyline via the selected route

    NSMutableArray *polys = [NSMutableArray array];
    GMSMutablePath *path = [GMSMutablePath path];

    NSDictionary *route=[routes objectAtIndex:0];

    //self.strPolyPoints is a string
    self.strPolyPoints=[[route objectForKey:@"overview_polyline"] objectForKey:@"points"];
    NSArray *arrPoints=[self decodePolyLine];
    for(CLLocation *location in arrPoints){
        CLLocationCoordinate2D coordinate=location.coordinate;
        [path addCoordinate:coordinate];
    }

    _lengths = @[@([path lengthOfKind:kGMSLengthGeodesic] / 40)];
    GMSPolyline *polyline = [[GMSPolyline alloc] init];
    polyline.path = path;
    polyline.strokeColor = [UIColor blueColor];
    polyline.geodesic = NO;
    polyline.strokeWidth = 5;
    polyline.map = mapView_;
    [polys addObject:polyline];
    _polys = polys;
    [self tick];
}



- (void)tick {
    //Create steps for polyline(dotted polylines)
    for (GMSPolyline *poly in _polys) {
        poly.spans =
        GMSStyleSpans(poly.path, _styles, _lengths, kGMSLengthGeodesic, _pos);
    }
    _pos -= _step;

    //Animate the polyline like moving from source to destination
    if (kAnimate) {
        __weak id weakSelf = self;
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC / 5),
                       dispatch_get_main_queue(),
                       ^{ [weakSelf tick]; });
    }
}

-(NSMutableArray *)decodePolyLine {

    NSMutableString *encoded = [[NSMutableString alloc] initWithCapacity:[self.strPolyPoints length]];
    [encoded appendString:self.strPolyPoints];

    [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];
        printf("[%f,", [latitude doubleValue]);
        printf("%f]", [longitude doubleValue]);
        CLLocation *loc = [[CLLocation alloc] initWithLatitude:[latitude floatValue] longitude:[longitude floatValue]];
        [array addObject:loc];

    }
    return array;
}
4

1 に答える 1