Esto se parece a C#.
En primer lugar debe definir toRadians
y toDegrees
:
double toRadians(double degrees) {
double sign = Math.Sign(degrees);
while(Math.Abs(degrees) > 360) {
degrees -= sign * 360;
}
return Math.PI * degrees/180;
}
double toDegrees(double radians) {
double sign = Math.Sign(radians);
while(Math.Abs(radians) > 2 * Math.PI) {
radians -= sign * 2 * Math.PI;
}
return 180 * radians/Math.PI;
}
A continuación, utilizar las funciones trigonométricas que necesita para utilizar Math.Sin
, Math.Cos
, etc.
double dist = Math.Sin(lat1) * Math.Sin(lat2)
+ Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(theta);
y
dist = toDegrees(Math.Acos(dist)) * 60 * 1.1515 * 1.609344 * 1000;
Comentarios:
public static double distance (double lat1, double lon1, double lat2, double lon2) {
double lat1 = Convert.ToDouble(latitude);
double lon1 = Convert.ToDouble(longitude);
double lat2 = Convert.ToDouble(destlat);
double lon2 = Convert.ToDouble(destlon);
¿Qué es? ¿Dónde se definen latitude
, longitude
, destlat
y destlon
definidos? Además, parece que tiene lat1
, lon1
lat2
y lon2
como parámetros de este método, por lo que no puede definir locales aquí con el mismo nombre.
double theta = toRadians(lon1-lon2);
lat1 = toRadians(lat1);
lon1 = toRadians(lon1);
lat2 = toRadians(lat2);
lon2 = toRadians(lon2);
Esto es un mal estilo. Si lat1
representa una latitud en grados, es mucho mejor para calcular un valor radianes equivalente de lat1
así:
double lat1Radians = toRadians(lat1);
Así remover lo anterior con:
double theta = toRadians(lon1-lon2);
double lat1Radians = toRadians(lat1);
double lon1Radians = toRadians(lon1);
double lat2Radians = toRadians(lat2);
double lon2Radians = toRadians(lon2);
Por último:
double dist = sin(lat1) * sin(lat2)
+ cos(lat1) * cos(lat2) * cos(theta);
dist = toDegrees(acos(dist)) * 60 * 1.1515 * 1.609344 * 1000;
Esto también es un mal estilo. La primera y la segunda fórmula no pueden representar la distancia que estás tratando de calcular. Debe asignar el resultado de la primera fórmula a una variable con un nombre más significativo.En el peor de los casos, al menos haga lo siguiente:
double temp = Math.Sin(lat1) * Math.Sin(lat2)
+ Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(theta);
double dist = toDegrees(Math.Acos(dist)) * 60 * 1.1515 * 1.609344 * 1000;
return dist;
Probablemente esté usando C#. – SLaks
¿Por qué llamas a 'Convert.ToDouble' en un' doble'? – SLaks
@SLaks: De acuerdo, acabo de notar el 'Convert.ToDouble'. – jason