2014-09-30 72 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 
    } 

} 
相關問題