传说中的地球坐标为:WGS-84坐标系,既为GPS坐标(国内特殊手机不包括)
传说中的火星坐标为:GCJ-02坐标系,是谷歌和高德地图使用中的坐标系
百度坐标是。。。。。。。非地球和火星外的。。。。。。。。土星坐标。
class MapTransform{ private $M_PI=3.14159265358979323846264338327950288; private function LAT_OFFSET_0($x,$y){$res=-100.0 + 2.0 * $x + 3.0 * $y + 0.2 * $y * $y + 0.1 * $x * $y + 0.2 * sqrt(abs($x));return $res;} private function LAT_OFFSET_1($x){$res=(20.0*sin(6.0 * $x * $this->M_PI)+20.0*sin(2.0*$x*$this->M_PI))*2.0/3.0; return $res;} private function LAT_OFFSET_2($y){ $res=(20.0 * sin($y * $this->M_PI) + 40.0 * sin($y / 3.0 * $this->M_PI)) * 2.0 / 3.0;return $res;} private function LAT_OFFSET_3($y){$res=(160.0 * sin($y / 12.0 * $this->M_PI) + 320 * sin($y * $this->M_PI / 30.0)) * 2.0 / 3.0; return $res;} private function LON_OFFSET_0($x,$y){$res=300.0 + $x + 2.0 * $y + 0.1 * $x * $x + 0.1 * $x * $y + 0.1 * sqrt(abs($x)); return $res;} private function LON_OFFSET_1($x){$res=(20.0 * sin(6.0 * $x * $this->M_PI) + 20.0 * sin(2.0 * $x * $this->M_PI)) * 2.0 / 3.0; return $res;} private function LON_OFFSET_2($x){$res=(20.0 * sin($x * $this->M_PI) + 40.0 * sin($x / 3.0 * $this->M_PI)) * 2.0 / 3.0; return $res;} private function LON_OFFSET_3($x){$res=(150.0 * sin($x / 12.0 * $this->M_PI) + 300.0 * sin($x / 30.0 * $this->M_PI)) * 2.0 / 3.0; return $res;} private $RANGE_LON_MAX=137.8347; private $RANGE_LON_MIN=72.004; private $RANGE_LAT_MAX=55.8271; private $RANGE_LAT_MIN=0.8293; // jzA = 6378245.0, 1/f = 298.3 // b = a * (1 - f) // ee = (a^2 - b^2) / a^2; private $jzA=6378245.0; private $jzEE=0.00669342162296594323; private function transformLat($x,$y) { $ret = $this->LAT_OFFSET_0($x, $y); $ret += $this->LAT_OFFSET_1($x); $ret += $this->LAT_OFFSET_2($y); $ret += $this->LAT_OFFSET_3($y); return $ret; } private function transformLon($x,$y) { $ret = $this->LON_OFFSET_0($x, $y); $ret += $this->LON_OFFSET_1($x); $ret += $this->LON_OFFSET_2($x); $ret += $this->LON_OFFSET_3($x); return $ret; } private function outOfChina($lat,$lon) { if ($lon < $this->RANGE_LON_MIN || $lon > $this->RANGE_LON_MAX) return true; if ($lat < $this->RANGE_LAT_MIN || $lat > $this->RANGE_LAT_MAX) return true; return false; } public function gcj02Encrypt($ggLat,$ggLon) { $resPoint=array(); $mgLat=0; $mgLon=0; if ($this->outOfChina($ggLat,$ggLon)) { $resPoint['latitude'] = $ggLat; $resPoint['longitude'] = $ggLon; return $resPoint; } $dLat = $this->transformLat(($ggLon - 105.0),($ggLat - 35.0)); $dLon = $this->transformLon(($ggLon - 105.0),($ggLat - 35.0)); $radLat = $ggLat / 180.0 * $this->M_PI; $magic = sin($radLat); $magic = 1 - $this->jzEE * $magic * $magic; $sqrtMagic = sqrt($magic); $dLat = ($dLat * 180.0) / (($this->jzA * (1 - $this->jzEE)) / ($magic * $sqrtMagic) * $this->M_PI); $dLon = ($dLon * 180.0) / ($this->jzA / $sqrtMagic * cos($radLat) * $this->M_PI); $mgLat = $ggLat + $dLat; $mgLon = $ggLon + $dLon; $resPoint['latitude'] = $mgLat; $resPoint['longitude'] = $mgLon; return $resPoint; } public function gcj02Decrypt($gjLat,$gjLon) { $gPt = $this->gcj02Encrypt($gjLat,$gjLon); $dLon = $gPt['longitude'] - $gjLon; $dLat = $gPt['latitude'] - $gjLat; $pt=array(); $pt['latitude'] = $gjLat - $dLat; $pt['longitude'] = $gjLon - $dLon; return $pt; } public function bd09Decrypt($bdLat,$bdLon) { $gcjPt=array(); $x = $bdLon - 0.0065; $y = $bdLat - 0.006; $z = sqrt($x * $x + $y * $y) - 0.00002 * sin($y * $this->M_PI); $theta = atan2($y, $x) - 0.000003 * cos($x * $this->M_PI); $gcjPt['longitude'] = $z * cos($theta); $gcjPt['latitude'] = $z * sin($theta); return $gcjPt; } public function bd09Encrypt($ggLat,$ggLon) { $bdPt=array(); $x = $ggLon; $y = $ggLat; $z = sqrt($x * $x + $y * $y) + 0.00002 * sin($y * $this->M_PI); $theta = atan2($y, $x) + 0.000003 * cos($x * $this->M_PI); $bdPt['longitude'] = $z * cos($theta) + 0.0065; $bdPt['latitude'] = $z * sin($theta) + 0.006; return $bdPt; } public function wgs84ToGcj02($location=array()) { return $this->gcj02Encrypt($location['latitude'],$location['longitude']); } public function gcj02ToWgs84($location=array()) { return $this->gcj02Decrypt($location['latitude'],$location['longitude']); } public function wgs84ToBd09($location=array()) { $gcj02Pt = $this->gcj02Encrypt($location['latitude'],$location['longitude']); return $this->bd09Encrypt($gcj02Pt['latitude'],$gcj02Pt['longitude']); } public function gcj02ToBd09($location=array()) { return $this->bd09Encrypt($location['latitude'],$location['longitude']); } public function bd09ToGcj02($location=array()) { return $this->bd09Decrypt($location['latitude'],$location['longitude']); } public function bd09ToWgs84($location=array()) { $gcj02 = $this->bd09ToGcj02($location); return $this->gcj02Decrypt($gcj02['latitude'],$gcj02['longitude']); } }