كيف يمكنني تحديد المسافة بين مجموعتين من إحداثيات خطوط الطول / خط الطول؟

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

  •  18-09-2019
  •  | 
  •  

سؤال

أحاول كتابة شيء سيحدد المسافة بين مجموعات من إحداثيات Lat / Lat / Lat.

أنا أستخدم الكود التالي الذي وجدته هذا الموقع:

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

مشكلتي هي أنني أعاني من خطأ الترجمة "اسم" Toradians "/" COS "/" SIN / "Teedegrees" غير موجود في السياق الحالي ... " ما الخطأ الذي افعله؟

هل كانت مفيدة؟

المحلول

قد ترغب في استخدام فئة 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
}

الاستعمال:

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

مصدر: Chris Pietschmann - حساب المسافة بين الجغرافيين في C # وجافا سكريبت

نصائح أخرى

يمكنك كتابة toRadians وظيفة مثل هذا:

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

يمكنك كتابة toDegrees وظيفة مثل هذا:

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

يجب أن تحل محل sin و cos مع Math.Sin و Math.Cos.

هذا يبدو وكأنه ج #.

تحتاج أولا إلى تحديد toRadians و 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;
}

ثم، لاستخدام الوظائف المثلثية تحتاج إلى استخدامها Math.Sin, Math.Cos, ، إلخ.

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

و

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

تعليقات:

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

ما هذا؟ أين latitude, longitude, destlat و destlon معرف؟ علاوة على ذلك، يبدو أن لديك lat1, lon1 lat2 و lon2 كمعلمات لهذه الطريقة حتى لا تتمكن من تحديد السكان المحليين هنا بنفس الاسم.

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

هذا أسلوب سيء. إذا lat1 يمثل خطوط خط العرض بالدرجات، من الأفضل بكثير حساب قيمة مكافئة من الرضيات lat1 مثله:

double lat1Radians = toRadians(lat1);

وبالتالي استبدال ما سبق مع:

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

أخيرا:

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

هذا أسلوب سيء أيضا. لا يمكن أن يمثل الصيغة الأولى والصيغة الثانية المسافة التي تحاول حسابها. يجب عليك تعيين نتيجة الصيغة الأولى إلى متغير مع اسم أكثر معنى. كحالة أسوأ، على الأقل ما يلي:

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;

أعرف أن هذا السؤال قديم حقا، ولكن في حالة تعثر أي شخص آخر عبر هذا، استخدم GeoCoordinate من System.Device:

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

حساب المسافة بين نقاط خطوط الطول والعرض ...

Double Lat1 = تحويل.todouble (خط العرض)؛

    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;

ستحتاج إلى تكييف هذا الرمز قليلا.

كما Slaks، ستقول، سوف تحتاج إلى تحديد الخاصة بك toRadians() الطريقة لأن .NET ليس لديها نسخة أصلية.

ستحتاج أيضا إلى تغيير المكالمات إلى كوس () و SIN () أن تكون: Math.cos () والرياضيات .sin ()

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top