web-dev-qa-db-ja.com

ユーザーが向いている方向にGMSMarkerを回転させる

現在の場所に1つのビューが表示されるような要件があります。デバイスが回転した場合、または場所が変更された場合は回転します。多くの調査を行いましたが、特定の場所で位置または角度が固定されているコードはすべて取得しましたが、位置は固定していません。誰かが正しい方向に私を運転できますか?.

GMSMarkerのrotationプロパティも使用しましたが、機能しません。

- (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;
}

更新:ローテーションメソッドはありますが、変換するメソッドがないため、GMSMarkerをローテーションする方法はありますか?.

UberはどのようにGoogleマップで車を回転させますか?

enter image description here

16
chirag shah

現在の場所「CLLocation」オブジェクトには「コース」というプロパティがあります

@property(readonly, nonatomic) CLLocationDirection course;

場所の角度であるタイプCLLocationDirection(typedef of double)の。

車を回転させるには、バックエンド、方向、および緯度と経度に追加のフィールドが必要です。この情報を使用して、UIViewに変換を適用することにより、車を回転させます

CGAffineTransformMakeRotation(M_PI * (course_of_location) / 180.0);
5
Sunil_Vaishnav

コースプロパティCLLocationクラスに基づいて画像を回転できます

    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 
7
priya.vr

あなたは次のようなことができます-

-(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;
}
5
Haider

//これだけを行う

- (void)locationManager:(CLLocationManager *)manager  didUpdateHeading:(CLHeading *)newHeading
{
   double heading = newHeading.trueHeading;
   marker.groundAnchor = CGPointMake(0.5, 0.5);
   marker.rotation = heading;
   marker.map = mapView;
}
1
ios meridian

これを試してください、私にとってはうまくいきました

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()
}
1
BizDev

Swift 4 +

priya.vr に感謝します。場所マーカーを更新するときは、次のことを試してください。

 let locationManager = CLLocationManager()
 marker.position = position
 marker.appearAnimation = .none
 marker.rotation = locationManager.location?.course ?? 0
 marker.map = map
0
A. Lebedko

ここで、Oren Trutnerと私から提案された変更でコードが変更されました。

古い場所と新しい場所を渡すだけです。必要なデータを渡すことにより、浮動小数点の回転値を取得します。

#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;
    }
}
0
Anil Kukadeja
marker.rotation = course_of_location;

注:ピンへの回転は移動中にのみ発生します。静的デバイスの場合、location.courseの値は-1になります。また、これはデバイスの向きとは関係ありません。デバイスの見出しに従ってピンを移動する場合は、次のようにします

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
marker.rotation =  (manager.heading.trueHeading) * M_PI / 180.0f; }
0
Spydy