目前有四种经纬度分类
百度经纬度 BD-09
标准经纬度 GPS
谷歌经纬度 GCJ-02(谷歌、高德、腾讯)
搜狗经纬度
(1)其他经纬度转为百度,见百度API:http://developer.baidu.com/map/changeposition.htm
使用接口:http://api.map.baidu.com/ag/coord/convert?from=2&to=4&x='.$val['glat'].'&y='.$val['glng']
(2)其他转搜狗,见搜狗的API:http://map.sogou.com/api/documentation/javascript/api2.5/interface_translate.html#late_intro
(3)百度转为谷歌,见下面的方法:
使用的腾讯地图的API:http://open.map.qq.com/webservice_v1/guide-convert.html
使用的接口地址:http://apis.map.qq.com/ws/coord/v1/translate?locations=39.146599,117.148003&type=3&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77
<?php
/**
* @abstract 从POI的百度经纬度生成POI的谷歌经纬度 BD-09转化为GCJ-02(谷歌、高德、腾讯)
* @author zhangyi
* @date 2014/08/01
*/
$rootPath = dirname(__FILE__) . DIRECTORY_SEPARATOR . '..';
require_once $rootPath . DIRECTORY_SEPARATOR . 'scriptindex.php';
set_time_limit(0); //脚本执行时长
error_reporting(E_ALL);
// $a = '3.14159265358979324';
// $b = doubleval($a);
//$x_pi = 3.14159265358979324 * 3000.0 / 180.0;
//var_dump($a,$x_pi,$b);die();
/// <summary>
/// 中国正常坐标系GCJ02协议的坐标,转到 百度地图对应的 BD09 协议坐标
/// </summary>
/// <param name="lat">维度</param>
/// <param name="lng">经度</param>
/// <summary>
/// 百度地图对应的 BD09 协议坐标,转到 中国正常坐标系GCJ02协议的坐标
/// </summary>
/// <param name="lat">维度</param>
/// <param name="lng">经度</param>
class blng2glng {
//这个是算法
// public function getdata($lat,$lng) {
// $x_pi = 3.14159265358979324 * 3000.0 / 180.0;
// //var_dump($x_pi);die();
// $ax = $lat - 0.0065;
// $bx = $lng - 0.006;
// $d = sqrt($ax*$ax + $bx*$bx)- 0.00002 * sin($bx * $x_pi);
// $f = atan2($bx, $ax) - 0.000003 * cos($ax*$x_pi);
// //lng
// $return[0] = $d*cos($f);
// //lat
// $return[1] = $d*sin($f);
// return $return;
// }
/*
* BD-09转化为GCJ-02 调用腾讯地图的转化接口,GCJ-02(谷歌、高德、腾讯)
* http://open.map.qq.com/webservice_v1/guide-convert.html
*/
public function convertCoord($blng,$blat) {
$url = "http://apis.map.qq.com/ws/coord/v1/translate?locations=".$blat.",".$blng."&type=3&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77";
//var_dump($blng,$blat,$url);
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT,10);
$req = curl_exec($ch);
$arr = json_decode ($req,TRUE);
//var_dump($arr);die();
if(isset($arr['status']) && $arr['status'] == 0 && isset($arr['locations'][0])){
return $arr['locations'][0];
}
return array();
}
public function run() {
//先更新景点表的
echo "START: " . date('Y-m-d H:i:s', time()) . "\r\n";
//景点表
for(;;){
$sqlV = "SELECT id,blng,blat"
. " FROM poi_info "
. " WHERE del_flag=0 AND glat=0 AND glat=0 AND blat!=0 AND blng!=0"
. " LIMIT 1000";
$resultV = Yii::app()->db->createCommand($sqlV)->queryAll();
if(!empty($resultV)){
foreach ($resultV as $Vkey => $Vvalue) {
if ($Vkey%5==0) {
sleep(1);
}
//实际还是走接口
$return = $this->convertCoord($Vvalue['blng'], $Vvalue['blat']);
if(!empty($return)){
$sql = 'UPDATE poi_info SET glat = '.$return['lat'].', glng = '.$return['lng'].', update_time=NOW() WHERE id = '.$Vvalue['id'];
file_put_contents("poi_glat_update.txt",$sql.";\n",FILE_APPEND);
Yii::app()->db->createCommand($sql)->execute();
}
}
}else{
break;
}
}
//区域表
for (;;) {
$sqlV = "SELECT id,blng,blat"
. " FROM district_info "
. " WHERE del_flag=0 AND glat=0 AND glat=0 AND blat!=0 AND blng!=0"
. " LIMIT 1000";
$resultV = Yii::app()->db->createCommand($sqlV)->queryAll();
if (!empty($resultV)) {
foreach ($resultV as $Vkey => $Vvalue) {
if ($Vkey % 5 == 0) {
sleep(1);
}
//实际还是走接口
$return = $this->convertCoord($Vvalue['blng'], $Vvalue['blat']);
if (!empty($return)) {
$sql = 'UPDATE district_info SET glat = ' . $return['lat'] . ', glng = ' . $return['lng'] . ', update_time=NOW() WHERE id = ' . $Vvalue['id'];
file_put_contents("district_glat_update.txt", $sql . ";\n", FILE_APPEND);
Yii::app()->db->createCommand($sql)->execute();
}
}
} else {
break;
}
}
echo "END TIME: " . date('Y-m-d H:i:s', time()) . "\r\n";
}
}
$model = new blng2glng();
$model->run();