2015-04-23 1 views
0

Я пытаюсь построить путь пользователя от одной точки к другой после того, как он начнет свое путешествие. Я использую карты Google iOS SDK и GMSPolyLine для построения пути после того, как пользователь начнет свое путешествие.Отслеживание пути пользователя в Google maps iOS SDK

Am отслеживание поездки с использованием locationManager:didUpdateLocation и построение линии после того, как пользователь обновит свое местоположение. Не удается правильно отобразить пути, как это происходит на картах Google, когда мы ищем пути от одной точки к другой. Я добавил скриншоты для разницы.

Мое приложение: https://www.dropbox.com/s/h1wjedgcszc685g/IMG_6555.png?dl=0

Выше скриншот моего приложения, и вы можете отметить, что витки не нанесены правильно

Выход требуется: https://www.dropbox.com/s/poqaeadh1g93h6u/IMG_6648.png?dl=0

Может кто-нибудь мне точку по направлению к Лучшая практика, чтобы построить опрятный путь, похожий на карты Google?

ответ

0

Это происходит из-за того, что ваше местоположение не обновляется непрерывно, и когда оно обновляет полилинию, это прямая линия между двумя точками, поэтому вам нужно подумать, когда вы получите следующее местоположение, которое вы назвали this api.

Когда вы вызываете этот api, вы получаете массив маршрутов между двумя точками, которые вы передали, и получите лучший маршрут (возможно первый маршрут). Из этого словаря маршрута извлеките объект overview_polyline. overview_polyline объект - декодированный массив широты и долготы точки местоположения между двумя точками.

при преобразовании его с помощью следующих методов, то у вас есть точные полилинии, которые вы хотите

Есть два способа расшифровывают ломаная

Первый метод

#pragma mark 
#pragma mark - decode polyline 
// these function is given by client 
-(void) decodePoly:(NSString *)encoded Color:(UIColor *)color 
{ 
    GMSMutablePath *path = [[GMSMutablePath alloc] init]; 
    // NSString *[email protected]"g|vfEmo{[email protected]@[email protected]@[email protected][email protected]@[email protected]][email protected]^[email protected]@"; 

    NSUInteger index = 0, len = encoded.length; 
    int lat = 0, lng = 0; 
    while (index < (len - 2)) { 
     int b, shift = 0, result = 0; 
     do { 
      //   b = encoded.charAt(index++) - 63; 
      b = [encoded characterAtIndex:index++] - 63; 
      result |= (b & 0x1f) << shift; 
      shift += 5; 
     } while (b >= 0x20); 
     int dlat = ((result & 1) != 0 ? ~(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); 
     int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); 
     lng += dlng; 
     CLLocation *loc = [[CLLocation alloc] initWithLatitude:((double) lat/1E5) longitude:((double) lng/1E5)]; 
     [path addCoordinate:loc.coordinate]; 
    } 
    GMSPolyline *polyline = [GMSPolyline polylineWithPath:path]; 
    // Add the polyline to the map. 
    polyline.strokeColor = color; 
    polyline.strokeWidth = 5.0f; 
    polyline.map = [self getGoogleMap]; 
} 

Второй методы

GMSPolyline *polyline =[GMSPolyline polylineWithPath:[GMSPath pathFromEncodedPath:"your encoded string"]]; 
     // Add the polyline to the map. 
     polyline.strokeColor = color; 
     polyline.strokeWidth = 5.0f; 
     polyline.map = [self getGoogleMap]; 

Это может помочь вам.

+1

В некоторых случаях приложение разбилось на decodePolyLine метод на characterAtIndex *** Завершение приложения из-за неперехваченного исключения «NSRangeException», причина: '- [__ NSCFString characterAtIndex:]: диапазон или индекс за пределами границ' if in while loop of decodePolyLine method i меняет время (индекс

+0

@amitgupta благодарю вас за это предложение. Я обновляю свой ответ. –

+1

Второй метод работает нормально, но в некоторых случаях один из них сбой, поэтому вы не можете изменить этот цикл while, потому что в некоторых случаях в работе для len-1, len-2 на основе другого -2-адреса. Я предлагаю использовать второй метод вместо первого, чтобы избежать сбоя. @chirag shah –