iPhone当前用户位置坐标显示为(0,0)

时间:2009-09-19 20:50:19

标签: iphone mapkit coordinates

我正在尝试使用此viewDidLoad方法获取用户当前的纬度和经度。生成的映射正确指示当前位置,但NSLog始终显示:

2009-09-19 16:45:29.765 Mapper[671:207] user latitude = 0.000000
2009-09-19 16:45:29.772 Mapper[671:207] user longitude = 0.000000

任何人都知道我在这里缺少什么?在此先感谢您的帮助!

- (void)viewDidLoad {
    [super viewDidLoad];
    [mapView setMapType:MKMapTypeStandard];
    [mapView setZoomEnabled:YES];
    [mapView setScrollEnabled:YES];
    [mapView setShowsUserLocation:YES];

    CLLocation *userLoc = mapView.userLocation.location;
    CLLocationCoordinate2D userCoordinate = userLoc.coordinate;

    NSLog(@"user latitude = %f",userCoordinate.latitude);
    NSLog(@"user longitude = %f",userCoordinate.longitude);
}

8 个答案:

答案 0 :(得分:9)

据我所知,在实际显示之前,地图不会尝试获取用户位置。对此的一个很好的测试是,你什么时候得到对话框,询问你是否可以让应用程序获得用户位置?根据我的经验,只有在地图显示在屏幕上之后才会出现。

如果您必须在启动时拥有位置,解决此问题的最佳方法是实现经典的核心位置处理程序代码并从最初获取位置。一旦地图启动,您就可以停止从那里接收更新并从那里获得进一步的更改(尽管如果您需要不断更新,最好只保留标准的核心位置更新。如果您考虑它,当您有“显示用户”时位置“在地图中启用您的应用程序进一步使用核心位置基本上是免费的,因为无论如何GPS都将被启动。

答案 1 :(得分:4)

如果您尝试在viewDidLoad()方法中获取用户坐标,它将始终给出0,0结果,因为它尚未初始化。

您应该查看Apple网站上的“我在哪里”示例代码。它解释了你需要什么。 您需要使用CLLocationManager课程。您还需要方法

*-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation*

每次更新用户位置时,都会自动调用此方法。如果你使用模拟器,那么这个方法只会被调用一次,它将返回一些默认坐标。

希望它有所帮助。

答案 2 :(得分:2)

CLLocation上的文档中,如果水平精度或垂直精度为负,则表示无法找到值。我怀疑这就是这里发生的事情。请记住,如果您只看一次,它可能会在提高准确度结果之前为您提供近似的最后已知位置。

  

水平精度   坐标的纬度和   经度确定了中心   圆圈,此值表示   那个圆的半径。否定的   value表示坐标   纬度和经度无效。

答案 3 :(得分:1)

您应该从CoreLocation而不是MapKit获取坐标。 MapView将在实际获得当前位置后显示用户的位置。在确定位置之前,纬度和经度都设置为0.3

您应该创建一个CLLocationManager实例,设置委托。确定位置后,您将收到通知。

答案 4 :(得分:1)

正如Kendall所说,MKMapView在完成加载之前没有用户位置,并且viewDidLoad方法通常为时太早而无法请求。比使用CoreLocation更简单的方法是实现MKMapViewDelegate方法 -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation。它将立即为您提供用户的位置,而无需处理CLLocationManager。

答案 5 :(得分:0)

此答案解释了如何使用用户位置设置地图视图:

HowTo initialise MKMapView with a given user location?

答案 6 :(得分:0)

中试试
CLLocation *userLoc = mapView.userLocation.location;
CLLocationCoordinate2D userCoordinate = userLoc.coordinate;

NSLog(@"user latitude = %f",userCoordinate.latitude);
NSLog(@"user longitude = %f",userCoordinate.longitude);

ViewdidAppear:或者在延迟后调用执行seletor

答案 7 :(得分:-1)

将此添加到viewDidLoad部分

mapView.showsUserLocation = YES;