123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- <?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 = earth_asin_safe(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));
- }
- function earth_asin_safe($x) {
- return asin(max(-1, min($x, 1)));
- }
|