首次加载应用程序时,MKMapview ios不显示当前位置

首次加载应用程序时,MKMapview ios不显示当前位置,ios,location,mkmapview,coordinates,Ios,Location,Mkmapview,Coordinates,我的应用程序上有一个MKMapView。这是iOS6 -(void)viewDidLoad { ..... locationManager = [[CLLocationManager alloc] init]; locationManager.delegate = self; [locationManager setDesiredAccuracy:kCLLocationAccuracyBestForNavigation]; [locationManager

我的应用程序上有一个
MKMapView
。这是iOS6

-(void)viewDidLoad
{
    .....
    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    [locationManager setDesiredAccuracy:kCLLocationAccuracyBestForNavigation];
    [locationManager setDistanceFilter:kCLDistanceFilterNone];
    [locationManager startUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    NSLog(@"Update locations is hit");
    NSLog(@"379 the locations count is %d",locations.count);

    CLLocation *obj = [locations lastObject];
    NSLog(@"the lat is %f", obj.coordinate.latitude);
    NSLog(@"the long is %f", obj.coordinate.longitude);
    NSLog(@"the horizontal accuracy is %f",obj.horizontalAccuracy);
    NSLog(@"the vertical accuracty is %f",obj.verticalAccuracy);
    if (obj.coordinate.latitude != 0 && obj.coordinate.longitude != 0)
    {
        CLLocationCoordinate2D currrentCoordinates ;
        currrentCoordinates.latitude = obj.coordinate.latitude;
        currrentCoordinates.longitude = obj.coordinate.longitude;
    }
    ....more computation
    [locationManager stopUpdatingLocation];
}
当我第一次加载应用程序时,我的位置显示得很遥远。有时几英里之外。我还有一个重置位置按钮,如果我点击该按钮,地图将显示正确的位置。这是我在“重置位置”按钮中所做的单击:

- (IBAction)btnResetLocationClick:(UIButton *)sender
{
    locationManager = [[CLLocationManager alloc]init];
    locationManager.delegate = self;
    [locationManager setDesiredAccuracy:kCLLocationAccuracyBestForNavigation];
    [locationManager setDistanceFilter:kCLDistanceFilterNone];
    [locationManager startUpdatingLocation];
}

那么,如何让应用程序在加载时获得正确的当前位置呢。是否有一种方法让应用程序告诉地图等待几毫秒,然后更新。或者其他想法?请让我知道。如果您需要更多信息,请询问。谢谢。

在你的应用程序中,你无法使iPhone中的GPS更精确,但你可以在继续之前检查结果是否准确。现在您只检查lat和long不是0,但是如果您检查
obj
的水平精度,那么您将知道位置信息何时足够好。在这之前,不要停止更新操作。

您可以做的是:

  • 不要自动关闭
    didUpdateLocations
    中的定位服务,而是
  • 只有当您对
    水平精度足够满意时,才关闭
    didUpdateLocations
    中的定位服务;及
  • 即使你没有达到预期的准确度,也要在一段时间后关闭定位服务
因此,
didUpdateLocations
可能看起来像:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation *location = [locations lastObject];

    // do whatever you want with the location

    // finally turn off location services if we're close enough
    //
    // I'm using 100m; maybe that's too far for you, but 5m is probably too small
    // as you frequently never get that accurate of a location

    if (location.horizontalAccuracy > 0 && location.horizontalAccuracy < 100)
        [locationManager stopUpdatingLocation];
}

原始答案:

我看不出你在哪里更新地图,使其位于你的位置附近。我希望看到这样的情况:

self.mapView.centerCoordinate = location.coordinate;
或者说:

MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(location.coordinate, 300, 300);
[self.mapView setRegion:region];
我还建议,与其立即关闭定位服务(因为前几个位置往往不那么准确),不如让它打开一点,让它磨练你的位置,直到
水平精度
垂直精度
在某个预定的限值内。看看那些对
didUpdateLocations
的一些调用的准确度数字,你就会明白我的意思了


我原本以为你得到了一个负的
水平精度
,在这一点上我建议实施,因为根据“负值表示位置的纬度和经度无效”。希望你得到一个描述问题所在的错误。即使您当前没有得到负的
水平精度
,您也可能希望实现此方法,以确保正确处理任何错误。

谢谢。我获取坐标并将它们传递给一个方法,在这个方法中我形成一个MKMapView并设置它的坐标。我还记录了垂直和水平精度,结果一致为-1和5。我正在调试,在didUpdateLocations中设置了一个断点,-1和5继续记录。两个精度都应该大于0吗?@Rob.我怎样才能使它们大于0。@Phanindar水平(横向和纵向精度)为负值?或者垂直(高度)是负数?你可能不在乎后者(虽然我不知道如果它不知道你在哪里,它是如何到达高度的),但前者是相当重要的。我猜你只是没有得到一个好的GPS信号(因此我建议你试着打开wifi,或者如果你打开了wifi,就把它关掉)。垂直精度是负的。水平精度是正的。总是5。所以我应该检查坐标>0和水平精度>0。“这样行吗?”法宁达说,“行。但回到你最初的问题,你想(a)打开定位服务;(b) 保持监视位置,直到获得足够低(但为正)
水平精度
;(c)有一个计时器,在一段时间后关闭定位服务,因为即使你没有理想的准确度,它也可能是准确的。请参阅我的最新答案。
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(location.coordinate, 300, 300);
[self.mapView setRegion:region];