SORU
17 HAZİRAN 2009, ÇARŞAMBA


İki Enlem Arasındaki Mesafe Bulmak için en hızlı Yol Uzun Puan

Ben şu anda tüm enlem ve boylam bilgileri ile mysql veritabanı hemen altında bir milyon yerleri var.

Bir nokta ve bir sorgu ile birçok nokta arasındaki mesafeyi bulmak için çalışıyorum. Özellikle 100 hit olmak istiyorum kadar hızlı bir ikinci değil.

Daha hızlı bir sorgu ya da daha hızlı bir sistem bunun için mysql dışında muhtemelen var mı? Bu sorgu kullanıyorum:

SELECT 
  name, 
   ( 3959 * acos( cos( radians(42.290763) ) * cos( radians( locations.lat ) ) 
   * cos( radians(locations.lng) - radians(-71.35368))   sin(radians(42.290763)) 
   * sin( radians(locations.lat)))) AS distance 
FROM locations 
WHERE active = 1 
HAVING distance < 10 
ORDER BY distance;

CEVAP
17 HAZİRAN 2009, ÇARŞAMBA


  • MyISAM tablodaki puan Geometry veri türleri Point değerleri kullanarak oluşturun

  • Bu noktalar üzerinde SPATIAL Bir dizin oluşturun

  • MBRContains() değerleri bulmak için kullanın:

    SELECT  *
    FROM    table
    WHERE   MBRContains(LineFromText(CONCAT(
            '('
            , @lon   10 / ( 111.1 / cos(RADIANS(@lon)))
            , ' '
            , @lat   10 / 111.1
            , ','
            , @lon - 10 / ( 111.1 / cos(RADIANS(@lat)))
            , ' '
            , @lat - 10 / 111.1 
            , ')' )
            ,mypoint)
    

veya, MySQL 5.1 ve üstü:

    SELECT  *
    FROM    table
    WHERE   MBRContains
                    (
                    LineString
                            (
                            Point (
                                    @lon   10 / ( 111.1 / COS(RADIANS(@lat))),
                                    @lat   10 / 111.1
                                  ),
                            Point (
                                    @lon - 10 / ( 111.1 / COS(RADIANS(@lat))),
                                    @lat - 10 / 111.1
                                  ) 
                            ),
                    mypoint
                    )

Bu puan yaklaşık kutusu (@lat /- 10 km, @lon /- 10km) içinde seçer.

Bu aslında bir kutu, ama küresel bir dikdörtgen değil: kürenin enlem ve boylam bağlı bir bölüm. Bu düz bir dikdörtgen farklı olabilirFranz Joseph Araziama çok yakın en çok yaşadığı yerler.

  • Daire içinde her şeyi seçmek için ek filtre (Kare) uygulayın

  • Muhtemelen geçerli ek güzel, büyük daire mesafesi (büyük mesafeler için) için hesap için filtreleme

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GenTechPC

    GenTechPC

    1 Temmuz 2007
  • Machinima

    Machinima

    17 Ocak 2006
  • Trulia

    Trulia

    29 Kasım 2006