كيف يمكنني حساب السمت (الزاوية إلى الشمال) بين إحداثيات WGS84

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

  •  22-07-2019
  •  | 
  •  

سؤال

لقد حصلت على إحداثيات WGS84، خطوط الطول والعرض بالدرجات.هذه النقاط قريبة من بعضها البعض، على سبيل المثال.على بعد متر واحد فقط.

هل هناك طريقة سهلة لحساب سمت الخط الفاصل بين هذه النقاط، أي الزاوية نحو الشمال؟

سيكون النهج الساذج هو افتراض نظام الإحداثيات الديكارتية (لأن هذه النقاط قريبة جدًا من بعضها البعض) ومجرد استخدام

الخطيئة (أ) = القيمة المطلقة (L2-L1) / جذر (جكر (L2-L1) + جذر (B2-B1))

أ = السمت L1 ، L2 = خط الطول B1 ، B2 = خط العرض

سيكون الخطأ أكبر عندما تبتعد الإحداثيات عن خط الاستواء، لأن المسافة بين درجتين طوليتين تصبح أصغر بشكل متزايد من المسافة بين درجتي عرض (والتي تظل ثابتة).

لقد وجدت بعض الصيغ المعقدة جدًا والتي لا أرغب حقًا في تنفيذها لأنها تبدو مبالغة في التعامل مع النقاط المتقاربة جدًا ولا أحتاج إلى دقة عالية جدًا (يكفي وجود رقمين عشريين، وربما يكون واحدًا جيدًا أيضًا نظرًا لوجود هي عوامل أخرى تقلل الدقة على أي حال، مثل العامل الذي يعرضه نظام تحديد المواقع العالمي (GPS).

ربما يمكنني فقط تحديد عامل تصحيح طولي تقريبي اعتمادًا على خط العرض واستخدام شيء مثل هذا:

الخطيئة (أ) = القيمة المطلقة (L2*f-L1*f) / sqrt(L2*f-L1*f) + sqr(B2-B1))

حيث f هو عامل التصحيح

أي تلميحات؟

(لا أرغب في استخدام أي مكتبات لهذا الغرض، خاصة تلك التي تتطلب تراخيص وقت التشغيل.أي مصدر دلفي MPLed سيكون رائعًا.)

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

المحلول

الصيغ التي تشير إليها في النص هي لحساب مسافة الدائرة الكبرى بين نقطتين.إليك كيفية حساب الزاوية بين النقاط:

uses Math, ...;
...

const
  cNO_ANGLE=-999;

...

function getAngleBetweenPoints(X1,Y1,X2,Y2:double):double;
var
  dx,dy:double;
begin
  dx := X2 - X1;
  dy := Y2 - Y1;

  if (dx > 0) then  result := (Pi*0.5) - ArcTan(dy/dx)   else
  if (dx < 0) then  result := (Pi*1.5) - ArcTan(dy/dx)   else
  if (dy > 0) then  result := 0                          else
  if (dy < 0) then  result := Pi                         else
                    result := cNO_ANGLE; // the 2 points are equal

  result := RadToDeg(result);
end;
  • تذكر أن تتعامل مع الموقف الذي تكون فيه نقطتان متساويتان (تحقق مما إذا كانت النتيجة تساوي cNO_ANGLE، أو قم بتعديل الوظيفة لطرح استثناء)؛

  • تفترض هذه الوظيفة أنك على سطح مستو.مع المسافات الصغيرة التي ذكرتها، كل هذا جيد، ولكن إذا كنت ستحسب الاتجاه بين المدن في جميع أنحاء العالم، فقد ترغب في النظر في شيء يأخذ شكل الأرض في العد؛

  • من الأفضل تزويد هذه الوظيفة بإحداثيات تم تعيينها بالفعل على سطح مستو.يمكنك تغذية WGS84 Latitude مباشرةً إلى Y (وخط الطول إلى X) للحصول على تقدير تقريبي.

نصائح أخرى

هنا هو الحل C#.تم اختباره لزوايا 0، 45، 90، 135، 180، 225، 270 و315.

يحرر لقد استبدلت الحل القبيح السابق بترجمة C# لحل Wouter:

public double GetAzimuth(LatLng destination)
{
    var longitudinalDifference = destination.Lng - this.Lng;
    var latitudinalDifference = destination.Lat - this.Lat;
    var azimuth = (Math.PI * .5d) - Math.Atan(latitudinalDifference / longitudinalDifference);
    if (longitudinalDifference > 0) return azimuth;
    else if (longitudinalDifference < 0) return azimuth + Math.PI;
    else if (latitudinalDifference < 0) return Math.PI;
    return 0d;
}

public double GetDegreesAzimuth(LatLng destination)
{
    return RadiansToDegreesConversionFactor * GetAzimuth(destination);
}

ولقد وجدت هذا الرابط

http://williams.best.vwh.net/avform.htm

والتي وردت في الإجابة على

خطوط الطول / العرض + بعد + العنوان -> خطوط الطول / العرض

وهذا يبدو واعدا، وخصوصا تقريب الأرض ثابت معين قرب نهاية.

وهذا من شأنه أن تعمل فقط من أجل الفروق الصغيرة. وإلا لا يمكنك مجرد "latitudinalDifference / longitudinalDifference".

وأوصي تنفيذ معامل التصحيح بناء على العرض. I تنفيذ روتين مزيف مرة واحدة للعودة جميع السجلات اشتملت داخل س ميلا من بقعة محددة واجهت قضايا مزيف. للأسف ليس لدي رمز بعد الآن، ويمكن أن يبدو أن نتذكر كيف وصلت إلى عدد تصحيح ولكن كنت على الطريق الصحيح.

وقد اختبرت أي شخص هذا؟ فإنه لا يرجع على الإجابات الصحيحة

هذه الوظيفة يفترض أن كنت على سطح مستو. مع المسافات الصغيرة التي كنت قد ذكرت هذا هو كل شيء على ما يرام، ولكن إذا كنت تريد الذهاب لحساب العنوان بين المدن في جميع أنحاء العالم قد ترغب في النظر في شيء أن يأخذ شكل الأرض في العد؛

والأرض مسطحة الخاصة بك لديه الكثير لتفعله مع هذا. الخطأ، كما تسمونه، هو لأنك حساب السمت الأولي من وجهة نظر. إلا إذا كنت متوجها مباشرة الى القطب، سوف العلاقة إلى القطب تتغير مع المسافة. بغض النظر، والبرنامج المذكور أعلاه لا يرجع النتائج الصحيحة.

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