2017-08-15 1 views
0

Je suis en train de faire des mesures en utilisant la CPU moins possible, donc je suis en utilisant une constante multiplicatrice pour arriver à une valeur en mètres comme ceci:Comment mesurer la distance entre deux coordonnées avec moins de calc?

lat1, long1 = 1 Coordonnée

lat2, long2 = Coordonnée 2

DistV := abs(lat1-lat2);     // Get a positive vertical value 
DistH := abs(lon1-long2);     // Get a positive horizontal value 
DistGPS := sqrt(sqr(DistV) + sqr(DistH)); // Get a diagonal value 
DistMeters := DistGPS*(111120*0.946);  // 111120*0.946 = Constant multiplicator to meters 

Cependant, les valeurs calculées vont être ajoutées aux mesures précédentes, ce qui rend nécessaire d'être précis. Est-ce que quelqu'un sait une meilleure façon de le faire?

+1

A peine (je ne sais même pas où votre constante utilisée dans votre code provient de) :) Mais pour [formule Haversine] utilisation haute précision (https://en.wikipedia.org/wiki/Haversine_formula), sinon traiter avec moins de précision. Pour un travail sérieux avec ce type de données, nous utilisions des bibliothèques éprouvées comme GEOS et Proj4 pour les projections (elles sont toutes deux utilisées dans PostGIS). – Victoria

+1

@Victoria La constante est une approximation très grossière de la longueur d'un arc, donné un angle, autour d'une sphère avec un rayon similaire à la moyenne de celle de la Terre. Le calcul est extrêmement approximatif - certainement pas à utiliser pour quelque chose de sérieux. –

+0

@J ..., vraiment rude. Je suis sur le point de publier notre solution cartographique en open source cette année, donc je connais un peu ce genre de choses. Pourtant, vous ne pouvez pas battre ce code en performance avec une meilleure précision. Si vous le pouvez, faites le moi savoir (bien que nous travaillons avec plus de précision par défaut, pas Haversine) :) – Victoria

Répondre

5

Pour mesurer une distance plus précisément, vous pouvez utiliser la formule de Haversine, comme indiqué dans les commentaires. Here vous pouvez voir la formule et la mise en œuvre JavaScript:

var R = 6371e3; // metres 
var φ1 = lat1.toRadians(); 
var φ2 = lat2.toRadians(); 
var Δφ = (lat2-lat1).toRadians(); 
var Δλ = (lon2-lon1).toRadians(); 

var a = Math.sin(Δφ/2) * Math.sin(Δφ/2) + 
     Math.cos(φ1) * Math.cos(φ2) * 
     Math.sin(Δλ/2) * Math.sin(Δλ/2); 
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 

var d = R * c; 

Si vous pensez que grossière approximation est assez bon pour des fins vous, vous pouvez le rendre plus précis ce qui représente une contraction de la distance le long du méridien (au lieu de constante commune pour les coordonnées) :

DistV := abs(lat1-lat2);     // Get a positive vertical value 
DistH := abs(lon1-long2);     // Get a positive horizontal value 
DistH := DistH * Cos((lat1+lat2)/2);  // Use average latitude    
DistGPS := sqrt(sqr(DistV) + sqr(DistH)); // Get a diagonal value 
DistMeters := DistGPS*111120; //to meters 
+1

Voici une implémentation dans Delphi: https://rosettacode.org/wiki/Haversine_formula#Delphi – dummzeuch