custom - sdk googlemaps ios
Gire GMSMarker en la dirección en la que el usuario se enfrenta (8)
// solo haz esto solo
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
{
double heading = newHeading.trueHeading;
marker.groundAnchor = CGPointMake(0.5, 0.5);
marker.rotation = heading;
marker.map = mapView;
}
Tengo un requisito como en mi ubicación actual se mostrará una vista. Girará si el dispositivo girara o la ubicación cambiará. Investigo mucho pero obtuve todo el código que tiene una ubicación o ángulo fijo en alguna ubicación pero no tengo la ubicación. ¿Puede alguien llevarme en la dirección correcta?
También usé la propiedad de rotación del GMSMarker pero no está funcionando.
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
{
if (newHeading.headingAccuracy < 0){
NSLog(@"heading accuracy < 0");
return;
}
// Convert Degree to Radian and move the needle
float oldRad = (- manager.heading.trueHeading) * M_PI / 180.0f;
float newRad = (- newHeading.trueHeading) * M_PI / 180.0f;
// Compass animation
CABasicAnimation *theAnimation;
theAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
theAnimation.fromValue = [NSNumber numberWithFloat:oldRad];
theAnimation.toValue = [NSNumber numberWithFloat:newRad];
theAnimation.duration = 0.5f;
[source.layer addAnimation:theAnimation forKey:@"animateMyRotation"];
// source.transform = CGAffineTransformMakeRotation(newRad)
// GMSMarker *source = [googleMap selectedMarker];
// source.rotation = newRad;
}
Actualización : tengo un método de rotación pero hay alguna forma de rotar el GMSMarker porque no hay un método para transformar.
¿Cómo uber rotar su coche en google map?
Aquí el código modificado con los cambios sugeridos por Oren Trutner y de mí:
Solo necesitas pasar la ubicación antigua y la ubicación nueva. Al pasar los datos requeridos obtendrá un valor de rotación que está en flotación.
#define degreesToRadians(x) (M_PI * x / 180.0)
#define radiansToDegrees(x) (x * 180.0 / M_PI)
- (float)getHeadingForDirectionFromCoordinate:(CLLocationCoordinate2D)fromLoc toCoordinate:(CLLocationCoordinate2D)toLoc
{
float fLat = degreesToRadians(fromLoc.latitude);
float fLng = degreesToRadians(fromLoc.longitude);
float tLat = degreesToRadians(toLoc.latitude);
float tLng = degreesToRadians(toLoc.longitude);
float degree = radiansToDegrees(atan2(sin(tLng-fLng)*cos(tLat), cos(fLat)*sin(tLat)-sin(fLat)*cos(tLat)*cos(tLng-fLng)));
if (degree >= 0) {
return degree;
} else {
return 360+degree;
}
}
Podemos rotar la imagen según la propiedad del curso CLLocation Class
let marker:GMSMarker = GMSMarker.init(position: currentLocation!)
let head = locationManager.location?.course ?? 0
marker.rotation = head
marker.icon = UIImage(named: "testyCar.png")
marker.map = mapView
Ubicación actual El objeto ''CLLocation'' tiene una propiedad llamada ''curso''
@property(readonly, nonatomic) CLLocationDirection course;
de tipo CLLocationDirection (typedef de double) que es un ángulo de la ubicación.
Para que el automóvil gire, necesita un campo adicional en el backend, la dirección, junto con la latitud y la longitud. Usa esta información para rotar el auto aplicando Transform en UIView
CGAffineTransformMakeRotation(M_PI * (course_of_location) / 180.0);
puedes hacer algo como
-(void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
CLLocationDirection direction = newHeading.trueHeading;
lastDriverAngleFromNorth = direction;
self.driverMarker.rotation = lastDriverAngleFromNorth - mapBearing;
}
#pragma mark - GMSMapViewDelegate
- (void)mapView:(GMSMapView *)mapView didChangeCameraPosition:(GMSCameraPosition *)position {
mapBearing = position.bearing;
self.driverMarker.rotation = lastDriverAngleFromNorth - mapBearing;
}
Prueba esto, funciono para mi
func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading:CLHeading) {
UIView.animate(withDuration: 0.005) {
let angle = newHeading.trueHeading.toRadians() // convert from degrees to radians
self.yourImageHere.transform = CGAffineTransform(rotationAngle: CGFloat(angle)) // rotate the picture
}
}
override func viewDidLoad() {
super.viewDidLoad()
locationManager.startUpdatingHeading()
}
Swift 4+
Gracias a . Cuando actualice el marcador de ubicación, intente esto:
let locationManager = CLLocationManager()
marker.position = position
marker.appearAnimation = .none
marker.rotation = locationManager.location?.course ?? 0
marker.map = map
marker.rotation = course_of_location;
Nota: la rotación hacia el pasador ocurrirá solo durante el movimiento. en caso de dispositivo estático habrá -1 valor de location.course. Además esto no tiene relación con la orientación del dispositivo. Si está buscando mover el pasador según el encabezado del dispositivo, haga esto
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
marker.rotation = (manager.heading.trueHeading) * M_PI / 180.0f; }