حساب المسافة بين الرموز البريدية في PHP
سؤال
لقد حصلت على قاعدة بيانات للرموز البريدية وخطوط الطول/خطوط العرض الخاصة بها، وما إلى ذلك من هذاهذه الصفحة.وقد حصلت على الحقول التالية:
الرمز البريدي، خط العرض، الطول، المدينة، الولاية، المقاطعة، ZIP_CLASS
كانت البيانات في ملف نصي ولكني قمت بإدراجها في جدول MySQL.سؤالي الآن هو، كيف يمكنني استخدام الحقول أعلاه لحساب المسافة بين رمزين بريديين يمكن للمستخدم إدخالهما على موقع الويب؟سيكون موضع تقدير رمز العمل في PHP
المحلول
ويمكنك أيضا محاولة ضرب إحدى خدمات الويب للاحسب المسافة. السماح لشخص آخر القيام رفع الأحمال الثقيلة.
نصائح أخرى
هذه إجابة مايك مع بعض التعليقات التوضيحية لـ أرقام سحرية.يبدو أنه يعمل بشكل جيد بالنسبة لي بعض بيانات الاختبار:
function calc_distance($point1, $point2)
{
$radius = 3958; // Earth's radius (miles)
$deg_per_rad = 57.29578; // Number of degrees/radian (for conversion)
$distance = ($radius * pi() * sqrt(
($point1['lat'] - $point2['lat'])
* ($point1['lat'] - $point2['lat'])
+ cos($point1['lat'] / $deg_per_rad) // Convert these to
* cos($point2['lat'] / $deg_per_rad) // radians for cos()
* ($point1['long'] - $point2['long'])
* ($point1['long'] - $point2['long'])
) / 180);
return $distance; // Returned using the units used for $radius.
}
ويمكن ان يتم ذلك مع الرياضيات فقط ...
function calc_distance($point1, $point2)
{
$distance = (3958 * 3.1415926 * sqrt(
($point1['lat'] - $point2['lat'])
* ($point1['lat'] - $point2['lat'])
+ cos($point1['lat'] / 57.29578)
* cos($point2['lat'] / 57.29578)
* ($point1['long'] - $point2['long'])
* ($point1['long'] - $point2['long'])
) / 180);
return $distance;
}
تفحص ال صيغة هافيرسين لحساب مسافات الدائرة الكبرى بين نقطتين.يمكن العثور على بعض المزيد من العينات هنا
صيغة هافرسين:
- R = نصف قطر الأرض (متوسط نصف القطر = 6,371 كم)
- Δlat = lat2− lat1
- Δطويل = طويل2− طويل1
- ا = الخطيئة²(Δlat/2) + cos(lat1).cos(lat2).sin²(Δlong/2)
- ج = 2.atan2(√a, √(1−a))
- د = آر سي
(لاحظ أن الزوايا يجب أن تكون بالراديان لتمريرها إلى الدوال المثلثية).
في الجدول البريدي الخاص بك تحتاج إلى الاستيلاء على الإحداثيات (خطوط الطول، طويلة) لمدة النقاط التي كنت ترغب في الحصول على المسافة.
ويمكنك بعد ذلك إما حساب الحق عن بعد في SQL أو مع PHP. وترد كلتا الطريقتين في هذا المنصب:
ويتم احتساب في المثال على صيغة نوقشت في هذا الموضوع. ويوفر نصف قطر للأرض في كل من الأميال والكيلومترات لذلك سوف يسمح لك للحصول على المسافة بين نقطتين في كل وحدة.
والوصلة أعلاه هو عظيم لأنه لا يتضمن طريقة لحساب أي أرقام سحرية، فقط نصف قطر الأرض!