2014-09-30 42 views
8

我正在研究一个应用程序,该应用程序基于您当前位置周围的半径显示某些标记。半径在100-5000米之间。我用UISlider更改半径并重新绘制GMSCircle更改基于半径的相机缩放Google地图iOS SDK

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

这是我创建的viewDidLoad方法的相机,其中初始变焦值是15:

GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:locationManager.location.coordinate.latitude longitude:locationManager.location.coordinate.longitude zoom:15]; 

这里是我工作的一个屏幕截图。

enter image description here

有谁知道我应该用什么尺度来相应地移动缩放?

非常感谢!

格兰尼特

回答

8

在Saxon Druce的帮助下,终于做到了。

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 
} 

} enter image description here

5

你可以使用的GMSCameraUpdatefitBounds方法,传递这是从你的圈子的边缘计算的GMSCoordinateBounds

基于this answer,它看起来像你可以使用MKCoordinateRegionMakeWithDistance到您的中心(经/纬度)加半径(米)转换为MKCoordinateRegion,这将米转换成度的跨度,因此允许你来计算以度为单位的坐标,用于创建GMSCoordinateBounds

17

下面是得到一个GMSCircle的边界一个简单的解决方案。 它不依赖于MapKit和避免了改变相机位置(moveCameraanimateToLocation

import GoogleMaps 

extension GMSCircle { 
    func bounds() -> GMSCoordinateBounds { 
     func locationMinMax(positive : Bool) -> CLLocationCoordinate2D { 
      let sign:Double = positive ? 1 : -1 
      let dx = sign * self.radius/6378000 * (180/M_PI) 
      let lat = position.latitude + dx 
      let lon = position.longitude + dx/cos(position.latitude * M_PI/180) 
      return CLLocationCoordinate2D(latitude: lat, longitude: lon) 
     } 

     return GMSCoordinateBounds(coordinate: locationMinMax(true), 
      coordinate: locationMinMax(false)) 
    } 
} 

添加此文件到您的项目后,两个电话,所有你需要做的是:

let update = GMSCameraUpdate.fitBounds(myCircle.bounds()) 
myMap.animateWithCameraUpdate(update) 

其中myCirclemyMap被实际的圆和地图取代。

+0

伟大的作品! :) – 2017-05-16 18:21:17

+0

thinks很多好友:-) – Rex 2017-07-15 11:16:38

+0

@Vlad乐高你能澄清你为什么使用6378000不变? – Vignesh 2017-10-04 10:54:09

0

对于斯威夫特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)) 
0

我刚刚创建扩展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 
    } 

} 
相关问题