PHP / MySQL: DB, belirli bir yere Yerleri seçin yakın

6 Cevap php

PHP, ben iki konum arasındaki mesafeyi hesaplamak için aşağıdaki kodu var:

<?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
?>

Ama şimdi, benim MySQL veritabanı PHP ile belirli bir yere yakın yerleri seçmek istiyor:

  • Kullanıcı memleketi girer
  • Benim komut dosyası Google API üzerinden enlem / boylam değerleri alır
  • Benim veritabanında, ben boylam değeri enlem değeri ve bir alan için bir alan ile yaklaşık 200 yerleri var
  • Ben kullanıcının memleketi en yakın 10 yerleri seçmek için PHP ve MySQL için bir kod gerekir

Bana yardımcı olur umarım. Şimdiden teşekkürler!

6 Cevap

MySQL Great Circle Distance (Haversine formula) ihtiyacınız yok tam olarak ne.

Sadece 200 kayıtları ile ancak siz de sadece hepsini yükleyebilir ve kod ile onları kontrol edin. Veri seti gerçekten yol çok küçük bir kod veya başka bir tür optimizasyonlar vs veritabanı hakkında çok fazla endişe edilecek.

Calculating distance between zip codes in PHP bu algoritmanın PHP uygulamalarının bir çift var.

Geo Proximity Search var aynı sorun oldukça fazla.

Belki bir şey gibi

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;

veya

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

(Doğrudan PHP kodu tercüme)

:1 ve :2 $lat2/180*pi() ve $long2/180*pi() dür.

Bu Haversine formül. Eğer (alternatif DB dışında her rekoru çekin ve PHP ile veri çalıştırmak için olmak) mekansal veritabanını sorgulamak böylece doğrudan SQL içine PHP çevirebilir. MySQL ihtiyacınız olan tüm matematik fonksiyonları sağlar.

Ben sonrası / posta kodu tabanlı uzaktan aramalarını sağlanan ticari bir web sitesi için yaptım, bu yüzden özel CBS fonksiyonları olmadan kesinlikle mümkündür.

Tam bu iş için kullanılabilir MySQL işlevleri vardır.

http://dev.mysql.com/doc/refman/5.0/en/gis-introduction.html

MySQL Jeo uzamsal dizin satır yeteneğine sahiptir. Sen (siz sadece iki coğrafi nesneleri ve sıralama bu ile arasındaki mesafeyi hesaplamak için MySQL sorabilirsiniz ..) kendiniz bu matematik yapmak gerek olmayabilir.

Bkz: http://forums.mysql.com/read.php?23,159205,159205

Neden MySQL coğrafi özelliklerini kullanmak değil mi ...? Hayır, sadece şaka.

200 kayıtları kasaba gibi gerçek yerler, vb iseniz o zaman bir alternatif olarak GeoNames 'API'sini kullanabilirsiniz?

Aşağıdaki Webcoder lat ve lng sağlanan için 10 yakın yerleri sağlayacaktır:

http://ws.geonames.org/findNearby?lat=47.3&lng=9

Source: http://www.geonames.org/export/web-services.html#findNearbyPlaceName

Tam liste: http://www.geonames.org/export/ws-overview.html