MapKit如何获取地图滚动后可视区域边界的经纬度坐标
问题描述
我需要在两个坐标划定的边界范围内显示地图,为此编写了如下实现代码:
private func showMapWithinBounds() { let point1 = MKMapPoint(viewModel.boundsStart.location.coordinate) let point2 = MKMapPoint(viewModel.boundsEnd.location.coordinate) let mapRect = MKMapRect(x: fmin(point1.x, point2.x), y: fmin(point1.y, point2.y), width: fabs(point1.x - point2.x), height: fabs(point1.y-point2.y)) mapView.setVisibleMapRect(mapRect, animated: true) }
当用户滚动地图时,当前显示区域的边界经纬度会发生变化。需求是在滚动结束后获取新边界两个对角位置的经纬度,对应附图中标注的位置。
实现方法
通过MKMapViewDelegate的区域变更回调,在滚动结束后从当前可见地图矩形中直接提取角点,转换为经纬度即可,步骤如下:
- 设置地图代理
在页面加载阶段为mapView绑定代理:override func viewDidLoad() { super.viewDidLoad() mapView.delegate = self } - 监听滚动结束事件
实现regionDidChangeAnimated代理方法,这个方法会在用户滚动、缩放地图操作结束后触发:extension YourViewController: MKMapViewDelegate { func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) { getCurrentBounds(from: mapView) } } - 提取对角点经纬度
从mapView.visibleMapRect属性中取矩形的最小、最大x/y值构造角点,转换为经纬度坐标:private func getCurrentBounds(from mapView: MKMapView) { let visibleRect = mapView.visibleMapRect // 左上角对角点 let northWestPoint = MKMapPoint(x: visibleRect.minX, y: visibleRect.minY) let northWestCoord = northWestPoint.coordinate // 右下角对角点 let southEastPoint = MKMapPoint(x: visibleRect.maxX, y: visibleRect.maxY) let southEastCoord = southEastPoint.coordinate // 此处即可拿到两个对角点的经纬度,对应附图中标注的位置 print("西北对角:纬度\(northWestCoord.latitude),经度\(northWestCoord.longitude)") print("东南对角:纬度\(southEastCoord.latitude),经度\(southEastCoord.longitude)") }
注意:如果调用
setVisibleMapRect时传入了自定义edgePadding参数,计算边界时需要对应减去内边距的偏移量,否则拿到的坐标会和实际显示边界存在误差。未设置边距的场景下上述代码可以直接拿到准确结果。
内容的提问来源于stack exchange,提问作者Sulaiman Khan
相关产品推荐
相关产品推荐

