En plus les arrondis des rayons sont différents: - 6366,000 km pour la formule PHP - 6378,137 km aux pôles et - 6356,752 km à l'équateur pour la formule Python
Près de 20 kilomètres d'écart entre les deux dernières, ce n'est pas rien et c'est TRES significatif (la formule simplifiée en PHP n'en tient pas compte). La différence est de l'ordre de 1/3000 C'est suffisant comme différence pour ne pas pouvoir distinguer deux points dans OSM ; comme si on passait d'une carte à précision décimétrique (OSM) à une carte de précision seulement kilométrique (ou hectométrique aux latitudes moyennes). Si on n'en tient pas compte, il ne sert alors plus à rien de donner le résultat obtenu sur le chemin total avec une précision décimétrique, les derniers chiffres étant tous complètement faux. Au mieux on ne peut arrondir le résultat qu'à 100 mètres près (c'est pas si mal, mais ça passe mal pour mesurer des objets plus petits qu'un itinéraire routier, par exemple le rayon d'un rond-point, la longueur correcte d'une rue de quelques centaines de mètres, ou obtenir une distance asez précise entre deux points de visées). Pour des distances d'approche ou de sécrité en vol à basse altitude, on peut rater la piste et se poser loin ou se crasher (pas les avions de ligne qui ont de bons instruments et un guidage imposé depuis le sol, et n'aterrissent que sur des aéroports bien balisés, mais pour la navigation amateur sur des petits aérodromes c'est plus problématique, l'approche se fait surtout à vue et on a besoin de pouvoir localiser précisément ce qui est autour: la précision décimétrique ou au minimum métrique, mais surtout pas kilométrique, est nécessaire même si pour l'itinéraire entier sur des centaines de kilomètres la différence n'est pas très significative...) Cependant si on veut optimiser le calcul des distances, pour mesurer les longueurs de ways, on a aussi intérêt à faire la transformation des coordonnées cartographiques(avec ou sans altitude) en coordonnées cartésiennes une seule fois et non deux fois pour chaque point intermédiaire, les formules ne sont pas rapides car on le fait sur des centaines ou des milliers de points. Une boucle parcourera chaque point d'un chemin en les convertissant tout de suite en cartésiennes, puis on ne garde que les cartésiennes dans la boucle. Sur une appli interactive, la différence de temps se fait vite sentir sur les chemins longs avec ne nombreux points. Il fallait le préciser pour que les formules ne soient pas utilisées sans précaution : on doit savoir ce qui est une approximation et quelles en sont les limitations pour ne pas les appliquer à tout. D'ailleurs c'est sur la mesure des petits objets qu'il faut plus de précision d'autant plus qu'on n'a pas beaucoup de noeuds pour les définir et que leur géométrie est déjà approximative avec de nombreux virages dessinés avec des angles trop importants qui parfois font même des segments sortant complètement de la chaussée Autre exemple, mesure d'une distance entre un panneau et un carrefour dans un virage : sur un assistant de navigation cela fait une différence dans le temps que met le navigateur à nous avertir de l'approche d'un carrefour et de la bonne voie à prendre, il peut réagir trop tard... et on aura loupé une sortie, ou celui ci peut nous induire en erreur en nous demandant de tourner à droite au carrefour suivant alors qu'au bon carrefour il nous disait de continuer tout droit, et ce n'est pas juste une question de précision du récepteur GPS. Heureusement OSM cherche à produire une cartographie décimétrique. Pour la précision kilométrique, on a assez de cartes statiques depuis longtemps sans OSM (mais avec peu de renseignements locaux), qui sont immédiatement utilisables mais réduisent souvent toute une ville à une grosse icône sans le détail des rues (ou seulement quelques grands axes sommairement tracés dans les plus grandes). Le 30 juin 2016 à 12:42, Philippe Verdy <verd...@wanadoo.fr> a écrit : > Ce n'est pas juste de l'optimisation, c'est de la géométrie... Ces > formules étaient données pour être exactes. > > Oui cela fait une différence, certe petite, mais tout dépend de la > précision qu'on attend (même 0,01% cela fait vite une différence mesurable > sur une distance assez longue (toutefois non significative si c'est un > trajet routier car on ne tient pas compte de la géométrie des voies sur les > routes et des petits écarts à droit ou à gauche et encore moins des > dépassements). > > En revanche la non-rotondité de la terre a une impact bien plus important > que la petite erreur sur la non-orthonormie du repère sur l'axe des > altitudes. Dans OSM on utilise le géoïde WGS84 partout, pas la sphère ! Et > là ce calcul PHP ne tenait compte que du rayon moyen de la sphère (qui est > correct uniquement aux latitudes moyennes : les distances seront trop > courtes à l'équateur et trop longues aux pôles). La formule Python est bien > meilleure. > > > Le 30 juin 2016 à 12:08, <osm.sanspourr...@spamgourmet.com> a écrit : > >> C'est vraiment de l'optimisation à la petite semaine car le calcul d'une >> valeur absolue n'est pas bien compliqué. >> >> Bien plus intéressant est de changer la dimension des lignes afin de >> stocker la distance depuis le premier nœud. >> Typiquement dans un modèle d'itinéraire tu ajoutes deux coûts : le coût >> en distance et le coût en temps (en plus des lat/lon et éventuellement ele). >> >> N.B. : les points étant rapprochés, je doute même de la nécessité de >> tenir compte de la rotondité de la terre entre deux points, une droite >> géométrique est, étant donné l'absence d'information sur l'altitude, à >> peine plus fausse qu'une ligne loxodromique. >> >> Adrien, si jamais ton calcul depuis le GPX tient compte de l'élévation et >> si la trace est de bonne qualité, tu dois avoir le meilleur calcul... qui >> plus est sans effort de programmation. >> >> Jean-Yvon >> >> Le 30/06/2016 à 11:38, Philippe Verdy - verd...@wanadoo.fr a écrit : >> >> D'ailleurs dans la formule Python les fonctions abs() pour les trois >> composantes distParallele, distMeridien, et distVertical sont inutiles, >> puisqu'on ne va utiliser que leur carré respectif. Il suffit juste de les >> voir comme des composantes d'un vecteur 3D orienté et non comme des >> distances positives. >> >> Le 30 juin 2016 à 07:52, <pepilepi...@ovh.fr>pepilepi...@ovh.fr < >> pepilepi...@ovh.fr> a écrit : >> >>> Le 29/06/2016 à 23:20, François Lacombe a écrit : >>> >>> Bonjour Adrien, >>> >>> A mon sens c'est un calcul de distance loxodromique entre chaque nœud, >>> de chaque portion de véloroute qui composent le chemin à parcourir. >>> https://fr.wikipedia.org/wiki/Loxodromie >>> >>> Concrètement, voici un bout de PHP qui te donne la distance entre deux >>> points dont tu connais le lat/lon >>> Tu n'as plus qu'à faire la somme de tous tes segments pour avoir la >>> distance totale >>> >>> $l = 6366 * 2 * asin( >>> sqrt( >>> pow( sin((deg2rad($lat)-deg2rad($ll[1]))/2) >>> , 2) + cos(deg2rad($lat))*cos(deg2rad($ll[1]))* pow( >>> sin((deg2rad($lng)-deg2rad($ll[0]))/2) , 2) >>> ) >>> ); >>> >>> >>> >>> Pour ceux que ça peut intéresser la même chose en Python : >>> >>> import math >>> >>> def distance ( lat1 , lon1 , lat2 , lon2 , alt1 , alt2 ) : >>> rEquat = 6378137 >>> rPole = 6356752 >>> rLat = rEquat - ( ( rEquat - rPole ) * abs( lat1 / 90 ) ) + alt1 >>> >>> distParallele = abs ( rLat * math.cos( (( lat1 + lat2 ) / 2 ) * >>> math.pi / 180 ) * ( ( lon2 - lon1 ) * math.pi / 180 ) ) >>> distMeridien = abs ( rLat * ( lat2 - lat1 ) * math.pi / 180 ) >>> distVerticale = abs ( alt2 - alt1 ) >>> distTotale = math.sqrt ( ( distParallele * distParallele ) + >>> ( distMeridien * distMeridien ) + ( distVerticale * distVerticale ) ) >>> >>> return distTotale >>> >>> (distance en mètres) >>> >>> >>> >>> >>> >>> >>> Où $lat et $lng sont les coordonnées de ton point B et $ll[0] et $ll[1] >>> celles de ton point A. >>> Cette formule a un défaut : elle ne tient pas compte de l'altitude des >>> points, réputée négligeable ici. >>> >>> >>> A+ >>> >>> *François Lacombe* >>> >>> fl dot infosreseaux At gmail dot com >>> www.infos-reseaux.com >>> @InfosReseaux <http://www.twitter.com/InfosReseaux> >>> >>> Le 29 juin 2016 à 20:46, adrien < <pe...@adrieng.fr>pe...@adrieng.fr> a >>> écrit : >>> >>>> Bonjour, >>>> >>>> J'aimerais connaître la distance entre deux points sur une relation >>>> route=bicycle,en l'occurence la distance entre Nantes et Blain sur la >>>> Vélodyssée. >>>> >>>> Je suppose que c'est facilement faisable, mais je sèche complètement sur >>>> comment faire, et quel outils utiliser… >>>> >>>> Si vous avez des pistes, je vous en serait reconnaissant. >>>> >>>> Bonne soirée >>>> >>>> Adrien >>>> >>>> >>>> _______________________________________________ >>>> Talk-fr mailing list >>>> Talk-fr@openstreetmap.org >>>> https://lists.openstreetmap.org/listinfo/talk-fr >>>> >>> >>> >>> >>> _______________________________________________ >>> Talk-fr mailing >>> listTalk-fr@openstreetmap.orghttps://lists.openstreetmap.org/listinfo/talk-fr >>> >>> >>> >>> _______________________________________________ >>> Talk-fr mailing list >>> Talk-fr@openstreetmap.org >>> https://lists.openstreetmap.org/listinfo/talk-fr >>> >>> >> >> >> _______________________________________________ >> Talk-fr mailing >> listTalk-fr@openstreetmap.orghttps://lists.openstreetmap.org/listinfo/talk-fr >> >> >> >> _______________________________________________ >> Talk-fr mailing list >> Talk-fr@openstreetmap.org >> https://lists.openstreetmap.org/listinfo/talk-fr >> >> >
_______________________________________________ Talk-fr mailing list Talk-fr@openstreetmap.org https://lists.openstreetmap.org/listinfo/talk-fr