一个PHP脚本,通过curl先获取百度地图api生成的经纬度,然后改数据库内的数据。

Posted 飞羽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个PHP脚本,通过curl先获取百度地图api生成的经纬度,然后改数据库内的数据。相关的知识,希望对你有一定的参考价值。

今天写一个php脚本,目的是让先从数据库拿取响应的地区名  然后通过幼儿园的名字来查询准确的经纬度。此间每次生成的经纬度进入数据库内的更改。

7万多条数据用时一个小时执行完毕。 不得不说 用curl结果还是比file_getcoents快的多。话不多说直接上代码

<?php
date_default_timezone_set(‘Asia/Chongqing‘);
header(‘content-type:text/html; charset=utf-8‘);
ini_set(‘display_errors‘, 1);
error_reporting(E_ALL);
set_time_limit(0);

/**
 * @author  gf
 * 获取经纬度修改数据
 * Class Importkindgarten
 */
class Importkindgarten
{

    private $dbhost = ‘127.0.0.1‘;
    private $dbuser = ‘root‘;
    private $dbpw = ‘123‘;
    private $dbname = ‘mypolyguide‘;

    private $dbcharset = ‘utf8‘;
    private $write_db = null;

    public function __construct()
    {
        $this->db_write_link();
    }

    /**
     * 连接数据库
     * @return null|resource
     */
    public function db_write_link()
    {
        $this->write_db = mysql_connect($this->dbhost, $this->dbuser, $this->dbpw);
        if (!$this->write_db) {
            die(‘Could not connect: ‘ . mysql_error());
        }
        mysql_query(‘SET character_set_connection=‘ . $this->dbcharset . ‘, character_set_results=‘ . $this->dbcharset . ‘, character_set_client=binary‘, $this->write_db);
        mysql_query(‘SET names utf8‘, $this->write_db);
        mysql_select_db($this->dbname, $this->write_db);

        return $this->write_db;
    }

    /**
     * 执行死循环进行查询修改
     */
    public function roundKgList()
    {
        $i = 0;
        while(true)
        {
            $res = $this->getKgList();
            if(empty($res[‘kgdata‘]))
            {
                break;
            }
            else
            {
                if(!empty($res[‘kgdata‘])) foreach($res[‘kgdata‘] as $k1=>$v1)
                {
                    $info = $this->getAreanameById($v1[‘provinceId‘]);
                    $area = $info[0];
                    $address=$v1[‘kgName‘];
                    $returnArr = $this->curlGetWeb($area,$address);
                    $kgPosition = implode(‘,‘,$returnArr);
                    $updatesql = "UPDATE kindgartenbak SET lng=‘{$returnArr[‘lng‘]}‘, lat=‘{$returnArr[‘lat‘]}‘, kgPosition=‘{$kgPosition}‘,runflag=‘1‘ WHERE kgId={$v1[‘kgId‘]}";
                    mysql_query($updatesql, $this->write_db);
                    $i++;
                }
                else
                {
                    break;
                }
            }
        }
    }

    /**
     * 获取列表
     * @return mixed
     */
    public function getKgList()
    {
        $sql = ‘SELECT kgId,provinceId,kgName FROM kindgartenbak WHERE deleteFlag = 1 AND status = 2 AND runflag = 0 ORDER BY kgId DESC LIMIT 100‘;
        $query = mysql_query($sql, $this->write_db);
        while($result = mysql_fetch_array($query,MYSQL_ASSOC))
        {
            $res[‘kgdata‘][] = $result;
        }
        return $res;
    }

    /**
     * 拿取城市
     * @return mixed
     */
    public function getAreanameById($provinceId)
    {
        $sql = ‘SELECT areaname FROM area WHERE id =‘.$provinceId;
        $query = mysql_query($sql, $this->write_db);
        $info = mysql_fetch_row($query);
        if(!empty($info))
        {
            return $info;
        }
        else
        {
            return false;
        }
    }

    /**
     * 从百度地图api以curl获取经纬度
     * 数组形式返回
     */
    public function curlGetWeb($area,$address)
    {
        $Url="http://api.map.baidu.com/geocoder?address=".trim($area).trim($address)."&output=json&key=96980ac7cf166499cbbcc946687fb414";
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $Url);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //如果把这行注释掉的话,就会直接输出
        $result=curl_exec($ch);
        curl_close($ch);
        $infolist=json_decode($result);
        $array=array();
        if(isset($infolist->result->location) && !empty($infolist->result->location)){
            $array=array(
                ‘lng‘=>$infolist->result->location->lng,
                ‘lat‘=>$infolist->result->location->lat,
            );
            return $array;
        }
        else
        {
            return false;
        }
    }
}

$start_date = date(‘Y-m-d H:i:s‘);
$start = microtime(true);
$db = new Importkindgarten();
$i = $db->roundKgList();
$end = microtime(true);
echo ‘重置经纬度:‘.$start_date.‘----用时--‘.($end-$start).‘----共更新(‘.$i.‘)条‘;
?>

 

以上是关于一个PHP脚本,通过curl先获取百度地图api生成的经纬度,然后改数据库内的数据。的主要内容,如果未能解决你的问题,请参考以下文章

PHP通过地址获取经纬度百度地图API

怎么用程序通过百度地图API批量获取具体地址的经纬度

Vue2中百度地图API的使用

Android中应用百度地图API开发地图APP实例-显示百度地图

跟着百度学PHP[17]-PHP扩展CURL的用法详解

JS 百度地图导航