J'essaie de vérifier l'erreur introduitelorsque vous calculez la distance de deux points sur la terre avec la distance euclidienne au lieu d'utiliser la distance du grand cercle (gcd). J'ai deux points qui sont définis par leur lattitude et leur longtitude. J'ai utilisé le framework geopy python pour la grande distance de cercle. Voici le code pour le gcd:
def measure(self, a, b):
a, b = Point(a), Point(b)
lat1, lng1 = radians(degrees=a.latitude), radians(degrees=a.longitude)
lat2, lng2 = radians(degrees=b.latitude), radians(degrees=b.longitude)
sin_lat1, cos_lat1 = sin(lat1), cos(lat1)
sin_lat2, cos_lat2 = sin(lat2), cos(lat2)
delta_lng = lng2 - lng1
cos_delta_lng, sin_delta_lng = cos(delta_lng), sin(delta_lng)
d = atan2(sqrt((cos_lat2 * sin_delta_lng) ** 2 +
(cos_lat1 * sin_lat2 -
sin_lat1 * cos_lat2 * cos_delta_lng) ** 2),
sin_lat1 * sin_lat2 + cos_lat1 * cos_lat2 * cos_delta_lng)
return self.RADIUS * d
Donc ou deux points:
p1 = [39,8616, -75,0748], p2 = [- 7,30933,112,76]
la
gcd = 78.8433004543197 klm
en utilisant le great_circle(p1,p2).kilometers
fonction de geopy
J'ai ensuite transformé ces deux points en coordonnées cartésiennes en utilisant cette formule:
def spherical_to_cartesian(r,la,lo):
x=r*np.sin(90-la)*np.cos(lo)
y=r*np.sin(90-la)*np.sin(lo)
z=r*np.cos(90-la)
return (x,y,z)
où r=6372.795
, ce qui donne les coordonnées cartésiennes suivantes
p1=[ -765.81579368, -256.69640558, 6321.40405587],
p2=[480.8302149,-168.64726394,-6352.39140142]
Puis en tapant: np.linalg.norm(p2-p1)
Je reçois 1103.4963114787836
comme leur norme euclidienne qui ne semble pas raisonnable comparée à ~ 78klm du gcd. Est-ce que je prétends avoir tort?
Réponses:
1 pour la réponse № 1Python inclut deux fonctions dans le package mathématique; radians convertit les degrés en radians et degrés convertit les radians en degrés.
La méthode sin () renvoie le sinus de x, en radians.
import math
def spherical_to_cartesian(r,la,lo):
rlo = math.radians(lo)
rla = math.radians(90-la)
x=r*np.sin(rla)*np.cos(rlo)
y=r*np.sin(rla)*np.sin(rlo)
z=r*np.cos(rla)
return (x,y,z)