2011-01-14 19 views
20

yılında enlem ve boylam içinde, sadece sözde kodu gibi bir sorgu şey yapmak mümkün olup olmadığını sormak istedim: tablosundanSorgulama özgü kod örnekleri yaptırmadan önce MySQL

öğeleri seçin nerede enlem/boylam = - belirli bir lat/lon noktası-

arası

Bu yapılabilir mi? Ya da bazı çemberler üzerinden atlamak zorunda mıyım? Tavsiye edilebilecek iyi yaklaşımlar harika olurdu!

cevap

49

Sen Haversine formülü aramak gerekir, ama iyi bir başlangıç ​​olabilir:

Bkz Section 'MySQL ile Bulma yerler' :

Burada en yakın 20 konumu bulabileceğiniz SQL deyimi 37, -122 koordinatına 25 mil yarıçapı. Bu satırın enlem/boylamına ve hedef enlem/boylamına bağlı olarak mesafeyi hesaplar ve sonra sadece mesafe değerinin 25'ten az olduğu satırları sorar, tüm sorguyu mesafeye göre sıralar ve bunu 20 sonuçla sınırlar. Mil yerine kilometre kullanarak arama yapmak için ben çok operasyonun bu tür SpatiaLite veya PostGIS kullanarak öneriyoruz 6371.

SELECT id, (3959 * acos(cos(radians(37)) * cos(radians(lat)) * cos(radians(lng) - radians(-122)) + sin(radians(37)) * sin(radians(lat)))) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20; 
+0

Öneriniz için teşekkür ederiz. Burada yeni bir soru yayınladım: http://stackoverflow.com/questions/4697624/querying-for-things-near-a-geolocation – Genadinik

+2

Bu benim için hesaplanan herhangi bir mesafeyi geri getirmiyor, sadece 'NULL' . –

+0

Sonuçların tam noktasında döndürülmemesi. Bu sonuç, yan tümcelere sahip olmayan NULL olarak geri dönüyor. – Maykonn

5

3959 yerine. Kodu vermeye çalıştığınız işlevler türünde oluşturdular. Ayrıca MySQL'de bulunmayan uzamsal veriler için de uygun desteğe sahipler.

Gelecekte uzamsal istekleri sürdürmek istiyorsanız, MySQL'te tam olarak bir çözüm değil, daha iyi bir çözüm.