سؤال

في PHP، لدي التعليمات البرمجية التالية لحساب المسافة بين موقعين:

<?php
function distance($lat1, $long1, $lat2, $long2) {
    // DEGREE TO RADIAN
    $latitude1 = $lat1/180*pi();
    $longitude1 = $long1/180*pi();
    $latitude2 = $lat2/180*pi();
    $longitude2 = $long2/180*pi();
    // FORMULA: e = ARCCOS ( SIN(Latitude1) * SIN(Latitude2) + COS(Latitude1) * COS(Latitude2) * COS(Longitude2-Longitude1) ) * EARTH_RADIUS
    $distance = acos(sin($latitude1)*sin($latitude2)+cos($latitude1)*cos($latitude2)*cos($longitude2-$longitude1))*6371;
    return $distance;
}
echo distance(9.9921962, 53.5534074, 9.1807688, 48.7771056); // Hamburg, DE - Stuttgart, DE
?>

ولكن الآن، أريد تحديد المواقع بالقرب من موقع معين عبر PHP من قاعدة بيانات MySQL الخاصة بي:

  • يدخل المستخدم مسقط رأسه
  • النصي الخاص بي يحصل على قيم خطوط الطول / خط الطول عبر جوجل API
  • في قاعدة البيانات الخاصة بي، لدي حوالي 200 موقع مع حقل لقيمة خطوط العرض وحقل لقيمة الطول
  • أحتاج إلى رمز ل PHP و MySQL لتحديد المواقع ال 10 التي هي الأقرب إلى مسقط رأس المستخدم

آمل أن تتمكن من مساعدتي. شكرا مقدما!

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

المحلول

mysql مسافة دائرة رائعة (صيغة حفرية) هل بالضبط ما تحتاجه.

مع 200 سجل فقط، قد تقوم فقط بتحميلها جميعا وتحقق منها برمز. تعد مجموعة البيانات طريقة صغيرة جدا حتى تكون مقلقة كبيرة حول رمز قاعدة البيانات مقابل قاعدة البيانات أو أي تحسينات أخرى.

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

جيو القرب البحث هو جدا نفس المشكلة بالضبط لديك.

نصائح أخرى

ربما شيء مثل

SELECT field1, field2, ...,
    ACOS(SIN(latitude / 180 * PI()) * SIN(:1) + COS(latitude / 180 * PI()) * COS(:2) * COS(:2 - longtidude)) * 6371 AS distance
    ORDER BY distance ASC;

أو

SELECT field1, field2, ...,
    ACOS(SIN(RADIANS(latitude)) * SIN(:1) + COS(RADIANS(latitude)) * COS(:2) * COS(:2 - longtidude)) * 6371 AS distance
    ORDER BY distance ASC;

(ترجمة مباشرة من رمز PHP)

:1 و :2 يكون $lat2/180*pi() و $long2/180*pi() على التوالى.

هذه هي صيغة الهوفرين. يمكنك ترجمة PHP مباشرة إلى SQL حتى تتمكن من الاستعلام عن قاعدة البيانات بشكل مكثي (البديل لسحب كل سجل خارج DB وتشغيل البيانات من خلال PHP). يوفر MySQL جميع وظائف الرياضيات التي تحتاج إليها.

فعلت ذلك على موقع ويب تجاري يوفر عمليات بحث عن بعد Post / Zipcode، لذلك ممكن بالتأكيد دون وظائف GIS محددة.

هناك وظائف MySQL المتاحة للقيام بذلك بالضبط.

http://dev.mysql.com/doc/refman/5.0/ar/gis-roduction.html.

MySQL لديها القدرة على فهرسة الصفوف الجيولوجي. قد لا تحتاج إلى القيام بهذه الرياضيات بنفسك (يمكنك فقط أن تسأل MySQL لحساب المسافة بين كائنين جيويون وفرز حسب ذلك ..).

يرى: http://forums.mysql.com/read.php؟23،159205،159205.

جاء فقط عبر هذا الموضوع. ربما شخص ما سيكون مهتما بهذه الوظيفة، تم اختباره في MySQL 5.7:

    create function GetDistance(lat1 real, lng1 real, lat2 real, lng2 real) returns real no sql
    return ATAN2(SQRT(POW(COS(RADIANS(lat2)) * SIN(RADIANS(lng1 - lng2)), 2) + 
                POW(COS(RADIANS(lat1)) * SIN(RADIANS(lat2)) - SIN(RADIANS(lat1)) *
                COS(RADIANS(lat2)) *  COS(RADIANS(lng1 - lng2)), 2)), 
                (SIN(RADIANS(lat1)) * SIN(RADIANS(lat2)) + COS(RADIANS(lat1)) *
                COS(RADIANS(lat2)) * COS(RADIANS(lng1 - lng2)))) * 6372.795;

الاتصال:

select GetDistance(your_latitude, your_longitude, table_field_lat,
                   table_field_lng) as dist from [your_table] limit 5;

لماذا لا تستخدم ميزات MySQL الجغرافية المكانية ...؟ لا، أمزح فقط.

إذا كانت السجلات 200 أماكن فعلية مثل المدن، وما إلى ذلك، فكل بديلا، يمكنك استخدام API Geonames '؟

ستوفر WebService التالي المواقع الأقرب 10 إلى LAT و LNG المقدمة:

http://ws.geonames.org/findnearby؟lat=47.3&lng=9.

مصدر: http://www.geonames.org/export/web-services.html#findnearbyplacename.

القائمة الكاملة: http://www.geonames.org/export/ws-overview.html.

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