从通过Web服务到达的位置创建多个折线的MKOverlay

时间:2013-02-01 05:21:33

标签: iphone ios mkmapview mapkit mkoverlay

我的应用程序是实时跟踪器,其中多个用户登录并通过将他们的坐标发送到我们的Web服务来更新他们的位置,然后每隔2分钟回拨一次,以显示我{{{上的所有用户1}}。

每次我通过MapView方法从网络服务获取用户的位置时,我正在解析,通过connectionDidFinishLoading创建polyline并将其添加到pointsArray

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]; } } } } ,这样我就可以更改它的颜色并在点击按钮时隐藏/显示它们(一个显示/隐藏我的轨道)和其他所有其他用户),这就是我为它添加标题的原因。 我现在可以看到我将polyline添加到同一个polyline,我认为这是错误的。但我不知道Web服务中会有多少用户,因此可以添加多个覆盖。

最初我认为我可以删除带有标题的特定overlay,但后来我意识到它会删除所有polyline属性更新。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

您可以收集与其他用户相关的轨道数组,并为当前用户保留单个轨道。如果在connectionDidFinishLoading函数的开头清理数组并将其填充到当前将叠加层添加到地图的位置,则将addOverlay移动到最后调用的新函数。

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

您也可以在按下按钮并且状态发生变化时调用此方法。