我正在开发类似Ola出租车的应用程序。当用户拖动地图时,会随着标记的移动而出现一个透明的视图,而当用户停止拖动时,我们必须将gmscamera位置居中放置,就像ola cab app一样。未拖动地图时的图像。

ios - 如何在Ola之类的Google Map上移动标记-LMLPHP

ios - 如何在Ola之类的Google Map上移动标记-LMLPHP

拖动后,我使用以下代码获取位置。

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


}

现在我的问题是如何创建第二个屏幕。

最佳答案

我已经在与车辆实时跟踪相关的两个应用程序中实现了这种功能。

我已经使用了一些要求:

  • 应用程序具有“始终使用位置”权限以及正确的电池使用情况消息。
  • 两端使用了套接字连接。司机和顾客。为此,使用Socket.io。在Web中配置相同。
  • 每2秒触发一次定位服务,以便我处理电池使用情况。
  • 每2秒将数据发送到套接字,套接字侦听器可以使用该数据在地图上显示汽车。
  • 90度旋转的汽车图标(汽车指示向右移动)

  • 最重要的是,驾驶员的经度和纬度应正确显示地图上的汽车运动。 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/

    10-13 03:23