SORU
19 Ocak 2010, Salı


Geo Hesaplamak için formüller Yakınlık

Coğrafi yakınlık bir arama gerçekleştirmek için uygulamam lazım ama kullanmak için doğru formül ile ilgili kafam çok karışık. StackOverflow Web ve bazı aramalardan sonra bir çözüm buldum:

  1. KullanımıHaversine Formül
  2. KullanımıBüyük Daire Mesafesi Formül
  3. Bir kullanınMekansal Arama MotoruVeritabanında

#3 seçenek gerçekten beni ATM için bir seçenek değil. Şimdi Great-Circle Distance Formula Haversine Formula olduğunu her zaman ama ben beri biraz kafam karıştıeşanlamlıama görünüşe göre yanılmışım?

Haversine Formula

Yukarıdaki ekran görüntüsü müthiş alınmıştırGeo (proximity) Search with MySQLkağıt ve aşağıdaki işlevleri kullanır:

ASIN, SQRT, POWER, SIN, PI, COS

Ayrıca varyasyon gördümaynı formül(Spherical Law of Cosines)bu bir: gibi

(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))))

O aşağıdaki işlevleri kullanır:

ACOS, COS, RADIANS, SIN

Matematik uzmanı değilim, ama bu formülleri aynı mı? Bir şiire rastladımdaha fazla varyasyon ve formüller(gibiSpherical Law of CosinesveVincenty's formulaeen doğru olması) gibi görünüyor - ve bu beni daha da karışık hale getirir...

İyi bir genel amaçlı bir PHP / MySQL uygulamak için formül seçim yapmam gerekiyor. Kimseye açıklamak bana formülleri arasındaki farklar yukarıda bahsettiğim olabilir?

  • Hangisini hesaplamak için en hızlısı?
  • Hangisi en doğru sonuçları sağlar?
  • Hangisi hız açısından en iyi sonuçların doğruluğu mi?

Bu sorular üzerinde fikir takdir ediyorum.


theonlytheory yanıta göre Büyük Daire Mesafe aşağıdaki Formülleri test:

  • Vincenty Formül
  • Haversine Formül
  • Kosinüs küresel Hukuk

Vincenty Formülölü yavaştır, ancakçok doğru (0.5 mm).

Haversine Formüldaha hızlı Vincenty Formül daha var, hemen hemen benim ihtiyaçları için kabul edilebilir olan yaklaşık 6 saniyede 1 milyon hesaplamaları çalıştırmak mümkün oldu.

Kosinüs Formülü küresel Hukukortaya çıkmak içinneredeyse iki kat daha hızlıHaversine Formülü gibihassas fark neglectfulnessçoğu durumda kullanım için.


İşte bazı test konumları:

  • Google HQ(, *37.422045*7)
  • San Francisco, CA(37.77493, -122.419416)
  • Eyfel Kulesi, Fransa(48.8582, 2.294407)
  • Opera Binası, Sydney(, *-33.856553*13)

Google HQ - San Francisco, CA:

  • Vincenty Formül: 49 087.066 meters
  • Haversine Formül: 49 103.006 meters
  • Küresel Kosinüs Yasası: 49 103.006 meters

Google HQ - Eyfel Kulesi, Fransa

  • Vincenty Formül: 8 989 724.399 meters
  • Haversine Formül: 8 967 042.917 meters
  • Küresel Kosinüs Yasası: 8 967 042.917 meters

Google HQ - Opera Binası, Sydney:

  • Vincenty Formül: 11 939 773.640 meters
  • Haversine Formül: 11 952 717.240 meters
  • Küresel Kosinüs Yasası: 11 952 717.240 meters

Gördüğünüz gibi varhiçbir fark farkKosinüs olan Haversine Formülü ve Küresel Hukuk arasında, ancak her ikisi de varmesafe uzaklık 22 km kadar yüksekbir küresel bir yerine dünyanın elips bir yaklaşım kullanır, çünkü Vincenty göre Formül.

CEVAP
19 Ocak 2010, Salı


Kosinüs ve Haversine Formülü Kanunu aynı sonuçlar sonsuz hassas bir makine olduğunu varsayarak verecektir. Haversine formül kayan nokta hataları için daha sağlamdır. Ancak günümüz makineleri 15 anlamlı rakamlar sırası çift hassas ve kosinüs Yasası sadece sizin için iyi çalışabilir. Hem bu formülleri Vicenty tekrarlı çözüm (en) doğru gladyatörlerin toprak (gerçekte, dünya daha bir elipsoid bir geoid değil) varsayar, oysa küresel dünya üstlenecek. Bazı referanslar: http://www.movable-type.co.uk/scripts/gis-faq-5.1.html

Daha iyi olur: not kosinüs Yasası kullanılan enlem olarak Haversine jeodezik enlem farklıdır yermerkezli enlem,. Bir küre için, bu ikisi aynı kapıya çıkar.

Hangisi en hızlı hesaplamak için mi?

En hızlı, en yavaş için Sipariş: kosinüs (5 trig. hukuk çağrı) ->haversine (içerir Karekök) ->Vicenty (yinelenen bir döngü içinde bunu çözmek için var)

Hangisi en doğru olur?

Vicenty.

Hangisi hız ve doğruluk hem de dikkate alındığında en iyisidir?

Eğer senin sorunun etki alanı gibi mesafeler çalışıyorsun hesaplamak, dünyanın sayılabilecek düz, sonra iş çıkışı (değilim verecek ayrıntılar) bir formül şeklinde x = K-x * fark boylam, y = ky * fark enlem. Sonra uzaklık = Karekök(dx*dx dy*dy). Eğer sorun etki mesafesi kare ile çözülebilir böyle ise, o halde Karekök almak zorunda kalmazsınız, ve bu formül, belki almak kadar hızlı olacaktır. Bu hesaplayabilirsiniz sözlerine ekledi avantajı vardırvektörmesafe - x Doğu yönde mesafe ve y kuzey yönünde mesafe. Aksi halde, 3 ile deney ve en iyi durumda olanı seçin.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Gimpology.com Video Tutorials

    Gimpology.co

    3 ŞUBAT 2008
  • TechRax

    TechRax

    21 EYLÜL 2009
  • Troy Hunt

    Troy Hunt

    29 EYLÜL 2011