我正在开发类似Ola出租车的应用程序。当用户拖动地图时,会随着标记的移动而出现一个透明的视图,而当用户停止拖动时,我们必须将gmscamera位置居中放置,就像ola cab app一样。未拖动地图时的图像。
拖动后,我使用以下代码获取位置。
- (void) mapView:(GMSMapView *)mapView idleAtCameraPosition:(GMSCameraPosition *)position {
latitude = mapView.camera.target.latitude;
longitude = mapView.camera.target.longitude;
CLLocationCoordinate2D center = CLLocationCoordinate2DMake(latitude, longitude);
[self hourelywebsevice:updatedlogintokenstring withlat:latitude withlong:longitude withcoustamerid:updatednamestring];
// [self hourelywebsevice:@"abc" withlat:latitude withlong:longitude];
marker.position = center;
}
现在我的问题是如何创建第二个屏幕。
最佳答案
我已经在与车辆实时跟踪相关的两个应用程序中实现了这种功能。
我已经使用了一些要求:
最重要的是,驾驶员的经度和纬度应正确显示地图上的汽车运动。 gmsMarker位置被认为是旧值,而newLocation值是当前位置。
let preLoc = CLLocation.init(latitude: self.gmsMarker.position.latitude, longitude: self.gmsMarker.position.longitude)
let curLoc = CLLocation.init(latitude: newLocation.latitude, longitude: newLocation.longitude)
let changeInLocation = preLoc.distance(from: curLoc)
if changeInLocation > 5{
let degree = self.DegreeBearing(preLoc, curLoc)
if degree > 5{
self.gmsMarker.rotation = degree
}
}
下面的四个功能将计算您的行驶方向,并根据该汽车在行驶中的道路上显示正确的位置。
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).truncatingRemainder(dividingBy: 360)
}
func ToDegrees(radians:Double)->Double{
return radians * 180 / M_PI
}
对于客户方,只需将您从驱动程序方收到的任何数据显示为
self.gmsMarker.rotation
值即可作为标记。关于ios - 如何在Ola之类的Google Map上移动标记,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42345449/