سؤال

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

لا أستطيع التفاف رأسي حول كيفية التعامل مع هذا. لقد فكرت باستخدام راديان حتى، لكن لا شيء يبدو أنه يلبي الشرط.

FYI، مكدس مصباح الذهاب هنا ...

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

المحلول

سيقوم الاستعلام التالي بحساب المسافة بين كل نقاطك وإرجاع الاثنين بأكبر المسافة:

SELECT coor1.longitude as lon1,
       coor1.latitude as lat1,
       coor2.longitude as lon2,
       coor2.latitude as lat2,
       (ACOS(
         COS(RADIANS(coor1.latitude))  * 
         COS(RADIANS(coor1.longitude)) *
         COS(RADIANS(coor2.latitude))  *
         COS(RADIANS(coor2.longitude)) + 
         COS(RADIANS(coor1.latitude))  *
         SIN(RADIANS(coor1.longitude)) *
         COS(RADIANS(coor2.latitude))  *
         SIN(RADIANS(coor2.longitude)) +
         SIN(RADIANS(coor1.latitude))  * 
         SIN(RADIANS(coor2.latitude))
         ) * 6378                        --- Use 3963.1 for miles
       ) 
AS DistanceKM
FROM coordinates coor1,
     coordinates coor2
WHERE NOT (coor1.longitude = coor2.longitude AND coor1.latitude = coor2.latitude)
ORDER BY DistanceKM DESC
LIMIT 1;                                 --- Only the biggest

الآن أوصي بهذه العمليات الحسابية قبل يد وتخزين النتيجة في جدول منفصل.

نصائح أخرى

من خلال نظراتها، يمكن حل هذا عن طريق العثور على أولا هيكل محدب من النقاط (باستخدام فحص غراهام, ، على سبيل المثال)، ثم القيام به تدوير الفرجار للقطر على ذلك.

نهج القوة الغاشمة:

  1. ابحث عن مركز قائمة قائمتك من العاشرة عن طريق توجيه قيم خطوط الطول والخطوط.

  2. بالنسبة لكل زوج (خطوط الطول والعرض) في قاعدة البيانات الخاصة بك، استخدم صيغة الدائرة العظيمة لحساب المسافة من المركز من الخطوة (1)

  3. اختيار أعظم مسافة اثنين.

التحسين الواضح: كسر العالم إلى N "المربعات" (على سبيل المثال، 10 درجات الطول، خط العرض 10 درجات) وحسب مسافة دائرة كبيرة بين مراكز كل زوج. تخزين هذا في قاعدة البيانات. الآن يمكنك البحث عن أبعد من أزواج "المربعات" وبعدها فقط (خطوط الطول والعرض) داخل تلك البلاط.

هنا الخوارزمية نفذت في PHP للمسافة بين نقطتين بناء على خطوط الطول والعرض.

لاحظ أنه إذا كانت "مجموعة فرعية من إجمالي الإدخالات" كبيرة، فستكون لديك بسرعة كبيرة من الحسابات للقيام بها. إذا كان هذا هو الحال، فقد ترغب في النظر في مسافات حساب مسبقة بين أزواج المدينة.

تحرير: لماذا لا يعمل تحسين 10 درجة:

خذ أربعة مربعات كما هو موضح أدناه

-------------------
|        |        |
|   A    |   B    |
|        |        |
|_______1|________|
|        |2       |
|   C    |   D    |
|        |        |
|_______3|________|

من خلال قياس مراكز المربعات فقط ومقارنة هذه المسافات، يمكنك الحصول على أكثر من A و D أكثر من A و C. ومع ذلك، من الواضح أن المدن 1 و 3 أكثر من 1 و 2.

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