GMSMapView坐标转iPhone屏幕点遇负值问题求助
解决MapView经纬度转屏幕坐标出现负值的问题
嘿,我来帮你分析下这个问题——你遇到的负值情况,大概率是因为你要转换的经纬度对应的位置不在当前MapView的可视范围内。pointForCoordinate:方法返回的是相对于MapView本身的坐标,如果这个点不在地图当前显示的区域里,就会出现x或y为负(或者超出MapView宽高)的情况。
给你几个具体的解决步骤:
- 先确认坐标的有效性:你提供的(22.81106, 70.86253),先手动在MapView里定位到这个位置,看看能不能正常显示,排除坐标输入错误的可能。
- 转换前检查坐标是否在可视区域:在转换前先判断这个点是不是在当前地图的可见范围内,代码可以这么写:
MKMapRect visibleMapRect = self.mapView.visibleMapRect; MKMapPoint markerMapPoint = MKMapPointForCoordinate(marker.position); BOOL isVisible = MKMapRectContainsPoint(visibleMapRect, markerMapPoint); if (isVisible) { CGPoint pointInMapView = [self.mapView.projection pointForCoordinate:marker.position]; // 这里处理正常的坐标 } else { // 如果不在可视区域,要么自动把地图移到这个点,要么提示用户 [self.mapView setCenterCoordinate:marker.position animated:YES]; // 可以在地图移动完成后再转换,比如用代理方法mapView:regionDidChangeAnimated: } - 注意坐标的参照系:
pointForCoordinate:返回的是相对于MapView的坐标,如果你需要的是整个屏幕的坐标,得再转一层:CGPoint pointInMapView = [self.mapView.projection pointForCoordinate:marker.position]; CGPoint screenPoint = [self.mapView convertPoint:pointInMapView toView:nil]; // 这个screenPoint才是相对于屏幕的坐标 - 确保在正确的时机获取坐标:如果你在
viewDidLoad里执行转换,此时MapView的布局可能还没完成,获取到的frame和实际显示的不一致,建议把转换逻辑放到viewDidLayoutSubviews里,这时候视图布局已经确定了:- (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; // 在这里执行坐标转换 CGPoint point = [self.mapView.projection pointForCoordinate:marker.position]; NSLog(@"转换后的坐标:%@", NSStringFromCGPoint(point)); }
如果排查完这些,坐标确实在可视范围内但还是出现负值,那可能要检查下MapView的基础配置,但这种情况比较少见,先按上面的步骤来试试吧。
内容的提问来源于stack exchange,提问作者Nimisha Patel
相关产品推荐
相关产品推荐

