कुछ समय पहले मैंने हैवरसाइन फॉर्मूला का एक उदाहरण लिखा था, और इसे अपनी वेबसाइट पर प्रकाशित किया था:
/**
* Calculates the great-circle distance between two points, with
* the Haversine formula.
* @param float $latitudeFrom Latitude of start point in [deg decimal]
* @param float $longitudeFrom Longitude of start point in [deg decimal]
* @param float $latitudeTo Latitude of target point in [deg decimal]
* @param float $longitudeTo Longitude of target point in [deg decimal]
* @param float $earthRadius Mean earth radius in [m]
* @return float Distance between points in [m] (same as earthRadius)
*/
function haversineGreatCircleDistance(
$latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 6371000)
{
// convert from degrees to radians
$latFrom = deg2rad($latitudeFrom);
$lonFrom = deg2rad($longitudeFrom);
$latTo = deg2rad($latitudeTo);
$lonTo = deg2rad($longitudeTo);
$latDelta = $latTo - $latFrom;
$lonDelta = $lonTo - $lonFrom;
$angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) +
cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2), 2)));
return $angle * $earthRadius;
}
➽ ध्यान दें कि आप पैरामीटर के साथ पास होने पर उसी इकाई में दूरी प्राप्त करते हैं $earthRadius
। डिफ़ॉल्ट मान 6371000 मीटर है, इसलिए परिणाम [एम] में भी होगा। मील में परिणाम प्राप्त करने के लिए, आप उदाहरण के लिए 3959 मील पास कर सकते हैं$earthRadius
और परिणाम [mi] में होगा। मेरी राय में, एसआई इकाइयों के साथ चिपकना एक अच्छी आदत है, अगर ऐसा करने का कोई विशेष कारण नहीं है।
संपादित करें:
के रूप में TreyA सही ढंग से कहा, Haversine फार्मूले के साथ कमजोरियों है प्रतिमुख अंक क्योंकि त्रुटियों गोलाई (हालांकि यह की है छोटी दूरी के लिए स्थिर)। उनके चारों ओर जाने के लिए, आप इसके बजाय विन्सेन्टी सूत्र का उपयोग कर सकते हैं ।
/**
* Calculates the great-circle distance between two points, with
* the Vincenty formula.
* @param float $latitudeFrom Latitude of start point in [deg decimal]
* @param float $longitudeFrom Longitude of start point in [deg decimal]
* @param float $latitudeTo Latitude of target point in [deg decimal]
* @param float $longitudeTo Longitude of target point in [deg decimal]
* @param float $earthRadius Mean earth radius in [m]
* @return float Distance between points in [m] (same as earthRadius)
*/
public static function vincentyGreatCircleDistance(
$latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 6371000)
{
// convert from degrees to radians
$latFrom = deg2rad($latitudeFrom);
$lonFrom = deg2rad($longitudeFrom);
$latTo = deg2rad($latitudeTo);
$lonTo = deg2rad($longitudeTo);
$lonDelta = $lonTo - $lonFrom;
$a = pow(cos($latTo) * sin($lonDelta), 2) +
pow(cos($latFrom) * sin($latTo) - sin($latFrom) * cos($latTo) * cos($lonDelta), 2);
$b = sin($latFrom) * sin($latTo) + cos($latFrom) * cos($latTo) * cos($lonDelta);
$angle = atan2(sqrt($a), $b);
return $angle * $earthRadius;
}