2016-09-14 5 views
0

Ich bin der Entwicklung einer iPhone App, und ich brauche Hilfe bei diesem Fall:Suche Abstand von Standort Route in Google Maps SDK

ich überprüfen müssen, wenn der Benutzer verlassen Google Maps Route (GMSPolyline), und wenn Abstand vom Benutzerstandort zum nächsten Punkt der Route ist mehr als 40 Meter - ich muss Route neu erstellen.

Ich kann nicht den richtigen Algorithmus finden, um festzustellen, ob die Entfernung zwischen Benutzer und Route mehr als 40 Meter beträgt.

Ich habe versucht, diese Methode zu verwenden Projektion der Benutzerposition zu finden (zu CGPoint von CGPointMake umgewandelt) auf dem Weg:

+ (CGPoint)projectionOfPoint:(CGPoint)origPoint toSegmentP1:(CGPoint)p1 p2:(CGPoint)p2 { 
// for case line is parallel to x axis 
if (p2.y == p1.y) { 
    return CGPointMake(origPoint.x, p1.y); 

// for case line is parallel to y axis 
} else if (p2.x == p1.x) { 
    return CGPointMake(p1.x, origPoint.y); 
} 

// line from segment 
CGFloat kKoefLine1 = (p2.x - p1.x)/(p2.y - p1.y); 
CGFloat bKoefLine1 = p1.y - kKoefLine1*p1.x; 

// perpendicular line 
CGFloat kKoefLine2 = -1/kKoefLine1; 
CGFloat bKoefLine2 = origPoint.y - kKoefLine2*origPoint.x; 

// cross point 
CGFloat krossX  = (bKoefLine2 - bKoefLine1)/(kKoefLine1 - kKoefLine2); 
CGFloat krossY  = kKoefLine2*krossX + bKoefLine2; 

return CGPointMake(krossX, krossY);} 

Dann berechne ich Abstand von zurück Vorsprung (umgerechnet auf CLLocation) und Benutzer-Standort , aber es funktioniert nicht.

P.S .: Ich wäre dankbar, wenn die Lösung auf swift geschrieben würde.

Antwort

1

Es gibt eine GMSGeometryIsLocationOnPath Funktion im Modul GMSGeometryUtils im Google Maps SDK.

Sie sollten in der Lage sein zu berechnen, was Sie brauchen.

Pseudocode (nicht getestet):

let currentLocation: CLLocationCoordinate2D = ... 
let routePath: GMSPath = routePolyline.path 
let geodesic = true 
let tolerance: CLLocationDistance = 40 

let within40Meters = GMSGeometryIsLocationOnPath(currentLocation, routePath, geodesic, tolerance) 
+0

Gott segne dich! Es funktioniert perfekt und es ist genau das, was ich brauche. Vielen Dank! –

-1

Während ich nicht viel über das GMS SDK von meinem Kopf zurück erinnere, bevor ich Ihnen eine Antwort gebe, werde ich sagen, dass niemand hier Ihren Code für Sie schreiben wird. Das ist Ihre Aufgabe und sollte zu Ihrer Zeit erledigt werden. Sie haben keinen Hintergrund dafür gegeben, wie weit Sie in Bezug auf die Berechnung von Routen gekommen sind, ob Sie herausgefunden haben, wie man die Entfernung überhaupt berechnet, etc.

Mit dem wird gesagt, Routen auf Google Karten bestehen aus "Beinen", die einen Pfad angeben, bevor eine Abzweigung unternommen wird, um das Ziel zu erreichen. Durch Abfragen Ihres "route" -Wörterbuchs können Sie ein Array von Wörterbüchern extrahieren, wobei jedes Element (welches ein Wörterbuch ist) Metadaten über ein "Bein" enthält. Sie können dann das Array durchlaufen, jedes Wörterbuch durchgehen und den "Abstand" -Wert extrahieren und zu einem einzigen "Abstand" var zusammenfassen.

Sie können dies so oft wie nötig neu berechnen und mit einer Bedingung überprüfen, ob die Summe der Beindistanz < 40M ist oder nicht.

Link zu einem Artikel, der helfen sollte (Ich hatte nicht die Zeit, um das ganze Ding für Sie durchzugehen, so tun Sie Ihre Sorgfalt und Forschung) here.

+0

hinzugefügt Informationen –

+0

@ МаксимЛанской 1. Haben Sie Haltepunkte und tatsächlich versucht das Debuggen eingestellt selbst 2. Was das eigentliche Problem ist, dass Sie haben, Benutzerstandorterfassung oder Abstandsbestimmung zwischen Benutzerstandort und Routenziel und 3. Haben Sie auf den Artikel geklickt, mit dem ich Sie verlinkt habe? Es enthält wahrscheinlich etwas ähnliches wie eine Lösung, die Sie verwenden können, aber verbringen Sie die Zeit, um Ihre Forschung zu tun. Es ist deine Aufgabe, dies mit Hilfe herauszufinden, es ist nicht die Stack-Community, deine Arbeit für dich zu erledigen. –

Verwandte Themen