2

所以我试图基于触摸 MKMapView 来获得 CLLocation。然后,我尝试对位置进行反向地理编码。

    if (gestureRecognizer.state == UIGestureRecognizerStateEnded) {
        // Not sure if this is the right method to get the location or not
        CLLocationCoordinate2D coordinate = [self.mapView convertPoint:[gestureRecognizer locationInView:self.mapView] toCoordinateFromView:self.mapView];

        CLLocation *pinLocation = [[CLLocation alloc] initWithLatitude:coordinate.latitude longitude:coordinate.longitude];
        CLGeocoder *geocoder = [[CLGeocoder alloc] init];

        [geocoder reverseGeocodeLocation:pinLocation completionHandler:^(NSArray *placemarks, NSError *error) {
            if (placemarks && placemarks.count > 0) {
                CLPlacemark *topResult = [placemarks objectAtIndex:0];
                AddressAnnotation *anAddress = [[AddressAnnotation alloc] initWithPlacemark:topResult];     

                [self.mapView addAnnotation:anAddress];
                [self.addressesArray addObject:anAddress];
            }
            else {
                AddressAnnotation *anAddress = [[AddressAnnotation alloc] initWithCoordinate:coordinate];
                [self.mapView addAnnotation:anAddress];
                [self.addressesArray addObject:anAddress];
            }
        }];

使用我的 if/else 语句,我想要做的是触摸地图并获取 CLLocation。如果我可以对位置进行反向地理编码,请删除带有地址的图钉。如果我无法对位置进行反向地理编码,请放下图钉并在地图标注中显示纬度和经度。

它似乎不起作用。似乎即使我在某个位置触摸地图,反向地理编码也会使我的 pin 转到反向地理编码可以找到该位置的其他地方。这不是我想要的行为。无论如何我都想放下别针,如果我不能在标注中显示地址,只需显示纬度/经度。

如果我完全删除 revseGeocodeLocation:pinLocation 代码,并且只使用 else 块中的内容,那么我会得到 lat/long 并且无论如何都会将 pin 丢弃在那里。反向地理编码器阻止我将大头针放到我想要的地方有什么原因吗?

作为旁注,任何人都可以确认我根据 UITapGestureRecognizer 计算 CLLocationCoordinate2D 的方式是否正确?

谢谢!

4

2 回答 2

1

如果您的反向地理编码工作正常,则引脚应指向正确的位置。检查您是否获得正确的纬度和经度值。如果您当前的实现不起作用,请尝试使用 google 反向地理编码 API。

这是可以帮助您的链接.. http://www.icodeblog.com/2009/12/22/introduction-to-mapkit-in-iphone-os-3-0-part-2/

于 2012-10-16T05:27:58.183 回答
1

coordinate基于分接点的计算看起来是正确的。

问题在于,当coordinate进行反向地理编码时,返回的地标可能位于这些坐标附近CLPlacemark的某个位置,并且对象本身 ( topResult) 包含该位置的确切坐标topResult.location.coordinate(这是使用 创建注释时使用的坐标initWithPlacemark)。

除非用户碰巧恰好点击了可反向地理编码的坐标,否则地标不会准确地出现在他们点击的位置。

由于您希望将引脚准确放置在用户点击的位置,而不考虑最近找到的地标,因此您可以做的是覆盖AddressAnnotation使用地标初始化时使用的坐标。

例如,在调用(假设该方法使用地标的位置设置注释的属性)之后,您可以随后覆盖它:initWithPlacemarkcoordinate

AddressAnnotation *anAddress = [[AddressAnnotation alloc] initWithPlacemark...
anAddress.coordinate = coordinate; // <-- replace with tapped coordinate

或者,您可以initWithCoordinate改用并title使用来自topResult.

此外,如果找到的地标与点击坐标的距离超过xtitle ,请考虑在/前面添加前缀,例如“Near”,subtitle以向用户表明该引脚不完全位于点击位置(例如“埃菲尔铁塔附近”)。

于 2012-10-16T13:25:35.593 回答