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

  • akalyne

    akalyne

    13 Mayıs 2009
  • Carlos Delgado

    Carlos Delga

    21 HAZİRAN 2011
  • Professor Messer

    Professor Me

    27 NİSAN 2007