- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在谷歌地图上开发一些导航任务。我必须在车辆转弯时移动标记,就像优步在他们的应用程序中所做的那样。我尝试了@SO 上提供的不同解决方案,但它没有按我的需要工作。
我正在获取以前的纬度/经度与当前的纬度/经度的角度,并使用该旋转对 mapwithBearing 进行动画处理
这是代码
[CATransaction begin];
[CATransaction setAnimationDuration:2.0];
NSDictionary *data = [[result objectForKey:@"returnData"] objectForKey:@"data"];
if (![data isEqual: [NSNull null]]) {
driverLocationCoordinate = CLLocationCoordinate2DMake([[data objectForKey:@"lat"] doubleValue], [[data objectForKey:@"lng"] doubleValue]);
driverMarker.position = driverLocationCoordinate;
GMSCameraPosition * camera = [GMSCameraPosition cameraWithLatitude:driverLocationCoordinate.latitude
longitude:driverLocationCoordinate.longitude
zoom:16];
mapHomeView.camera = camera;
if ([data objectForKey:@"preLat"] != [NSNull null] && [data objectForKey:@"preLng"] !=[NSNull null]){
if ([[data objectForKey:@"preLat"] floatValue] != 0.0f && [[data objectForKey:@"preLng"] floatValue] != 0.0f) {
NSLog(@"pre_lat = %f and pre_lng = %f", [[data objectForKey:@"preLat"] floatValue], [[data objectForKey:@"preLng"] floatValue]);
CLLocationCoordinate2D previousCoordinates = CLLocationCoordinate2DMake([[data objectForKey:@"preLat"] floatValue], [[data objectForKey:@"preLng"] floatValue]);
driverMarker.rotation = [self DegreeBearing:previousCoordinates locationB:driverMarker.position];
[mapHomeView animateToBearing:driverMarker.rotation];
}
}
[CATransaction commit];
我刚刚从另一个@SO 帖子中获取了学位代码,当我在直路上时它可以工作但是当汽车静止或转弯时,它会闪烁
这是从另一个 SO 帖子获取角度的代码。
-(double) DegreeBearing:(CLLocationCoordinate2D) A locationB: (CLLocationCoordinate2D)B{
double dlon = [self ToRad:(B.longitude - A.longitude) ];
double dPhi = log(tan([self ToRad:(B.latitude)] / 2 + M_PI / 4) / tan([self ToRad:(A.latitude)] / 2 + M_PI / 4));
if (fabs(dlon) > M_PI){
dlon = (dlon > 0) ? (dlon - 2*M_PI) : (2*M_PI + dlon);
}
return [self ToBearing:(atan2(dlon, dPhi))];
}
-(double) ToRad: (double)degrees{
return degrees*(M_PI/180);
}
-(double) ToBearing:(double)radians{
return [self ToDegrees:radians] + 360 % 360;
}
-(double) ToDegrees: (double)radians{
return radians * 180 / M_PI;
}
任何人都可以对此提供帮助或提出任何其他解决方案吗?
最佳答案
一些如何使用此代码。您可以尝试使用此代码进行一些逻辑更改。但是,它会正常工作。
CLLocationCoordinate2D oldCoodinate = CLLocationCoordinate2DMake([[data valueForKey:@"lat"]doubleValue],[[data valueForKey:@"lng"]doubleValue]);
CLLocationCoordinate2D newCoodinate = CLLocationCoordinate2DMake([[data valueForKey:@"lat"]doubleValue],[[data valueForKey:@"lng"]doubleValue]);
driverMarker.groundAnchor = CGPointMake(0.5, 0.5);
driverMarker.rotation = [self getHeadingForDirectionFromCoordinate:oldCoodinate toCoordinate:newCoodinate]; //found bearing value by calculation when marker add
driverMarker.position = oldCoodinate; //this can be old position to make car movement to new position
driverMarker.map = mapView_;
//marker movement animation
[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:2.0] forKey:kCATransactionAnimationDuration];
[CATransaction setCompletionBlock:^{
driverMarker.groundAnchor = CGPointMake(0.5, 0.5);
driverMarker.rotation = [[data valueForKey:@"bearing"] doubleValue]; //New bearing value from backend after car movement is done
}];
driverMarker.position = newCoodinate; //this can be new position after car moved from old position to new position with animation
driverMarker.map = mapView_;
driverMarker.groundAnchor = CGPointMake(0.5, 0.5);
driverMarker.rotation = [self getHeadingForDirectionFromCoordinate:oldCoodinate toCoordinate:newCoodinate]; //found bearing value by calculation
[CATransaction commit];
在.h文件中定义这两个
#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;
}
}
swift 3.1
var oldCoodinate: CLLocationCoordinate2D? = CLLocationCoordinate2DMake(CDouble((data.value(forKey: "lat") as? CLLocationCoordinate2D)), CDouble((data.value(forKey: "lng") as? CLLocationCoordinate2D)))
var newCoodinate: CLLocationCoordinate2D? = CLLocationCoordinate2DMake(CDouble((data.value(forKey: "lat") as? CLLocationCoordinate2D)), CDouble((data.value(forKey: "lng") as? CLLocationCoordinate2D)))
driverMarker.groundAnchor = CGPoint(x: CGFloat(0.5), y: CGFloat(0.5))
driverMarker.rotation = getHeadingForDirection(fromCoordinate: oldCoodinate, toCoordinate: newCoodinate)
//found bearing value by calculation when marker add
driverMarker.position = oldCoodinate
//this can be old position to make car movement to new position
driverMarker.map = mapView_
//marker movement animation
CATransaction.begin()
CATransaction.setValue(Int(2.0), forKey: kCATransactionAnimationDuration)
CATransaction.setCompletionBlock({() -> Void in
driverMarker.groundAnchor = CGPoint(x: CGFloat(0.5), y: CGFloat(0.5))
driverMarker.rotation = CDouble(data.value(forKey: "bearing"))
//New bearing value from backend after car movement is done
})
driverMarker.position = newCoodinate
//this can be new position after car moved from old position to new position with animation
driverMarker.map = mapView_
driverMarker.groundAnchor = CGPoint(x: CGFloat(0.5), y: CGFloat(0.5))
driverMarker.rotation = getHeadingForDirection(fromCoordinate: oldCoodinate, toCoordinate: newCoodinate)
//found bearing value by calculation
CATransaction.commit()
extension Int {
var degreesToRadians: Double { return Double(self) * .pi / 180 }
}
extension FloatingPoint {
var degreesToRadians: Self { return self * .pi / 180 }
var radiansToDegrees: Self { return self * 180 / .pi }
}
func getHeadingForDirection(fromCoordinate fromLoc: CLLocationCoordinate2D, toCoordinate toLoc: CLLocationCoordinate2D) -> Float {
let fLat: Float = Float((fromLoc.latitude).degreesToRadians)
let fLng: Float = Float((fromLoc.longitude).degreesToRadians)
let tLat: Float = Float((toLoc.latitude).degreesToRadians)
let tLng: Float = Float((toLoc.longitude).degreesToRadians)
let degree: Float = (atan2(sin(tLng - fLng) * cos(tLat), cos(fLat) * sin(tLat) - sin(fLat) * cos(tLat) * cos(tLng - fLng))).radiansToDegrees
if degree >= 0 {
return degree
}
else {
return 360 + degree
}
}
github 链接:ARCarMovement
关于ios - 像 UBER 一样在 Google map 上移动 GMSMarker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39383324/
我需要用 90% 的优步功能制作我自己的应用程序我可以使用 uber api 构建自己的后端服务吗? 我的意思是创建我自己的服务器端并使用 super 算法,司机和客户向我注册,而不是 uber 最佳
我们正在开发一个应用程序,我们需要用我们自己的信用卡为不同的用户支付费用。有点 Uber 业务,但无需手动添加帐户。 Uber API 可以吗? 最佳答案 不幸的是,如今在 Uber API 中无法为
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 5 年前。 Improv
我正在编写一个使用 uber API 的 iOS 应用程序。我试图通过 Uber API 获取当前事件的 request_id,但是对/v1/requests 的 GET 请求不起作用。从文档看来,这
我已将我的应用程序配置为接收沙箱请求 api 状态更改的回调,但我尚未收到对我的 webhook url 的任何调用。我已经能够用帖子测试我的网络钩子(Hook)网址并且它有效,所以我不认为它的网址是
我正在向https://sandbox-api.uber.com/v1/requests提出请求使用我的帐户的不记名 token (这是 Uber 应用程序的管理员)。 当我提出请求时,我收到 401
当我尝试在沙盒中请求乘车收据时,回复似乎总是 9 美元。金额我不太在意,但货币是有问题的。该请求是通过 API(沙盒)发出的,估计和实际乘车请求都以本地货币返回票价金额,可能是也可能不是美元。有没有办
我正在关注 Uber Eats API 文档,但遇到了问题。我希望它与我的销售点网络应用程序一起使用。 文档说: To generate a client credentials token, ret
根据 Uber 文档,应通过以下方式推荐新用户:“https://m.uber.com/sign-up?client_id=YOUR_CLIENT_ID ” 那么,有没有办法通过以下方式引用使用 oA
我只是测试新的请求端点,想知道我可以从 Map 请求中获得什么返回结果? https://developer.uber.com/v1/endpoints/#request-map 我目前正在使用沙箱进
我正在尝试使用 Auth 2.0 对 Uber REST API 进行身份验证,但范围似乎存在问题。一旦我指定了一个范围(甚至是非特权范围),/authorize 请求就会失败并显示“无效范围”。如果
我使用 uber sdk ( https://github.com/uber/rides-ios-sdk) 创建了一个自定义应用程序。我还有“连接”按钮和 singup 选项,我在登录/注册期间使用“
我正在使用适用于 iOS 的优步 SDK。如何在 Swift 中实现自定义优步叫车请求按钮?我不想使用优步在他们的文档中使用的标准按钮。我想为它设计自己的用户界面。 Reference 最佳答案 您可
我在我的应用程序中集成了“用优步乘车”按钮。我觉得,如果我显示预计到达时间和目的地的预估价格,对用户来说会更方便。我怎样才能做到这一点?我现在正在遵循本指南:https://github.com/ub
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我知道我可以通过创建 2 个模块来实现它,但只是想知道是否可以在一个模块中做到这一点?谢谢 最佳答案 Maven Shade 插件,如果运行 shade 目标,默认会生成两个 JAR: your-ar
我在这里关注深度链接的文档: https://developer.uber.com/v1/deep-linking/#launching-the-uber-mobile-site 好吧,我可以打开网站
对于 Uber 登录,我在 Android 手机端遵循“单点登录”登录机制,但由于刷新 token ,我遇到了问题。刷新 token 我们在 AccessToken 类中获得的(30 个字符)我们将其
Uber API v1.2 Documentation GET /estimates/price在 surge_multiplier 的定义中包含歧义支持: 它被声明为响应的参数之一 但是 未在响应示
我正在集成优步乘车请求 API。我成功验证了 uber 帐户。我可以从 uber api 获取用户历史记录和用户配置文件,但我没有获取 v1.2/requests/estimate。但是当我请求乘车时
我是一名优秀的程序员,十分优秀!