matematik ile ilgili PHP soru + enlem

7 Cevap php

Ben 2 nokta arasındaki mil sayısını hesaplayan bir PHP sayfası bir işlevi bulundu, ancak bu hatalı bulunuyor. Bu google maps ile çalışmak gerekiyordu, ama mesafeler arasındaki fark (daha doğru olan) google maps de 1.3 ila 1.65 kat arasında değişen vardır.

İşte fonksiyonu bulunuyor:

$M =  69.09 * rad2deg(acos(sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon1 - $lon2))));

Ben biraz karmaşık buluyorum ve ben wheter ya da değil, bu doğru bilmek geometri hakkında çok fazla bilmiyorum.

Biraz daha bilgi birikimi olan birisi bu bakmak ve onunla neyin yanlış olduğunu görebilir miyim?

7 Cevap

Belki bir sürüş mesafesi ile 'kuş uçuşu mesafesi' (iki nokta arasında doğrudan hat) karşılaştırdığınız?

Ayrıca, see this post PHP, iki nokta arasındaki mesafeyi hesaplamak için.

Sizin için enlem ve boylam sahip iki nokta arasındaki Haversine formula hesaplamak için mesafe arıyoruz.

PHP dönüştürmek için kolay olmalıdır Javascript can be found here bunun bir basit uygulama.

Doğruluk ve gerekli hesaplama değişir Dünya'nın, yüzeyinde mesafe hesaplama en az üç çift farklı yöntemler vardır.

  1. Spherical Law of Cosines [not very accurate, very simple to calculate]
  2. Haversine Formula [hesaplamak için daha küçük mesafelerde dışında doğru, hala nispeten basit]
  3. Vincenty Formula [son derece doğru ve hesaplamak için daha karmaşık yeryüzü birkaç farklı elipsoid modelleri kullanabilirsiniz]

Bu Vincenty Formula kullandığından beri Google Maps daha doğru iken sağlanan örnek kosinüsleri hesaplama yasası gibi görünüyor. (Ben Vincenty bağlantı Vikipedi sayfası daha ayrıntılı formülünü açıklıyor bulmak)

Düzenleme: Ben Dünya'nın yüzeyinde sapma tarafından tanıtıldı hata önemsiz olduğunu ve görme hata oluşturma olamaz yukarıda bir yorum gördüm. Bu çok büyük mesafeler üzerinde tek gerçek korkuyorum. Bir kaç yüz km veya daha az mesafelerde, hataları kesinlikle önemsiz olmayan olabilir.

Burada basit bir versiyonu, ama çok uzak yerler için doğru değildir:

    const ONE_DEGREE = 111120;

public function distance( $point ) {
	$coef = cos( $this->getLatitude() / 180 * M_PI );
    $x = $this->getLatitude() - $point->getLatitude();
    $y = ( $this->getLongitude() - $point->getLongitude() ) * $coef;
    $result = sqrt( $x * $x + $y * $y ) * self::ONE_DEGREE;
	return $result;
}

$ Nokta ve bu $ getLatitude () ve getLongitude () yöntemleri ile Yer sınıfının örnekleridir.

Ben de geometri hakkında hiçbir şey bilmiyorum, ama google önerdi this page. Belki bunu yararlı bulacaksınız

Formül doğru gibi görünüyor - bakınız, örneğin, Wikipedia on "great circle distance". Önündeki 69,09 faktörü I, (ekvatorda boylam 1 derece örneğin mil) bir büyük daire boyunca ölçülen bir derece kilometrelerce sayısı, bu yüzden cevap kilometre olacak inanıyorum, olduğunu.

Eğer yanlış bir sürüş mesafesi ile düz çizgi mesafe karşılaştırarak olabilir jonstjohn fikri benim için en olası açıklama gibi görünüyor.

EDIT: ya da küçük ayrımları çalışıyorsanız Vikipedi, söz yuvarlama hatası olabilir. Ama ben ilk kez doğrudan / sürüş mesafesi farkı benim parmak işaret eder.

Eğer referans konum hesaplama küresel koordinat sistemi kullanır gibi görünüyor. Formül neredeyse doğrudur. Lütfen hesaplama fırlatarak ne olabilir parçası kullandığınız yarıçapı. 69,09 kürenin yarı çapı (bu durumda toprak) 'dir. Bildiğiniz gibi, toprak, gerçekten bir elips daha bir küre değildir. Ben aşağıda formülasyonu çalışırken öneririm:

3963 * acos(sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon1 - $lon2)));

Daha kesin sonuçlar için, Vincenty veya Haversine hesaplamaları kullanmak isteyeceksiniz.

EDIT: açıklığa kavuşturmak için, ben bildirdiğiniz hata toplu bir küresel koordinat hesaplama kullanarak nedeniyle olduğunu ima etmeye çalışmıyorum. Bu hata ne görüyorsanız çok daha küçüktür. 69.09 sadece radyan kullanarak daha az sezgisel bir derece sistemi, ayarlanabilir toprak yarıçaplı bir değer olarak verilen formülü ayarı, formül net bir sürümü olması amaçlanmıştır. Ayrıca, yukarıdaki formülü kullanarak, çok küçük mesafeleri hesaplamak için uzun hesaplama yapıyor sistem yeterli ondalık çalışıyor gibi (yaklaşık 1m mesafeler aşağı) son derece doğru olduğunu bilmenizde yarar var. Modern bilgisayar bir şamandıra kullanarak bu doğruluk verir.