Create multiple MKOverlays of polyline from locations coming via web-service

点点圈 提交于 2019-12-08 08:32:34

问题


My app is real-time tracker, where multiple users are logged in and updating their location by sending their co-ordinates to our web service which is then called back let's after every 2 minutes to show all the users on my MapView.

Every time I get the locations of users from web service in connectionDidFinishLoading method, I am parsing, creating polyline through pointsArray and adding them to overlay:

-(void) connectionDidFinishLoading: (NSURLConnection *) connection
{
userLatitudeArray = [[NSMutableArray alloc]init];
userLongitudeArray = [[NSMutableArray alloc]init];
userIdArray = [[NSMutableArray alloc]init];
userNameArray = [[NSMutableArray alloc]init];
userProfilePicArray = [[NSMutableArray alloc]init];
profilePicURLStringArray = [[NSMutableArray alloc]init];

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

NSArray *trackingDict = [NSJSONSerialization JSONObjectWithData:empJsonData options:kNilOptions error:nil];

if ([trackingDict count] >= 2) {
    for (trackUsersCount = 0; trackUsersCount< trackingDict.count; trackUsersCount++) {
        NSLog(@"trackUsersCount %i", trackUsersCount);

        NSMutableArray *latlongArray = [[NSMutableArray alloc]init];
        latlongArray = [[trackingDict objectAtIndex:trackUsersCount]objectForKey:@"latlong"];

        [userLongitudeArray removeAllObjects];
        [userLatitudeArray removeAllObjects];

        for (int i = 0; i<latlongArray.count; i++) {
            [userLatitudeArray addObject:[[latlongArray objectAtIndex:i]objectForKey:@"lat"]];
            [userLongitudeArray addObject:[[latlongArray objectAtIndex:i]objectForKey:@"long"]];

        }

        NSString *name = [[trackingDict objectAtIndex:trackUsersCount]objectForKey:@"user_firstName"];

        // ProfilePIC URL
        profilePicURLString = [[trackingDict objectAtIndex:trackUsersCount]objectForKey:@"user_profilePicture"];


        [userNameArray addObject:name];
        [profilePicURLStringArray addObject:profilePicURLString];

        int i;
        if (userLatitudeArray.count>1) {

            for (i = 0; i<userLatitudeArray.count; i++) {
                CLLocationCoordinate2D userLocation;
                userLocation.latitude = [[userLatitudeArray objectAtIndex:i]doubleValue];
                userLocation.longitude = [[userLongitudeArray objectAtIndex:i] doubleValue];
                MKMapPoint * pointsArray = malloc(sizeof(CLLocationCoordinate2D)*userLongitudeArray.count);
                pointsArray[i] = MKMapPointForCoordinate(userLocation);
                polyline = [MKPolyline polylineWithPoints:pointsArray count:i];
                free(pointsArray);    
            }
            polyline.title = name;
            [mapView addOverlay:polyline];
        }
   }
  }
}

What I want to do is to have control on each polyline created for each user, so I can change the color of it and hide/show them on click of a button (one to show/hide my track and the other for all other users), this is why I am adding title to it. I can see now that I am adding polyline to the same overlay, which is wrong I believe. But I don't know how many users will be there in web-service so can add multiple overlays of them.

Initially I thought I am able to remove a particular polyline with title but then I realised it is removing all as polyline.title property gets updated.

Any help would be much appreciated!


回答1:


You could collect an array of those tracks that relate to other users, and keep a single track for the current user. If you clean the array at the start of the connectionDidFinishLoading function and populate it where you are currently adding the overlays to the map, then you move the addOverlay to a new function that you call at the end.

- (void) resetMap
{
  if (showOtherTracks)
  {
      [mapView addOverlays:otherUserTracks];
  } else {
      [mapView removeOverlays:otherUserTracks];
  }
  if (showMyTrack)
  {
      [mapView addOverlay:myTrack];
  } else {
      [mapView removeOverlay:myTrack];
  }
}

You can also call this when ever the button is pressed and the state changes.



来源:https://stackoverflow.com/questions/14640256/create-multiple-mkoverlays-of-polyline-from-locations-coming-via-web-service

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!