2013-08-24 11 views
5

Ich baue gerade eine iOS-App und ich hoffe, eine Funktion zu implementieren, wo der Standort des Benutzers in einer Google Map-Ansicht angezeigt wird und wann Verschieben Sie eine Polyline-Show ist der Weg, der bisher von dem Benutzer gereist wurde. Dies muss offensichtlich in Echtzeit geschehen.So verfolgen Sie den Standort eines Benutzers und zeigen den zurückgelegten Weg mit Google Maps ios SDK

Bisher habe ich eine Google Maps-Ansicht initialisiert und kann den aktuellen Standort des Benutzers mit der Funktion observeValueForKeyPath anzeigen. Die Ansichts- und Standortmarkierung wird aktualisiert, wenn sich der Benutzer bewegt.

Ich dachte, der beste Weg wäre, ein GMSMutablePath-Objekt zu erstellen, das den aktuellen Standort des Benutzers jedes Mal hinzufügt, wenn die Kamera an der neuen Position aktualisiert wird, und dann eine Polylinie aus diesem Pfad erstellt. Der Code, den ich dafür verwendet habe, ist unten:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if ([keyPath isEqualToString:@"myLocation"] && [object isKindOfClass:[GMSMapView class]]) 
    { 
     [self.myMapView animateToCameraPosition:[GMSCameraPosition cameraWithLatitude:self.myMapView.myLocation.coordinate.latitude 
                       longitude:self.myMapView.myLocation.coordinate.longitude 
                         zoom:18]]; 


     [trackedPath addCoordinate:CLLocationCoordinate2DMake(self.myMapView.myLocation.coordinate.latitude, self.myMapView.myLocation.coordinate.longitude)]; 
     GMSPolyline *testPoly = [GMSPolyline polylineWithPath:trackedPath]; 
     testPoly.strokeWidth = 8; 
     testPoly.strokeColor = [UIColor redColor]; 
     testPoly.map = myMapView; 
    } 
} 

Dies erzeugt keine Polylinie auf der Karte in der Praxis so dass jede Hilfe/Beratung sehr geschätzt werden würde!

Antwort

6
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{ NSString *pointString=[NSString stringWithFormat:@"%f,%f",newLocation.coordinate.latitude,newLocation.coordinate.longitude]; 
    [self.points addObject:pointString]; 
GMSMutablePath *path = [GMSMutablePath path]; 
for (int i=0; i<self.points.count; i++) 
{   
    NSArray *latlongArray = [[self.points objectAtIndex:i]componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@","]]; 

[path addLatitude:[[latlongArray objectAtIndex:0] doubleValue] longitude:[[latlongArray objectAtIndex:1] doubleValue]]; 
} 

if (self.points.count>2) 
{ 
    GMSPolyline *polyline = [GMSPolyline polylineWithPath:path]; 
    polyline.strokeColor = [UIColor blueColor]; 
    polyline.strokeWidth = 5.f; 
    polyline.map = mapView_; 
    self.view = mapView_; 
}} 
+0

Was ist ein Punkt in Ihrem Code? –

+0

@sandeeptomar Punkt ist ein NSMutable Array. – ChenSmile

2

Wenn Sie zwei Pfad BTW zwei Ort zeichnen möchten, verwenden Sie diese Methode. seine Demo schnelle Methoden, um den Router von zwei Orten zu finden.

//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 
     } 

    } 
}