View source
<?php
function earth_radius_semimajor() {
return 6378137.0;
}
function earth_flattening() {
return 1 / 298.257223563;
}
function earth_radius_semiminor() {
return earth_radius_semimajor() * (1 - earth_flattening());
}
function earth_eccentricity_sq() {
return 2 * earth_flattening() - pow(earth_flattening(), 2);
}
function earth_radius($latitude = 37.9) {
$lat = deg2rad($latitude);
$x = cos($lat) / earth_radius_semimajor();
$y = sin($lat) / earth_radius_semiminor();
return 1 / sqrt($x * $x + $y * $y);
}
function earth_xyz($longitude, $latitude, $height = 0) {
$long = deg2rad($longitude);
$lat = deg2rad($latitude);
$coslong = cos($long);
$coslat = cos($lat);
$sinlong = sin($long);
$sinlat = sin($lat);
$radius = earth_radius_semimajor() / sqrt(1 - earth_eccentricity_sq() * $sinlat * $sinlat);
$x = ($radius + $height) * $coslat * $coslong;
$y = ($radius + $height) * $coslat * $sinlong;
$z = ($radius * (1 - earth_eccentricity_sq()) + $height) * $sinlat;
return array(
$x,
$y,
$z,
);
}
function earth_arclength($angle, $latitude = 37.9) {
return deg2rad($angle) * earth_radius($latitude);
}
function earth_distance($longitude1, $latitude1, $longitude2, $latitude2) {
$long1 = deg2rad($longitude1);
$lat1 = deg2rad($latitude1);
$long2 = deg2rad($longitude2);
$lat2 = deg2rad($latitude2);
$radius = earth_radius(($latitude1 + $latitude2) / 2);
$cosangle = cos($lat1) * cos($lat2) * (cos($long1) * cos($long2) + sin($long1) * sin($long2)) + sin($lat1) * sin($lat2);
return acos($cosangle) * $radius;
}
function earth_distance_sql($longitude, $latitude, $tbl_alias = '') {
$long = deg2rad($longitude);
$lat = deg2rad($latitude);
$radius = earth_radius($latitude);
$tbl_alias = empty($tbl_alias) ? $tbl_alias : $tbl_alias . '.';
$coslong = cos($long);
$coslat = cos($lat);
$sinlong = sin($long);
$sinlat = sin($lat);
return "(IFNULL(ACOS({$coslat}*COS(RADIANS({$tbl_alias}latitude))*({$coslong}*COS(RADIANS({$tbl_alias}longitude)) + {$sinlong}*SIN(RADIANS({$tbl_alias}longitude))) + {$sinlat}*SIN(RADIANS({$tbl_alias}latitude))), 0.00000)*{$radius})";
}
function earth_longitude_range($longitude, $latitude, $distance) {
$long = deg2rad($longitude);
$lat = deg2rad($latitude);
$radius = earth_radius($latitude);
$angle = $distance / $radius;
$diff = asin(sin($angle) / cos($lat));
$minlong = $long - $diff;
$maxlong = $long + $diff;
if ($minlong < -pi()) {
$minlong = $minlong + pi() * 2;
}
if ($maxlong > pi()) {
$maxlong = $maxlong - pi() * 2;
}
return array(
rad2deg($minlong),
rad2deg($maxlong),
);
}
function earth_latitude_range($longitude, $latitude, $distance) {
$long = deg2rad($longitude);
$lat = deg2rad($latitude);
$radius = earth_radius($latitude);
$angle = $distance / $radius;
$minlat = $lat - $angle;
$maxlat = $lat + $angle;
$rightangle = pi() / 2;
if ($minlat < -$rightangle) {
$overshoot = -$minlat - $rightangle;
$minlat = -$rightangle + $overshoot;
if ($minlat > $maxlat) {
$maxlat = $minlat;
}
$minlat = -$rightangle;
}
if ($maxlat > $rightangle) {
$overshoot = $maxlat - $rightangle;
$maxlat = $rightangle - $overshoot;
if ($maxlat < $minlat) {
$minlat = $maxlat;
}
$maxlat = $rightangle;
}
return array(
rad2deg($minlat),
rad2deg($maxlat),
);
}