Wie kann ich feststellen, ist der Abstand zwischen zwei Sätzen von Breiten- / Längenkoordinaten?
-
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?
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 ()