基于Radius Google Maps iOS SDK更改相机缩放

基于Radius Google Maps iOS SDK更改相机缩放,ios,iphone,google-maps-sdk-ios,Ios,Iphone,Google Maps Sdk Ios,我正在开发一个基于当前位置周围半径显示特定标记的应用程序。半径在100-5000米之间。我使用UISlider更改半径,并重新绘制GMSCircle 我的问题是,我想根据滑块值更新相机缩放,但我不知道按哪个比例划分 这就是我在viewDidLoad方法中创建相机的方法,其中初始缩放值为15: GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:locationManager.location.coordinate.l

我正在开发一个基于当前位置周围半径显示特定标记的应用程序。半径在100-5000米之间。我使用
UISlider
更改半径,并重新绘制
GMSCircle

我的问题是,我想根据滑块值更新相机缩放,但我不知道按哪个比例划分

这就是我在
viewDidLoad
方法中创建相机的方法,其中初始缩放值为15:

GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:locationManager.location.coordinate.latitude longitude:locationManager.location.coordinate.longitude  zoom:15];
这是我正在进行的工作的截图

有人知道我应该使用什么比例来相应地移动缩放吗

非常感谢


Granit

您可以使用的
fitBounds
方法,传入一个
GMSCoordinateBounds
,该坐标是从圆的边缘计算出来的


基于,您可以使用
MKCoordinateRegionMakeWithDistance
将中心(纬度/经度)加半径(米)转换为
MKCoordinateRegion
,从而将米转换为以度为单位的跨度,因此,允许您计算用于创建
GMSCoordinateBounds
的坐标(以度为单位)

在撒克逊德鲁塞的帮助下,我终于做到了

class MapUtil {

class func translateCoordinate(coordinate: CLLocationCoordinate2D, metersLat: Double,metersLong: Double) -> (CLLocationCoordinate2D) {
    var tempCoord = coordinate

    let tempRegion = MKCoordinateRegionMakeWithDistance(coordinate, metersLat, metersLong)
    let tempSpan = tempRegion.span

    tempCoord.latitude = coordinate.latitude + tempSpan.latitudeDelta
    tempCoord.longitude = coordinate.longitude + tempSpan.longitudeDelta

    return tempCoord
}

class func setRadius(radius: Double,withCity city: CLLocationCoordinate2D,InMapView mapView: GMSMapView) {

    let range = MapUtil.translateCoordinate(city, metersLat: radius * 2, metersLong: radius * 2)

    let bounds = GMSCoordinateBounds(coordinate: city, coordinate: range)

    let update = GMSCameraUpdate.fitBounds(bounds, withPadding: 5.0)    // padding set to 5.0

    mapView.moveCamera(update)

    // location
    let marker = GMSMarker(position: city)
    marker.title = "title"
    marker.snippet = "snippet"
    marker.flat = true
    marker.map = mapView

    // draw circle
    let circle = GMSCircle(position: city, radius: radius)
    circle.map = mapView
    circle.fillColor = UIColor(red:0.09, green:0.6, blue:0.41, alpha:0.5)

    mapView.animateToLocation(city) // animate to center
}

}这里有一个更简单的解决方案,用于获取
GMSCircle
的边界。 它不依赖MapKit,并避免了更改摄影机位置的两个调用(
moveCamera
animateToLocation

将此文件添加到项目后,您需要做的只是:

let update = GMSCameraUpdate.fit(myCircle.bounds())
myMap.animate(with: update)
其中,
myCircle
myMap
被实际的圆圈和地图替换。

对于Swift 3

extension GMSCircle {
var bounds: GMSCoordinateBounds {
    return [0, 90, 180, 270].map {
        GMSGeometryOffset(position, radius, $0)
        }.reduce(GMSCoordinateBounds()) {
            $0.includingCoordinate($1)
    }
}
}
用法:

mapView.animate(with: .fit(circle.bounds))

我刚刚为GMSCameraUpdate创建了扩展

输入参数:

坐标您的中心坐标

半径-可见边界的半径

extension GMSCameraUpdate {

    static func fit(coordinate: CLLocationCoordinate2D, radius: Double) -> GMSCameraUpdate {
        var leftCoordinate = coordinate
        var rigthCoordinate = coordinate

        let region = MKCoordinateRegionMakeWithDistance(coordinate, radius, radius)
        let span = region.span

        leftCoordinate.latitude = coordinate.latitude - span.latitudeDelta
        leftCoordinate.longitude = coordinate.longitude - span.longitudeDelta
        rigthCoordinate.latitude = coordinate.latitude + span.latitudeDelta
        rigthCoordinate.longitude = coordinate.longitude + span.longitudeDelta

        let bounds = GMSCoordinateBounds(coordinate: leftCoordinate, coordinate: rigthCoordinate)
        let update = GMSCameraUpdate.fit(bounds, withPadding: -15.0)

        return update
    }

}
希望它能起作用

在视图控制器中初始化此圆

 var cirlce: GMSCircle!
在viewdidload中

 cirlce = GMSCircle(position: camera.target, radius: 10000)
        cirlce.fillColor = UIColor.red.withAlphaComponent(0.5)
               cirlce.map = mapView
调用googlemap的代理

 func mapView(_ mapView: GMSMapView, didChange position: GMSCameraPosition) {
           print(position.zoom)
        var zoom:Double = Double(position.zoom/4)
        zoom = pow(10, zoom)
        zoom = 1000000/zoom
         cirlce.radius = zoom
    }

太棒了!:)thnks alot buddy:-)@Vlad Lego你能解释一下你为什么使用6378000常数吗?@Vignesh 6378000是“以米为单位绕地球旋转的圆半径”。@Vlad Lego你能用objective-c给出这个答案吗?简单一点,这应该是公认的答案!值得一提的是,您可以在
.fit
上添加
with padding
参数来更改填充。默认值为64,将我的更改为16。非常感谢。
 func mapView(_ mapView: GMSMapView, didChange position: GMSCameraPosition) {
           print(position.zoom)
        var zoom:Double = Double(position.zoom/4)
        zoom = pow(10, zoom)
        zoom = 1000000/zoom
         cirlce.radius = zoom
    }