所以我试图在触摸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。如果我可以反转地理编码位置,请将引脚与地址一起丢弃。如果我无法反转地理位置的地理位置,则放下引脚,只显示地图标注中的纬度和经度。
它似乎不起作用。看起来即使我在某个位置触摸地图,反向地理编码使我的引脚转到反向地理编码可以找到位置的其他地方。这不是我想要的行为。我想放弃引脚,无论如何,如果我不能在标注中显示地址,只需显示lat / long。
如果我完全删除revseGeocodeLocation:pinLocation代码,并且只使用else块中的内容,那么我得到lat / long并且无论如何都会将引脚丢弃。反向地理编码器是否有理由阻止我将引脚掉落到我想要的位置?
作为旁注,任何人都可以确认我基于UITapGestureRecognizer计算CLLocationCoordinate2D的方式是否正确?
谢谢!
答案 0 :(得分:1)
如果您的反向地理编码工作正常,则引脚应指向正确的位置。 检查您是否获得正确的lat和long值。 如果您当前的实施不起作用,请尝试使用谷歌反向地理编码API。
这是可以帮助你的链接.. http://www.icodeblog.com/2009/12/22/introduction-to-mapkit-in-iphone-os-3-0-part-2/
答案 1 :(得分:1)
基于分接点的coordinate
计算看起来是正确的。
问题在于,当coordinate
进行反向地理编码时,返回的地标可能位于附近那些坐标和CLPlacemark
对象本身(topResult
)包含topResult.location.coordinate
中该位置的精确坐标(这是使用initWithPlacemark
创建时注释所使用的坐标)。
除非用户恰好在反向地理编码坐标上点击,否则地标将不会恰好在他们点击的位置。
由于您想要将针脚准确放置在用户点击的位置,而不管最近找到的地标,您可以做的是覆盖AddressAnnotation
使用地标初始化时使用的坐标。
对于示例,在调用initWithPlacemark
之后(假设该方法使用地标的位置设置注释的coordinate
属性),之后您可以覆盖它:
AddressAnnotation *anAddress = [[AddressAnnotation alloc] initWithPlacemark...
anAddress.coordinate = coordinate; // <-- replace with tapped coordinate
或者,您可以使用initWithCoordinate
代替,并使用title
中的信息手动设置topResult
等。
此外,如果找到的地标距离点按的坐标 x 超过某个距离,请考虑在title
/ {{1}前面添加前缀,例如“近” }向用户表明该引脚并非完全位于分接位置(例如“近埃菲尔铁塔”)。