สมมติว่าคุณต้องการสร้างแบบสอบถามในฐานข้อมูลคุณอาจต้องการทำการค้นหาที่รวดเร็ว (ไม่ถูกต้อง) และหลังจากนั้นคำนวณระยะทางสำหรับสถานที่ที่เกิดขึ้นอย่างแน่นอน นั่นคือสถานการณ์ของคุณหรือไม่
ฟังก์ชั่นต่อไปนี้ (ใน PHP, ขอโทษ) จะประมาณความแตกต่างในละติจูดและลองจิจูด ความแตกต่างนี้ขึ้นอยู่กับละติจูดของจุดค้นหาของคุณ ใช้พวกเขา (ด้วยความอดทนเล็กน้อย) เพื่อทำการค้นหาอย่างรวดเร็วในฐานข้อมูล กล่องสามารถคำนวณได้อย่างง่ายดายด้วยละติจูด + -deltaLatitude และลองจิจูด + -deltaLongitude
deltaLatitude[rad] = distance[m] / earthRadius[m]
deltaLongitude[rad] = distance[m] / (cos(latitude[rad]) * $earthRadius[m])
/**
* Calculates the deltas in latitude and longitude to use, for a db search
* around a location in the database.
* @param float $distance Radius to use for the search [m]
* @param float $latitude Latitude of the location, we need the angle deltas for [deg decimal]
* @param float $deltaLatitude Calculated delta in latitude [deg]
* @param float $deltaLongitude Calculated delta in longitude [deg]
* @param float $earthRadius Mean earth radius in [m]
*/
public static function angleFromSphericDistance($distance, $latitude,
&$deltaLatitude, &$deltaLongitude, $earthRadius = 6371000)
{
$lat = deg2rad($latitude);
$radiusOnLatitude = cos($lat) * $earthRadius;
$deltaLatitude = $distance / $earthRadius;
$deltaLongitude = $distance / $radiusOnLatitude;
$deltaLatitude = rad2deg($deltaLatitude);
$deltaLongitude = rad2deg($deltaLongitude);
}
ด้วยสูตรแฮเวอรีนคุณสามารถคำนวณระยะทางบนทรงกลม ใช้สำหรับแต่ละสถานที่ที่พบเพื่อให้ได้ระยะทาง "ที่แน่นอน" วิธีนี้คุณสามารถทดสอบได้หากสถานที่ทั้งสองอยู่ภายในรัศมีที่แน่นอน (วงกลมแทนกล่อง)
/**
* 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)
*/
public static 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;
}