Wie kann ich feststellen, ist der Abstand zwischen zwei Sätzen von Breiten- / Längenkoordinaten?

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

  •  18-09-2019
  •  | 
  •  

Frage

Ich versuche, etwas zu schreiben, das den Abstand zwischen zwei Sätzen von lat / lon Koordinaten bestimmen wird.

ich den folgenden Code verwenden, die ich auf dieser Seite :

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

Mein Problem ist, dass ich in den Compiler-Fehler bin mit "Der Name 'toRadians' / 'cos' / 'sin /' toDegrees' existiert nicht im aktuellen Kontext ..." Was mache ich falsch?

War es hilfreich?

Lösung

Sie möchten die folgende C # Klasse verwenden:

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
}

Verbrauch:

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

Quelle: Chris Pietsch - berechnen Abstand zwischen Geocodes in C # und JavaScript

Andere Tipps

Sie können eine toRadians Funktion wie folgt schreiben:

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

Sie können eine toDegrees Funktion wie folgt schreiben:

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

Sie sollten sin und cos mit Math.Sin und Math.Cos ersetzen.

Das sieht aus wie C #.

Zuerst müssen Sie toRadians und toDegrees definieren:

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

Dann die trigonometrischen Funktionen zu verwenden, die Sie verwenden Math.Sin benötigen, Math.Cos, etc.

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

und

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

Kommentare:

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

Was ist das? Wo sind latitude, longitude, destlat und destlon definiert? Weiterhin scheint es, Sie zu dieser Methode lat1, lon1 lat2 und lon2 als Parameter, so dass Sie nicht die Einheimischen hier mit dem gleichen Namen definieren können.

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

Das ist schlechter Stil. Wenn lat1 eine Breite in Grad darstellt, ist es viel besser, einen Radiant-Äquivalentwert von lat1 wie folgt zu berechnen:

double lat1Radians = toRadians(lat1);

So ersetzen Sie die oben mit:

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

Schließlich:

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

Das ist zu schlechten Stil. Die erste Formel und die zweite Formel können nicht beide für möglicherweise die Distanz, die Sie berechnen möchten. Sie sollten das Ergebnis der ersten Formel in eine Variable mit einem aussagekräftigeren Namen zuweisen. Als schlimmsten Fall, zumindest wie folgt vor:

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;

Ich weiß, diese Frage wirklich alt ist, aber falls jemand stolpert über diese, verwenden Sie GeoCoordinate von System.Device:

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

Die Berechnung Die Entfernung zwischen Breite und Länge Punkten ...

Doppel Lat1 = Convert.ToDouble (Breitengrad);

    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;

Sie gehen zu müssen, diesen Code ein wenig anzupassen.

Wie SLaks, sagt, müssen Sie Ihre eigene toRadians() Methode definieren, da .NET keine native Version haben.

Sie müssen auch die Anrufe zu cos ändern () und sin () zu sein: Math.cos () und Math.Sin ()

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top