1

ルートにウェイポイントがある場合、MapView でルートを表示するときに問題が発生します。私はDIRECTIONS GOOGLE APIを使用しています:

https://developers.google.com/maps/documentation/directions/

ルートは道路を使用して描かれていません。

何か助けはありますか?ありがとう!!

トラブル画像: ここに画像の説明を入力

ここに画像の説明を入力

コード:

reponse = [self getRouteFromGoogleApiWithPoints:arrayOfCoords andMode:@"driving" error:error];

if(reponse == nil)
{
   UIAlertView *succes= [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"txtError", nil) message:NSLocalizedString(@"ServerError", nil) delegate: self cancelButtonTitle: @"OK" otherButtonTitles: nil];
        [succes show];
}
else
{
        NSArray *routes = [reponse objectForKey:@"routes"];
        NSDictionary *route = [routes objectAtIndex:0];
        NSDictionary *polylineOverview = [route objectForKey:@"overview_polyline"];

        NSString *polylinePoints = [polylineOverview objectForKey:@"points"];
        NSArray *decodedPolyline = [self decodePolyLine:polylinePoints];

        CLLocationCoordinate2D coords[[decodedPolyline count]];
        int i=0;
        for(CLLocation* loc in decodedPolyline)
        {
            CLLocationCoordinate2D c;
            c.latitude = loc.coordinate.latitude;
            c.longitude = loc.coordinate.longitude;

            coords[i]=c;
            i++;

        }

        MKPolyline *line = [MKPolyline polylineWithCoordinates:(CLLocationCoordinate2D*)coords count:decodedPolyline.count];

        [mapview addOverlay:line];
        [mapview setNeedsDisplay];
    }
}
}

+ (NSMutableArray *)decodePolyLine: (NSString *)encoded {

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 *loc = [[CLLocation alloc] initWithLatitude:[latitude floatValue] longitude:[longitude floatValue]];
    [array addObject:loc];
}

return array;
}

+(NSDictionary*)getRouteFromGoogleApiWithPoints:(NSArray*)arrayOfPoints andMode:(NSString*)mode error:(NSError **)error
{
NSDictionary *result = nil;

NSString *waypoints = @"";

CLLocation* origin = [arrayOfPoints objectAtIndex:0];
CLLocation* destination = [arrayOfPoints objectAtIndex:arrayOfPoints.count - 1];

// Create the waypoints
for(int i = 1; i < arrayOfPoints.count - 2; i++)
{
    CLLocation* current = [arrayOfPoints objectAtIndex:i];
    waypoints = [waypoints stringByAppendingString:[NSString stringWithFormat:@"%f,%f%%7C",current.coordinate.latitude,current.coordinate.longitude]];
}

CLLocation* lastWaypoint = [arrayOfPoints objectAtIndex:arrayOfPoints.count - 2];
waypoints = [waypoints stringByAppendingString:[NSString stringWithFormat:@"%f,%f",lastWaypoint.coordinate.latitude,lastWaypoint.coordinate.longitude]];

NSString *urlString =[NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/directions/json?origin=%f,%f&destination=%f,%f&waypoints=%@&sensor=true&mode=%@",origin.coordinate.latitude,origin.coordinate.longitude,destination.coordinate.latitude,destination.coordinate.longitude,waypoints,mode];

NSDictionary* response = [self getDictionaryFromURLString:urlString withParameters:nil error:error];

if (response != nil)
{
    if ([[response objectForKey:@"status"] isEqualToString:@"OK"])
    {
        result = response;
        NSLog(@"%@",response);

    }
    else
    {
        if (error)
        {
            NSMutableDictionary* details = [NSMutableDictionary dictionary];
            [details setValue:[response objectForKey:@"status"] forKey:NSLocalizedDescriptionKey];
            *error = [[NSError alloc] initWithDomain:@"AppName" code:2 userInfo:details];
        }
    }
}
else
{
    if(error)
    {
        NSMutableDictionary* details = [NSMutableDictionary dictionary];
        [details setValue:NSLocalizedString(@"ErrorServidor", nil) forKey:NSLocalizedDescriptionKey];
        *error = [NSError errorWithDomain:@"AppName" code:1 userInfo:details];
        return nil;
    }
}

return result;
}
4

3 に答える 3

6

まず、Google の利用規約によると、他の人の地図でルートやデータを使用することは許可されていません。

第二に、人々が異なるデータを持っている、道路を異なる場所に配置する、道路を異なるセグメントに分割するなどの理由で、最初のものが部分的に課せられます。

マップに道順を表示したい場合は、別のソースを見つける必要があります。CloudMade API を検討する必要があるかもしれません。

于 2013-01-22T19:40:27.140 に答える
1

これで、 Google Maps SDK for iOS を使用できるようになりました。iOS6 で Google Directions API を表示する必要がある場合、これが唯一の有効なオプションです。

于 2013-04-29T07:12:59.973 に答える