Le calcul des coordonnées d'un portant et d'une distance
J'ai des problèmes de mise en œuvre de la fonction décrite ici ici.
C'est mon implémentation Java:
private static double[] pointRadialDistance(double lat1, double lon1,
double radianBearing, double radialDistance) {
double lat = Math.asin(Math.sin(lat1)*Math.cos(radialDistance)+Math.cos(lat1)
*Math.sin(radialDistance)*Math.cos(radianBearing));
double lon;
if(Math.cos(lat) == 0) { //Endpoint a pole
lon=lon1;
}
else {
lon = ((lon1-Math.asin(Math.sin(radianBearing)*Math.sin(radialDistance)/Math.cos(lat))
+Math.PI) % (2*Math.PI)) - Math.PI;
}
return (new double[]{lat, lon});
}
- Je convertir le degré de roulement pour les radians et de convertir de la distance (km) en radians distance avant d'appeler la fonction - ce qui n'est pas le problème.
Cependant, lorsque j'ai d'entrée de coordonnées telles que:
lat = 49.25705;
lon = -123.140259;
avec une direction de 225 (sud-ouest) et une distance de 1 km
- Je obtenir cette retourné:
lat: -1.0085434360125864
lon: -3.7595299668539504
Sa toute évidence, n'est pas correcte, n'importe qui peut voir ce que je fais de mal?
Grâce
Essayez quelques très simple d'entrées. Par exemple, entrez lat == lon == 0 (près de l'Afrique, en fait) avec un palier de zéro et la distance à zéro. Avez-vous d'obtenir votre point de départ arrière? L'étendre à essayer d'autres lats et lons-le-saunier, le cas échéant. Ensuite, essayez d'ajouter une gamme: avez-vous quelque chose d'intelligent?
OriginalL'auteur user106996 | 2009-05-18
Vous devez vous connecter pour publier un commentaire.
Il semble que ce sont des problèmes dans votre code:
lat1
etlon1
en radians avant d'appeler votre fonction.radialDistance
de manière incorrecte.abs(x-y) < threshold
est plus sûr quex == y
pour le test de deux nombres à virgule flottantex
ety
pour l'égalité.lat
etlon
de radians en degrés.Voici ma mise en œuvre de votre code en Python:
Voici le résultat:
Vous pouvez utiliser les haut-mathématiques.radians et en mathématiques.degrés au lieu des fonctions personnalisées.
Je pense également que: rdistance = distance / rEarth # normaliser distance linéaire de radian de l'angle est une mauvaise idée peut causer zéro rdistance si la distance est entier.
OriginalL'auteur
Fondamentalement, il semble que votre problème est que vous êtes de passage à la latitude, la longitude et portant en degrés plutôt que de radians. Essayer de s'assurer que vous êtes toujours en passant radians à votre fonction et voir ce que vous obtenez en retour.
PS: voir des problèmes similaires discuté ici et ici.
Oui, vous devez entrer vos angulaire entrées en radians.
OriginalL'auteur Bob Cross
Je pense qu'il y a un problème dans l'Algorithme fourni dans le message 5.
Il fonctionne, mais uniquement pour la latitude, de la longitude, il y a un problème en raison de l'enseigne.
Les données parlent d'elles-mêmes :
Si vous démarrez à partir de -123.14° et allez à l'OUEST, vous devriez avoir quelque chose de LOIN à l'OUEST. Là, nous revenons à l'EST (-123.13) !
La formule comprend quelque part :
avant de radian la conversion.
OriginalL'auteur Stéphane
Quand je l'ai fait, mon résultant latitudes étaient corrects, mais les longitudes étaient mauvais.
Par exemple point de départ: 36.9460678 N 9.434807 E, Portant 45.03334, la Distance 15.0083313 km
Le résultat a été 37.0412865 N 9.315302 E
C'est plus à l'ouest que mon point de départ, plutôt que plus à l'est. En fait, c'est comme si le roulement a été 315.03334 degrés.
Plus de recherches sur le web m'a conduit à: http://www.movable-type.co.uk/scripts/latlong.html
La longitude de code ci-dessous (en C# avec tout en radians)
Cela semble bien fonctionner pour moi. J'espère que c'est utile.
OriginalL'auteur
Merci pour votre code python
J'ai essayé de la configurer dans mon cas d'utilisation
où je suis en train de trouver la latitude et de la longitude d'un point dans l'entre deux autres
à une distance donnée à partir du premier point, donc il est tout à fait similare à votre code
appart que mon roulement est calculée dynamiquement
startpoint(lat1) lon1/lat1 = 55.625541,-21.142463
point de fin (lat2) lon2/lat2 = 55.625792,-22.142248
mon résultat devrait être un point entre ces deux à lon3/lat3
unfortunetly-je obtenir lon3/lat3 = 0.0267695450609,0.0223553243666
J'ai pensé que cela pourrait être une différence en latitude /longitude, mais pas de
lorsque j'ajoute ou sub il il n'est pas bon
tout conseil serait vraiment génial
Grâce
voici ma mise en œuvre
distance = 0.001
epsilon = 0.000001
calcul portant dynamiquement
calcul lat3 lon3 dynamiquement
OriginalL'auteur Tibor
Tout fonctionne comme prévu, mais le problème est que vos maths suppose que la Terre était une sphère, alors qu'en réalité il se rapproche d'un ellipsoïde.
Un rapide chalut de vos favorisée moteurs de recherche pour 'Vincenty Formule" s'avérera utile.
OriginalL'auteur Ximines