2009-06-25 13 views
7

DB'mde bir yarıçapı (metre cinsinden) birlikte bir orta nokta saklar.MySQL için Haversine formülü tersine mi?

Bir lat/lng biçiminde geçiş yapmak ve sonra sakladığım mysql değerlerine sahip olduğumu belirtmek isterim. İçinde bulunduğum noktanın dairenin içinde olup olmadığını öğrenmek için bir çevre oluşturun. Bunu yapmamı sağlayacak bir şey var mı, haversine forumla benzer (benim noktanın zaten db'de olduğunu varsayar).

Haversine Formül

: (3959 * acos (cos (radyan (40)) * cos (radyan (lat)) * cos (radyan ( long) - radyan (-110)) + sin (radyan (40)) * sin (radyan ( long)))

db: foo dan> seçme id geçen

circleLatCenter, circleLngCenter, Radius

nerede lat, içinde Ing (daire işlevini yapmak: circleLat, circleLng, yarıçap)

cevap

2

Sınırlayıcı kutuyu büyük daire mesafesiyle hesaplayarak ve bunun için veritabanını sorgulayarak benzer coğrafi aramalar yaptım. Bağlama kutusundan çevreye "köşeleri yuvarlaklaştırmak" için uygulamanızda yine başka bir geçişe ihtiyacınız var.

  1. hesaplayın DELTAX, nokta şudur: Bu yüzden

    , bir nokta veritabanı verilen bir arama noktası (X, Y) ve bir D mesafesi, (X, Y) D içindeki tüm noktaları bulmak D mesafesini Y ekseni boyunca hareket ettirirseniz.

  2. Kesin değeri hesaplayın, bu da X eksenine D mesafesini taşıdıysanız gelin. (X-DELTAX, Y-deltaY), (X + DELTAX Y + deltaY) noktalarının
  3. Sorgu veritabanını kullanmak operatör ARASINDAKİ SQL:
  4. sizin sınırlayıcı kutu hesaplayın TABLODAN * SEÇ NEREDE X-DELTAX ARASINDAKİ X VE X + deltaX VE Y-DELTAJ İLE Y + deltaY Y-deltaY
  5. Geri dönüş noktalarının listesini işlemden geçirin, büyük daire mesafesini hesaplayarak, kare dairenizin içinde olmayan köşelerin kenarlarındaki noktaları kaldırın.

bir kısa kesilmiş olarak, tipik olarak, (derece başına mil lon kutuplarda farklı olduğu, ekvator) derece başına mil enlem ve boylam hem de hesaplamak ve DELTAX elde etmek ve (D * derece-mil-başına-mil) veya derece-mil-mil olarak deltaY. Ekvator ile kutup arasındaki fark çok önemli değil çünkü zaten SQL sorgusundan sonra gerçek mesafeyi hesaplıyorum.

Bilginize - 0,167469 0,014564 derece başına mil lon-ve 0,014483 derece-lat-per-mile

+0

Ben, Ama bu yazı yazdı beri bunu yapmak için daha iyi bir yol buldunuz aynı (ilk kare sonra hipotenüs uzunluğunda köşeyi dönen ile geçmesi) do? –

-1

Bunun uzun süren bir yazı olduğunu biliyorum, ancak, bunun karşısında herkesin çıkması durumunda, bir "tersine haversin formülü" oluşturmanıza gerek yoktur. Haversine formülü a ve b noktaları arasındaki mesafeyi verir. Hesaplama için, b noktası ve a noktası arasındaki mesafeye ihtiyacınız vardır.Bunlar aynı değer.

SELECT *, 
(3959 * acos(cos(radians(40)) * cos(radians(`circleLatCenter`)) * cos(radians(`circleLngCenter`) - radians(-110)) + sin(radians(40)) * sin(radians(`circleLngCenter`))) as `haversine` 
FROM `table` WHERE 1=1 
HAVING `haversine` < `Radius` 
+0

"acos()" ifadesinin kullanılması, bunun bir haversin hesaplaması olmadığı anlamına gelir, "kosinüslerin küresel yasası" dır. –