Benim uygulamada bir Geo yakınlık arama uygulamak gerekiyor ama ben kullanmak için doğru bir formül ile ilgili çok kafam karıştı. Web ve StackOverflow bazı aramalarda sonra çözüm olduğunu buldu:
- Kullanarak Haversine Formül
Use the Great-Circle Distance Formula s>- Veritabanında bir Spatial Search Engine kullanın
Seçenek # 3 ATM gerçekten benim için bir seçenek değildir. Şimdi biraz kafam karıştı çünkü ben her zaman olsa o Great-Circle Distance Formula ve Haversine Formül synonymous ama görünüşe göre yanılmışım?
Yukarıdaki ekran görüntüsü müthiş Geo (proximity) Search with MySQL strong> kağıttan alınan ve aşağıdaki işlevleri kullanır edildi:
ASIN, SQRT, POWER, SIN, PI, COS
Ben de bunun gibi, same formula (Cosines küresel Hukuku) strong> varyasyonlarını gördüm:
(3956 * ACOS(COS(RADIANS(o_lat)) * COS(RADIANS(d_lat)) * COS(RADIANS(d_lon) - RADIANS(o_lon)) + SIN(RADIANS(o_lat)) * SIN(RADIANS(d_lat))))
Yani aşağıdaki işlevleri kullanır:
ACOS, COS, RADIANS, SIN
Ben bir matematik uzmanı değilim, ama bu formülleri aynıdır? En doğru olarak görünüyor - bazı more variations, and formulas (gibi Cosines küresel Hukuku and the Vincenty's formulae strong> geldim ) ve bu beni daha da karıştı yapar ...
PHP / MySQL uygulamak için iyi bir genel amaçlı formülü seçmeniz gerekir. Herkes bana yukarıda belirtilen formüller arasındaki farkları açıklayabilir misiniz?
- Which one is the fastest to compute?
- Which one provides the most accurate results?
- Which one is the best in terms of speed / accuracy of results?
Ben bu sorulara verdiğiniz fikir için teşekkür ederiz.
theonlytheory cevap dayanarak ben aşağıdaki Büyük-Çember Mesafe Formülleri test:
- Vincenty Formül
- Haversine Formül
- Cosines küresel Hukuku
Vincenty Formül ölü yavaş, ancak it's pretty accurate (down to 0.5 mm).
Haversine Formül Vincenty Formül daha hızlı şekilde, ben hemen hemen kabul benim ihtiyaçları için hangi yaklaşık 6 saniyede 1 milyon işlem çalıştırmayı başardı.
Cosines küresel Hukuku Formula olduğu ortaya almost twice as fast, Formül Haversine ve the precision difference is neglectfulness çoğu durumda kullanım için olduğu gibi.
İşte bazı test yerlerdir:
- Google HQ (
37.422045
,-122.084347
) - San Francisco, CA (
37.77493
,-122.419416
) - Eiffel Tower, France (
48.8582
,2.294407
) - Opera House, Sydney (
-33.856553
,151.214696
)
Google HQ - San Francisco, CA:
- Vincenty Formül:
49 087.066 meters
- Haversine Formül:
49 103.006 meters
- Cosines küresel Hukuku:
49 103.006 meters
Google HQ - Eiffel Tower, France:
- Vincenty Formül:
8 989 724.399 meters
- Haversine Formül:
8 967 042.917 meters
- Cosines küresel Hukuku:
8 967 042.917 meters
Google HQ - Opera House, Sydney:
- Vincenty Formül:
11 939 773.640 meters
- Haversine Formül:
11 952 717.240 meters
- Cosines küresel Hukuku:
11 952 717.240 meters
Gördüğünüz gibi no noticeable difference Haversine Formül ve cosines Küresel Kanunu arasındaki var olan bu toprak bir elipsoidal yaklaşım kullanır yerine, çünkü ancak iki distance offsets as high as 22 kilometers Vincenty Formül ile karşılaştırıldığında var Bir küresel bir.