Calculer le relèvement entre deux emplacements (lat, long)
Je suis en train de développer mon propre réalité augmentée moteur.
Des recherches sur internet, j'ai trouvé ce utile tutoriel. Le lisant, je vois que la chose la plus importante est le palier entre l'emplacement de l'utilisateur, l'emplacement du point et du nord.
L'image ci-dessous est à partir de ce tutoriel.
La suite, j'ai écrit un Objective-C méthode pour obtenir bêta:
+ (float) calculateBetaFrom:(CLLocationCoordinate2D)user to:(CLLocationCoordinate2D)destination
{
double beta = 0;
double a, b = 0;
a = destination.latitude - user.latitude;
b = destination.longitude - user.longitude;
beta = atan2(a, b) * 180.0 / M_PI;
if (beta < 0.0)
beta += 360.0;
else if (beta > 360.0)
beta -= 360;
return beta;
}
Mais, quand je l'ai essayer, ça ne fonctionne pas très bien.
Alors, j'ai vérifié iPhone AR boîte à outils, pour voir comment il fonctionne (j'ai travaillé avec cette boîte à outils, mais il est tellement grand pour moi).
Et, dans ARGeoCoordinate.m il y a une autre mise en œuvre de la façon d'obtenir la bêta:
- (float)angleFromCoordinate:(CLLocationCoordinate2D)first toCoordinate:(CLLocationCoordinate2D)second {
float longitudinalDifference = second.longitude - first.longitude;
float latitudinalDifference = second.latitude - first.latitude;
float possibleAzimuth = (M_PI * .5f) - atan(latitudinalDifference / longitudinalDifference);
if (longitudinalDifference > 0)
return possibleAzimuth;
else if (longitudinalDifference < 0)
return possibleAzimuth + M_PI;
else if (latitudinalDifference < 0)
return M_PI;
return 0.0f;
}
Il utilise cette formule:
float possibleAzimuth = (M_PI * .5f) - atan(latitudinalDifference / longitudinalDifference);
Pourquoi (M_PI * .5f) dans cette formule? Je ne comprends pas.
Et continuer à chercher, j'ai trouvé un autre page parler de la façon de calculer la distance et le relèvement de 2 endroits. Dans cette page il y a une autre mise en œuvre:
/**
* Returns the (initial) bearing from this point to the supplied point, in degrees
* see http://williams.best.vwh.net/avform.htm#Crs
*
* @param {LatLon} point: Latitude/longitude of destination point
* @returns {Number} Initial bearing in degrees from North
*/
LatLon.prototype.bearingTo = function(point) {
var lat1 = this._lat.toRad(), lat2 = point._lat.toRad();
var dLon = (point._lon-this._lon).toRad();
var y = Math.sin(dLon) * Math.cos(lat2);
var x = Math.cos(lat1)*Math.sin(lat2) -
Math.sin(lat1)*Math.cos(lat2)*Math.cos(dLon);
var brng = Math.atan2(y, x);
return (brng.toDeg()+360) % 360;
}
Lequel est le bon?
source d'informationauteur VansFannel
Vous devez vous connecter pour publier un commentaire.
Calculer portant
Convertir des Degrés en Radians
Convertir des Radians en Degrés
Je sais que cette question est ancienne, mais ici, c'est une solution plus facile:
flotteur de roulement = loc1.bearingTo(loc2);
Dans la formule
float possibleAzimuth = (M_PI * .5f) - atan(latitudinalDifference /longitudinalDifference);
le terme
(M_PI * .5f)
signifie π/2, qui est de 90°. Cela signifie que c'est la même formule que vous avez dit au début, parce que concernant à la figure ci-dessus, il est titulaire d'β = arctan (a/b) = 90° - arctan(b/a).
De sorte que les deux formules sont similaires si
a
se réfère à la différence de longitude etb
à la différence de latitude. La dernière formule de calcule de nouveau le même à l'aide de la première partie de mon équation.a
dans le diagramme est la différence de longitude,b
est la différence de latitude, par conséquent, dans la méthode que vous avez écrit, vous avez le mauvais sens.Essayer de changer et de voir ce qui se passe.
Voir Palund de réponse pour les réponses pour le reste de vos questions.
Essayez ceci pour la précision des résultats:
Vous pouvez tester de roulement résultat sur http://www.sunearthtools.com/tools/distance.php .
Si vous le souhaitez, vous pouvez prendre un coup d'oeil au code utilisé dans mixare réalité augmentée moteur, c'est sur github et il y a une version pour iPhone ainsi: github.com/mixare