سؤال

في قاعدة البيانات الخاصة بي، أقوم بتخزين نقطة مركزية، بالإضافة إلى نصف قطر (بالأمتار).

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

صيغة هافيرسين:( 3959 * عكوس( كوس( راديان(40) ) * كوس( راديان( خطوط العرض ) ) * كوس( راديان( long ) - راديان(-110)) + خطيئة(راديان(40)) * خطيئة(راديان( long ) ) )

ديسيبل:

دائرة اللات سنتر، دائرة اللنج سنتر، نصف القطر

تمرير> حدد معرفًا من Foo حيث LAT ، LNG In (Make Circle Function:دائرة العرض، طول الدائرة، نصف القطر)

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

المحلول

والخلية لديها مجموعة كاملة من وظائف البيانات المكانية:

الامتدادات المكانية إلى الخلية

وأعتقد أن القسم على قياس العلاقات بين هندستها هو ما كنت بعد:

<وأ href = "http://dev.mysql.com/doc/refman/5.0/en/functions-that-test-spatial-relationships-between-geometries.html" يختلط = "نوفولو noreferrer" عنوان = "العلاقات بين هندستها"> العلاقات بين هندستها

نصائح أخرى

لقد أجريت عمليات بحث جغرافية مماثلة عن طريق حساب المربع المحيط عبر مسافة دائرة كبيرة والاستعلام عن قاعدة البيانات لذلك.لا تزال بحاجة إلى تمريرة أخرى في تطبيقك "لتدوير الزوايا" من المربع المحيط إلى الدائرة.

لذا، بالنظر إلى قاعدة بيانات النقاط، ونقطة البحث (X,Y) والمسافة D، ابحث عن جميع النقاط الموجودة ضمن D لـ (X,Y):

  1. احسب deltaX، وهي النقطة إذا قمت بتحريك المسافة D على طول المحور Y.
  2. احسب deltaY، وهي النقطة إذا قمت بتحريك المسافة D على طول المحور X.
  3. حساب المربع المحيط الخاص بك:(X-deltaX،Y-deltaY)،(X+deltaX،Y+deltaY)
  4. قاعدة بيانات الاستعلام عن النقاط تستخدم عامل تشغيل SQL BETWEEN:حدد * من الجدول حيث X بين X-deltaX وX+deltaX وY بين Y-deltaY وY+deltaY
  5. قم بالمعالجة اللاحقة لقائمة النقاط التي تم إرجاعها، وحساب مسافة الدائرة الكبرى الفعلية، لإزالة النقاط الموجودة في زوايا المربع التي ليست ضمن دائرة المسافة الخاصة بك.

كاختصار، عادةً ما أحسب الدرجات لكل ميل لكل من خط العرض وخط الطول (عند خط الاستواء، نظرًا لأن الدرجات لكل ميل تختلف عند القطبين بالنسبة للخط)، واشتقاق deltaX وdeltaY كـ (D * درجة -خط العرض لكل ميل) أو درجات الطول لكل ميل.لا يهم الفرق عند خط الاستواء مقابل القطب كثيرًا، لأنني أحسب بالفعل المسافة الفعلية بعد استعلام SQL.

لمعلوماتك - 0.167469 إلى 0.014564 درجة خط لكل ميل، و0.014483 درجة خط عرض لكل ميل

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

SELECT *, 
( 3959 * acos( cos( radians(40) ) * cos( radians( `circleLatCenter` ) ) * cos( radians( `circleLngCenter` ) - radians(-110) ) + sin( radians(40) ) * sin( radians( `circleLngCenter` ) ) ) as `haversine` 
FROM `table` WHERE 1=1 
HAVING `haversine` < `Radius`
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top