Come è possibile determinare la distanza tra due serie di coordinate di latitudine / longitudine?

StackOverflow https://stackoverflow.com/questions/2010466

  •  18-09-2019
  •  | 
  •  

Domanda

sto cercando di scrivere qualcosa che determinerà la distanza tra due serie di coordinate Lat / Lon.

Sto usando il seguente codice che ho trovato su questo sito :

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);

    double theta = toRadians(lon1-lon2); 
    lat1 = toRadians(lat1); 
    lon1 = toRadians(lon1); 
    lat2 = toRadians(lat2); 
    lon2 = toRadians(lon2); 

    double dist = sin(lat1)*sin(lat2) + cos(lat1)*cos(lat2)*cos(theta); 
    dist = toDegrees(acos(dist)) * 60 * 1.1515 * 1.609344 * 1000; 

    return dist; 
} 

Il mio problema è che io sono in esecuzione in errore di compilazione "non esiste / 'cos' / 'sen /' toDegrees Il nome 'toRadians' nel contesto attuale ..." Cosa sto sbagliando?

È stato utile?

Soluzione

Si consiglia di utilizzare la seguente classe C #:

public static class GeoCodeCalc
{
    public const double EarthRadiusInMiles = 3956.0;
    public const double EarthRadiusInKilometers = 6367.0;

    public static double ToRadian(double val) { return val * (Math.PI / 180); }
    public static double DiffRadian(double val1, double val2) { return ToRadian(val2) - ToRadian(val1); }

    public static double CalcDistance(double lat1, double lng1, double lat2, double lng2) 
    {
        return CalcDistance(lat1, lng1, lat2, lng2, GeoCodeCalcMeasurement.Miles);
    }

    public static double CalcDistance(double lat1, double lng1, double lat2, double lng2, GeoCodeCalcMeasurement m) 
    {
        double radius = GeoCodeCalc.EarthRadiusInMiles;

        if (m == GeoCodeCalcMeasurement.Kilometers) { radius = GeoCodeCalc.EarthRadiusInKilometers; }
        return radius * 2 * Math.Asin( Math.Min(1, Math.Sqrt( ( Math.Pow(Math.Sin((DiffRadian(lat1, lat2)) / 2.0), 2.0) + Math.Cos(ToRadian(lat1)) * Math.Cos(ToRadian(lat2)) * Math.Pow(Math.Sin((DiffRadian(lng1, lng2)) / 2.0), 2.0) ) ) ) );
    }
}

public enum GeoCodeCalcMeasurement : int
{
    Miles = 0,
    Kilometers = 1
}

Utilizzo:

// Calculate Distance in Miles
GeoCodeCalc.CalcDistance(47.8131545175277, -122.783203125, 42.0982224111897, -87.890625);

// Calculate Distance in Kilometers
GeoCodeCalc.CalcDistance(47.8131545175277, -122.783203125, 42.0982224111897, -87.890625, GeoCodeCalcMeasurement.Kilometers);

Fonte: Chris Pietschmann - calcolare la distanza tra il geocoding in C # e JavaScript

Altri suggerimenti

È possibile scrivere una funzione toRadians come questo:

double ToRadians(double degrees) { return degrees * Math.PI / 180; }

È possibile scrivere una funzione toDegrees come questo:

double ToDegrees(double radians) { return radians * 180 / Math.PI; }

È necessario sostituire sin e cos con Math.Sin e Math.Cos.

Questo appare come C #.

Per prima cosa è necessario definire toRadians e 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;
}

Quindi, per utilizzare le funzioni trigonometriche è necessario utilizzare Math.Sin, Math.Cos, ecc.

double dist = Math.Sin(lat1) * Math.Sin(lat2)
                + Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(theta);

e

dist = toDegrees(Math.Acos(dist)) * 60 * 1.1515 * 1.609344 * 1000; 

Commenti:

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);

Che cosa è questo? Dove sono latitude, longitude, destlat e destlon definiti? Inoltre, sembra che hai lat1, lon1 lat2 e lon2 come parametri a questo metodo in modo che non è possibile definire i locali qui con lo stesso nome.

double theta = toRadians(lon1-lon2); 
lat1 = toRadians(lat1); 
lon1 = toRadians(lon1); 
lat2 = toRadians(lat2); 
lon2 = toRadians(lon2); 

Questa è cattivo stile. Se lat1 rappresenta una latitudine in gradi è molto meglio per calcolare un valore radianti-equivalenti di lat1 così:

double lat1Radians = toRadians(lat1);

In questo modo sostituire il precedente con:

double theta = toRadians(lon1-lon2); 
double lat1Radians = toRadians(lat1); 
double lon1Radians = toRadians(lon1); 
double lat2Radians = toRadians(lat2); 
double lon2Radians = toRadians(lon2);

Infine:

double dist = sin(lat1) * sin(lat2)
                + cos(lat1) * cos(lat2) * cos(theta); 
dist = toDegrees(acos(dist)) * 60 * 1.1515 * 1.609344 * 1000; 

Questo è un cattivo stile troppo. La prima formula e la seconda formula non possono essere entrambi forse rappresentare la distanza che si sta cercando di calcolare. Si dovrebbe assegnare il risultato della prima formula per una variabile con un nome più significativo. Come caso peggiore, almeno effettuare le seguenti operazioni:

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;

So che questa domanda è molto vecchio, ma nel caso qualcuno altro si imbatte in questa operazione, utilizzare GeoCoordinate da System.Device:

var distanceInMeters = new GeoCoordinate(lat1, lon1)
    .GetDistanceTo(new GeoCoordinate(lat2, lon2));

Calcolo Distanza tra Latitudine e Longitudine punti ...

doppia Lat1 = Convert.ToDouble (latitudine);

    double Long1 = Convert.ToDouble(longitude);

    double Lat2 = 30.678;
    double Long2 = 45.786;
    double circumference = 40000.0; // Earth's circumference at the equator in km
    double distance = 0.0;
    double latitude1Rad = DegreesToRadians(Lat1);
    double latititude2Rad = DegreesToRadians(Lat2);
    double longitude1Rad = DegreesToRadians(Long1);
    double longitude2Rad = DegreesToRadians(Long2);
    double logitudeDiff = Math.Abs(longitude1Rad - longitude2Rad);
    if (logitudeDiff > Math.PI)
    {
        logitudeDiff = 2.0 * Math.PI - logitudeDiff;
    }
    double angleCalculation =
        Math.Acos(
          Math.Sin(latititude2Rad) * Math.Sin(latitude1Rad) +
          Math.Cos(latititude2Rad) * Math.Cos(latitude1Rad) * Math.Cos(logitudeDiff));
    distance = circumference * angleCalculation / (2.0 * Math.PI);
    return distance;

Si sta andando ad avere bisogno di adattare questo codice un po '.

Come SLaks, dice, è necessario definire il proprio metodo di toRadians() perché .NET non dispone di una versione nativa.

Sarà inoltre necessario modificare le chiamate a cos () e sin () di essere: Math.cos () e Math.sin ()

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top