Swift中如何根据路径与标记设置Google Map缩放级别以完整显示路径
解决Google Maps完整路径显示与自动缩放问题
我帮你搞定这个问题!你现在的问题是地图只聚焦单个位置,没把完整路径框进去对吧?这时候得先拿到路径的所有坐标点,算出它们的地理边界,再让相机适配这个边界就行。下面是具体的修改方案:
核心思路
- 从Directions API获取路径的编码字符串,解码成
GMSPath对象 - 遍历路径的所有坐标点,构建包含整个路径的
GMSCoordinateBounds(地理边界) - 使用
GMSCameraUpdate.fit()方法,让地图自动调整缩放级别和中心点,确保完整路径显示在视图内
修改后的完整代码示例
func showingPathFromPickupLocToDropLoc(dropLat: Double, dropLong: Double) { // 替换成你的取货点坐标 let pickupLat = 你的取货点纬度 let pickupLong = 你的取货点经度 let origin = "\(pickupLat),\(pickupLong)" let destination = "\(dropLat),\(dropLong)" // 调用Google Directions API获取路径数据 let apiKey = "你的Google Maps API密钥" let urlString = "https://maps.googleapis.com/maps/api/directions/json?origin=\(origin)&destination=\(destination)&key=\(apiKey)" guard let url = URL(string: urlString) else { print("无效的API请求URL") return } URLSession.shared.dataTask(with: url) { [weak self] data, response, error in guard let self = self else { return } guard let data = data, error == nil else { print("路径请求失败:\(error?.localizedDescription ?? "未知错误")") return } do { let jsonResponse = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any] // 解析路径编码字符串 guard let routes = jsonResponse?["routes"] as? [[String: Any]], let firstRoute = routes.first, let overviewPolyline = firstRoute["overview_polyline"] as? [String: Any], let encodedPath = overviewPolyline["points"] as? String else { print("无法解析路径数据") return } // 解码路径为GMSPath对象 guard let path = GMSPath(fromEncodedPath: encodedPath) else { print("路径解码失败") return } DispatchQueue.main.async { // 绘制路径到地图 let polyline = GMSPolyline(path: path) polyline.strokeWidth = 5.0 // 设置路径宽度 polyline.strokeColor = .systemBlue // 设置路径颜色 polyline.map = self.mapView // 计算路径的地理边界 var pathBounds = GMSCoordinateBounds() for index in 0..<path.count() { let coordinate = path.coordinate(at: index) pathBounds = pathBounds.includingCoordinate(coordinate) } // 调整相机适配路径边界,设置padding避免路径贴边(根据你的UI布局调整数值) let edgeInsets = UIEdgeInsets(top: 80, left: 40, bottom: 80, right: 40) let cameraUpdate = GMSCameraUpdate.fit(pathBounds, with: edgeInsets) self.mapView.moveCamera(cameraUpdate) } } catch { print("JSON解析失败:\(error.localizedDescription)") } }.resume() }
关键细节说明
- 主线程更新地图:所有地图UI操作必须在主线程执行,所以用
DispatchQueue.main.async包裹 - 边界计算:通过遍历路径的每个坐标点,把所有点都包含进
GMSCoordinateBounds,这样就能确定路径的整体范围 - Padding设置:
UIEdgeInsets的数值可以根据你的页面布局调整,比如顶部有导航栏就加大top值,避免路径被UI元素遮挡 - API密钥:记得替换成你自己的Google Maps API密钥,并且确保已经启用了Directions API权限
内容的提问来源于stack exchange,提问作者Bhanuteja
相关产品推荐
相关产品推荐

