如何在用户移动的方向上旋转 GMSMarker Swift?
How to rotate GMSMarker in the direction which user is moving in Swift?
我正在使用这个代码。
let marker = GMSMarker()
marker.position = coordinates
marker.tracksViewChanges = true
marker.icon = UIImage(named:"car")
marker.appearAnimation = kGMSMarkerAnimationNone
marker.map = mapView
位置管理员代码
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
{
let location = locations.last! as CLLocation
if(checkingLocation == false)
{
let camera = GMSCameraPosition.camera(withLatitude: (location.coordinate.latitude), longitude: (location.coordinate.longitude), zoom: 16.0)
oldLocationCenter = location
marker.position = (locationManager.location?.coordinate)!
self.mapView?.animate(to: camera)
// checkingLocation = true
locationManager.stopUpdatingLocation()
}
else
{
let updateCam = GMSCameraUpdate.setTarget(CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude))
updateMarker(coordinates: location.coordinate, degrees:DegreeBearing(A: oldLocationCenter, B: location) , duration: 10.0)
self.mapView?.animate(with: updateCam)
locationManager.stopUpdatingLocation()
}
}
func updateMarker(coordinates: CLLocationCoordinate2D, degrees: CLLocationDegrees, duration: Double){
// Keep Rotation Short
CATransaction.begin()
CATransaction.setAnimationDuration(10.0)
marker.rotation = degrees
CATransaction.commit()
// Movement
CATransaction.begin()
CATransaction.setAnimationDuration(duration)
marker.position = coordinates
// Center Map View
let camera = GMSCameraUpdate.setTarget(coordinates)
mapView.animate(with: camera)
CATransaction.commit()
}
func DegreeBearing(A:CLLocation,B:CLLocation)-> Double{
var dlon = self.ToRad(degrees: B.coordinate.longitude - A.coordinate.longitude)
let dPhi = log(tan(self.ToRad(degrees: B.coordinate.latitude) / 2 + M_PI / 4) / tan(self.ToRad(degrees: A.coordinate.latitude) / 2 + M_PI / 4))
if abs(dlon) > M_PI{
dlon = (dlon > 0) ? (dlon - 2*M_PI) : (2*M_PI + dlon)
}
return self.ToBearing(radians: atan2(dlon, dPhi))
}
func ToRad(degrees:Double) -> Double{
return degrees*(M_PI/180)
}
func ToBearing(radians:Double)-> Double{
return (ToDegrees(radians: radians) + 360) / 360
}
func ToDegrees(radians:Double)->Double{
return radians * 180 / M_PI
}
通过使用上面的代码,我的标记(汽车)从旧位置移动到新位置,我也使用这些位置来获取方位角。但它不旋转。还有其他方法可以实现这一目标吗?请指导我。
为了正确导航,您首先需要像这样设置您的位置管理器对象
fileprivate func initLocationManager()
{
locationManager = CLLocationManager();
locationManager!.delegate = self;
locationManager!.desiredAccuracy = kCLLocationAccuracyBest;
locationManager!.activityType = .automotiveNavigation;
if LocationTracker.authorized() == false
{
requestAuthorization()
}
}
设置后您需要找到合法位置,因为在 ios 系统中会尝试提供最佳位置但不确定所以有时位置也来自缓存或者您的位置可能是 zick zack 所以您需要关注locationUpdate
中的代码
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
{
if locations.count > 0
{
let _ = locations.first
let location = locations[locations.count-1]
let maxAge:TimeInterval = 60;
let requiredAccuracy:CLLocationAccuracy = 100;
let locationIsValid:Bool = Date().timeIntervalSince(location.timestamp) < maxAge && location.horizontalAccuracy <= requiredAccuracy;
if locationIsValid
{
NSLog(",,, location : %@",location);
NSLog("valid locations.....");
}
}
}
你的导航很顺利,但请注意 iPad 中的定位精度不佳 这种类型的模块只适用于 iphone 祝你好运
我通过更新标题找到了解决方案。
在 didUpdateLocations 方法中,我们需要更新 heading
locationManager.startUpdatingHeading()
所以标记会在用户移动的地方旋转。
func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading)
{
let heading:Double = newHeading.trueHeading;
marker.groundAnchor = CGPoint(x: 0.5, y: 0.5)
marker.rotation = heading
marker.map = mapView;
print(marker.rotation)
}
我正在使用这个代码。
let marker = GMSMarker()
marker.position = coordinates
marker.tracksViewChanges = true
marker.icon = UIImage(named:"car")
marker.appearAnimation = kGMSMarkerAnimationNone
marker.map = mapView
位置管理员代码
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
{
let location = locations.last! as CLLocation
if(checkingLocation == false)
{
let camera = GMSCameraPosition.camera(withLatitude: (location.coordinate.latitude), longitude: (location.coordinate.longitude), zoom: 16.0)
oldLocationCenter = location
marker.position = (locationManager.location?.coordinate)!
self.mapView?.animate(to: camera)
// checkingLocation = true
locationManager.stopUpdatingLocation()
}
else
{
let updateCam = GMSCameraUpdate.setTarget(CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude))
updateMarker(coordinates: location.coordinate, degrees:DegreeBearing(A: oldLocationCenter, B: location) , duration: 10.0)
self.mapView?.animate(with: updateCam)
locationManager.stopUpdatingLocation()
}
}
func updateMarker(coordinates: CLLocationCoordinate2D, degrees: CLLocationDegrees, duration: Double){
// Keep Rotation Short
CATransaction.begin()
CATransaction.setAnimationDuration(10.0)
marker.rotation = degrees
CATransaction.commit()
// Movement
CATransaction.begin()
CATransaction.setAnimationDuration(duration)
marker.position = coordinates
// Center Map View
let camera = GMSCameraUpdate.setTarget(coordinates)
mapView.animate(with: camera)
CATransaction.commit()
}
func DegreeBearing(A:CLLocation,B:CLLocation)-> Double{
var dlon = self.ToRad(degrees: B.coordinate.longitude - A.coordinate.longitude)
let dPhi = log(tan(self.ToRad(degrees: B.coordinate.latitude) / 2 + M_PI / 4) / tan(self.ToRad(degrees: A.coordinate.latitude) / 2 + M_PI / 4))
if abs(dlon) > M_PI{
dlon = (dlon > 0) ? (dlon - 2*M_PI) : (2*M_PI + dlon)
}
return self.ToBearing(radians: atan2(dlon, dPhi))
}
func ToRad(degrees:Double) -> Double{
return degrees*(M_PI/180)
}
func ToBearing(radians:Double)-> Double{
return (ToDegrees(radians: radians) + 360) / 360
}
func ToDegrees(radians:Double)->Double{
return radians * 180 / M_PI
}
通过使用上面的代码,我的标记(汽车)从旧位置移动到新位置,我也使用这些位置来获取方位角。但它不旋转。还有其他方法可以实现这一目标吗?请指导我。
为了正确导航,您首先需要像这样设置您的位置管理器对象
fileprivate func initLocationManager()
{
locationManager = CLLocationManager();
locationManager!.delegate = self;
locationManager!.desiredAccuracy = kCLLocationAccuracyBest;
locationManager!.activityType = .automotiveNavigation;
if LocationTracker.authorized() == false
{
requestAuthorization()
}
}
设置后您需要找到合法位置,因为在 ios 系统中会尝试提供最佳位置但不确定所以有时位置也来自缓存或者您的位置可能是 zick zack 所以您需要关注locationUpdate
中的代码 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
{
if locations.count > 0
{
let _ = locations.first
let location = locations[locations.count-1]
let maxAge:TimeInterval = 60;
let requiredAccuracy:CLLocationAccuracy = 100;
let locationIsValid:Bool = Date().timeIntervalSince(location.timestamp) < maxAge && location.horizontalAccuracy <= requiredAccuracy;
if locationIsValid
{
NSLog(",,, location : %@",location);
NSLog("valid locations.....");
}
}
}
你的导航很顺利,但请注意 iPad 中的定位精度不佳 这种类型的模块只适用于 iphone 祝你好运
我通过更新标题找到了解决方案。 在 didUpdateLocations 方法中,我们需要更新 heading
locationManager.startUpdatingHeading()
所以标记会在用户移动的地方旋转。
func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading)
{
let heading:Double = newHeading.trueHeading;
marker.groundAnchor = CGPoint(x: 0.5, y: 0.5)
marker.rotation = heading
marker.map = mapView;
print(marker.rotation)
}