How to calculate distance from user location to annotation when user moves(用户移动时如何计算用户位置到注释的距离)
问题描述
我在 mapView 上有一个用户位置(蓝点)和注释.选择注释后,我将文本设置为 distLabel -到点 %4.0f m. 的距离.".用户移动时如何更新该文本标签?
I have an user location (blue dot) and annotations on mapView. When annotation is selected, I setting text to distLabel - "Distance to point %4.0f m.". How can I update that text label when user moves?
didSelectAnnotationView:
didSelectAnnotationView:
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
CLLocation *pinLocation =
[[CLLocation alloc] initWithLatitude:
[(MyAnnotation*)[view annotation] coordinate].latitude
longitude:
[(MyAnnotation*)[view annotation] coordinate].longitude];
CLLocation *userLocation =
[[CLLocation alloc] initWithLatitude:
self.mapView.userLocation.coordinate.latitude
longitude:
self.mapView.userLocation.coordinate.longitude];
CLLocationDistance distance = [pinLocation distanceFromLocation:userLocation];
[distLabel setText: [NSString stringWithFormat:@"Distance to point %4.0f m.",
distance]];
}
我知道有一个函数 didUpdateToLocation,但是如何将它与 didSelectAnnotationView 一起使用?
I know there is a function didUpdateToLocation, but how can I use it with didSelectAnnotationView?
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
//Did update to location
}
推荐答案
地图视图有一个 selectedAnnotations 属性,您可以在 didUpdateToLocation 方法中使用该属性来判断哪个注解获取距离.
The map view has a selectedAnnotations property that you can use in the didUpdateToLocation method to tell which annotation to get the distance from.
(顺便说一句,如果您使用地图视图的 userLocation,您可能希望使用地图视图的 didUpdateUserLocation 委托方法而不是 didUpdateToLocation 这是一个 CLLocationManager 委托方法.)
(By the way, if you are using the map view's userLocation, you might want to use the map view's didUpdateUserLocation delegate method instead of didUpdateToLocation which is a CLLocationManager delegate method.)
在委托方法中,您可以检查当前是否有任何选择的注解,如果有,则显示到该注解的距离(否则说未选择注解").
In the delegate method, you can check if there is any currently selected annotation and, if so, show the distance to that annotation (otherwise say "no annotation selected").
您可能希望编写一个可以从 didSelectAnnotationView 和 didUpdateUserLocation 调用的通用方法,以减少代码重复.
You might want to write a common method that can be called from both didSelectAnnotationView and didUpdateUserLocation to reduce code duplication.
例如:
-(void)updateDistanceToAnnotation:(id<MKAnnotation>)annotation
{
if (annotation == nil)
{
distLabel.text = @"No annotation selected";
return;
}
if (mapView.userLocation.location == nil)
{
distLabel.text = @"User location is unknown";
return;
}
CLLocation *pinLocation = [[CLLocation alloc]
initWithLatitude:annotation.coordinate.latitude
longitude:annotation.coordinate.longitude];
CLLocation *userLocation = [[CLLocation alloc]
initWithLatitude:mapView.userLocation.coordinate.latitude
longitude:mapView.userLocation.coordinate.longitude];
CLLocationDistance distance = [pinLocation distanceFromLocation:userLocation];
[distLabel setText: [NSString stringWithFormat:@"Distance to point %4.0f m.", distance]];
}
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
if (mapView.selectedAnnotations.count == 0)
//no annotation is currently selected
[self updateDistanceToAnnotation:nil];
else
//first object in array is currently selected annotation
[self updateDistanceToAnnotation:[mapView.selectedAnnotations objectAtIndex:0]];
}
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
[self updateDistanceToAnnotation:view.annotation];
}
这篇关于用户移动时如何计算用户位置到注释的距离的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:用户移动时如何计算用户位置到注释的距离
基础教程推荐
- 如何从 logcat 中删除旧数据? 2022-01-01
- libGDX 从精灵或纹理中获取像素颜色 2022-01-01
- Android:getLastKnownLocation(LocationManager.NETWORK_PROVIDER 2022-01-01
- 通过重定向链接在 Google Play 中打开应用 2022-01-01
- iPhone - 获取给定地点/时区的当前日期和时间并将其与同一地点的另一个日期/时间进行比较的正确方法 2022-01-01
- iOS4 创建后台定时器 2022-01-01
- NSString intValue 不能用于检索电话号码 2022-01-01
- Cocos2d iPhone 非矩形精灵触摸检测 2022-01-01
- navigator.geolocation.getCurrentPosition 在 Android 浏览器上 2022-01-01
- AdMob 广告未在模拟器中显示 2022-01-01
