2017-02-20 3 views
0

Я работаю над приложением, как такси Ola. Когда пользователь перетаскивает карту, появляется прозрачное представление вида с перемещением маркера, и когда пользователь перестает перетаскивать, мы должны центрировать положение gmscamera так же, как и приложение ola cab. Это изображение, когда карта не перетаскивается.Как перемещать маркер на карте Google, например, приложение Ola

enter image description here

when the user drags the map the screen should be like this

после перетаскивания я получаю местоположение, используя код, приведенный ниже.

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


} 

Теперь моя проблема заключается в том, как создать второй экран.

+0

Вы использовали Draggable маркер, как приложение OLA? Я также работаю над приложением вроде OLA. –

ответ

0

Использование делегатов GMSMapView

- (void) mapView:(GMSMapView *)mapView didDragMarker:(GMSMarker *)marker; 
- (void) mapView:(GMSMapView *)mapView didBeginDraggingMarker:(GMSMarker *)marker; 
- (void) mapView:(GMSMapView *)mapView didEndDraggingMarker:(GMSMarker *)marker; 
+0

Привет, спасибо, за быстрый ответ. Если пользователь перетаскивает карту, то какой метод вызывается. –

+0

Вышеуказанные методы получат вызов, но вы можете установить координаты в этом методе - (void) mapView: (GMSMapView *) mapView didEndDraggingMarker: (маркер GMSMarker *) {маркер NSLog (@ "перетаскивается в местоположение:% f,% f ", marker.position.latitude, marker.position.longitude); } –

+0

Метод не получает вызов. Если вы видите старый экран старого приложения, вы можете легко понять мое требование. –

1

я достиг такого рода вещей в двух приложениях, которые связаны с живой отслеживания vahicle.

Есть некоторые требования, которые я использовал:

  1. App имеющего Всегда местоположение разрешения использования с надлежащим сообщением об использовании батареи.
  2. Соединительное соединение на обоих концах. Водитель & Клиент. Для этого используется Socket.io. То же самое настраивается в Интернете.
  3. Запуск службы определения местоположения каждые 2 секунды, чтобы я мог работать с батареей.
  4. Каждые 2 секунды, отправка данных в гнездо и прослушиватель сокетов может использовать эти данные для отображения автомобиля на карте.
  5. значок автомобиля в 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 значения.

+0

@patel Спасибо за быстрый ответ, я не очень быстрый язык, и я не хочу рассчитать расстояние. Мое требование - когда пользователь прокручивает карту, тогда вы должны показать один прозрачный вид, например, домашний экран приложения ola, когда вы перестаете прокручивать представление tanspernt, должно идти выкл и markshould место на mapview же, как ola –

+0

Привет @SatheeshkumarNaidu для перемещения карты, Google уже такие методы, в которых вы можете получить перетаскивание событий карты. (void) mapView: (GMSMapView *) mapView сделалBeginDraggingMarker: (GMSMarker *) marker; (void) mapView: (GMSMapView *) mapView didEndDraggingMarker: (GMSMarker *) marker; –

Смежные вопросы