0

我有一个内部站点,它使用 php 来查看我的 msql 客户数据库。查找任何未填写 lat 和 lng 字段的客户。获取邮政编码并对他们进行地理编码,将 lat 和 lng 发布回我的数据库并在地图上绘制客户。这是由每天一次的 cron 作业完成的。使用谷歌 api 的 v.2 效果很好。自三月或四月以来,它就停止了。我猜是因为 v.3。

让我的 jl_jobscoordinates.cron.php 文件在数据库中搜索所有空的 lat 和 lng 字段的邮政编码。然后从我的 geocode.class.php 调用一个名为 doGeocode 的函数,该函数使用 xml 来组合并查找结果并保存 lat 和 lng。在 geocodeclass 内部,它指的是一个 m_url,它是保存在我的配置文件中的 googleapi url。我已将此网址更新为新的 v.3 网址,即http://maps.googleapis.com/maps/api/geocode/xml?address=%s&sensor=false。我的地图已备份并运行,只是没有任何内容可以进行地理编码。

我将粘贴 jl_jobscooedinates.cron.php 和 geocode.class.php 这两个文件。我已经注释掉了地理编码中用于使用旧网址的旧 xml。

我的 cron 的结果是它没有得到坐标。例如 -- [3-2013] Google 找不到此邮政编码:[COO041] 测试公司名称,牛津郡 OX26 4SS

jl_jobcoordinates.cron.php

require_once("../includes/config.php");     
require_once(_PATH_JMS."/classes/session.class.php");   
require_once(_PATH_JMS."/classes/db.class.php");
require_once(_PATH_JMS."/classes/lib.class.php");
require_once(_PATH_JMS."/classes/security.class.php");
require_once(_PATH_JMS."/classes/emails.class.php");
require_once(_PATH_JMS."/classes/geocode.class.php");

require_once(_PATH_JMS."/services/actiontrail.ds.php"); 
require_once(_PATH_JMS."/services/jobsdue.ds.php"); 

//-----------------------------------------------------
// Main Object Instances - Initialize what we require    
//-----------------------------------------------------

$DB             = new DB();
$Security       = new Security($DB->i_db_conn);
$Lib            = new Lib();
$Session        = new Session();
$ActionTrail    = new ActionTrail($DB, $Session, $Security);
$JobsDue        = new JobsDue($DB, $Session, $Security, $ActionTrail);
$Geocode        = new Geocode($Session, $Security);
$Emails         = new Emails($DB, $Session, $Security);

//-----------------------------------------------------
// Save as a valid system user   
//-----------------------------------------------------

$Session->save('USR_AUTH',_CRON_USER_NAME);
$Session->save('USR_PASS',_CRON_USER_PASS);
$Session->save('USR_IS_EMPLOYED', '1');
$Session->save('CONS',$Session->get('USR_AUTH'));

//-----------------------------------------------------
// Postcodes to Ignore - we cannot geocode these
//-----------------------------------------------------

$m_ignore = array("IRL","IRELAND","IRE","ITA","USA","BEL","EGY","GER","FR","FRA","HOL","POL");

//-----------------------------------------------------
// Get Jobs Due for all consultants for this year and next
//-----------------------------------------------------

$mY = (int) date("Y");

//-----------------------------------------------------
// Find t-cards without lat & lng
//-----------------------------------------------------

$m_errors = array();





for ($y=$mY;$y<=$mY+1;$y++) 
{
    for ($i=1;$i<=12;$i++) 
    {
        $mM = (int) $i; 
        //echo "<br> mM =".$mM ." i =".$i;  
        $mJobs = $JobsDue->getAllJobsDue('%',$mM,$y,'%',NULL,NULL,FALSE); /* DON'T GET MISSED JOBS AS WE WILL START FROM JAN */
        //echo "<br>mJobs =".$mJobs;
        foreach ($mJobs as $row)
        {
            $m_postcode = $Lib->lib_str_clean(trim($row->postcode)); //this loops through each of the records and gets the post codes. m_postcodes are the postcodes found
            echo "<br>m_postcode =".$m_postcode;
            if (($row->latlngexists == 1)||(in_array($m_postcode,$m_ignore))||(in_array($row->card_id,$m_ignore))||(strlen($m_postcode)<=0)) continue;
            if ($Lib->lib_ispostcode($m_postcode)) {
                $m_coordinates = $Geocode->doGeocode($m_postcode);
                echo "<br>m_coords =".$m_coordinates;//nothing displayed
                if ($m_coordinates != NULL) {
                    $DB->setGeoTCard($row->card_id,$m_coordinates['lat'],$m_coordinates['lng']);
                } else {
                    $m_err_desc = sprintf("[%s-%s] Google could not find this Postcode",$mM,$y);

                    $m_error = array(
                        "err_desc" => $m_err_desc,
                        "err_code" => $row->client_code,
                        "err_comp" => $row->title,
                        "err_depo" => $row->description,
                        "err_post" => $m_postcode
                    );
                    $m_errors[] = $m_error;
                    $m_ignore[] = $row->card_id;
                }
                sleep(_GEOCODE_PAUSE);
            } else {
                $m_err_desc = sprintf("[%s-%s] Postcode is invalid please check",$mM,$y);
                $m_error = array(
                    "err_desc" => $m_err_desc,
                    "err_code" => $row->client_code,
                    "err_comp" => $row->title,
                    "err_depo" => $row->description,
                    "err_post" => $m_postcode
                );
                $m_errors[] = $m_error;
                $m_ignore[] = $row->card_id;
            }
        }
    }
}
if (count($m_errors) > 0) {
    $Emails->doGeocodeErrNotify($m_errors);
}

geocode.class.php

    class Geocode {

private $m_session = NULL;
private $m_security = NULL;

private $m_session_user;
private $m_session_pass;

private $m_key = _GMAP_KEY;
private $m_url = _GMAP_URL;
private $m_res = Array();

public function __construct($p_session,$p_security) 
{
    $this->m_session    = $p_session;
    $this->m_security   = $p_security;  

    $this->m_session_user   = $this->m_session->get('USR_AUTH');
    $this->m_session_pass   = $this->m_session->get('USR_PASS');

    if ($this->m_security->doLogin($this->m_session_user,$this->m_session_pass) <= 0) 
    { 
        return NULL;
        die; 
    } 
}

public function doGeocode($p_postcode)
{
    try {
    //  //$xml = new SimpleXMLElement(sprintf($this->m_url,$p_postcode,$this->m_key),0,TRUE); //OLD FOR V.2
        $xml = new SimpleXMLElement(sprintf($this->m_url,$p_postcode),0,TRUE);

    } catch (Exception $e) {
        echo sprintf('Caught exception: %s', $e->getMessage());
        return NULL;
        die;
    }
    $st = $xml->Response->Status->code;
    if (strcmp($st, "200") == 0) 
    {
        $co = $xml->Response->Placemark->Point->coordinates;
        $cs = preg_split("/[\s]*[,][\s]*/", $co);

        $this->m_res = Array(
                "lng" => $cs[0],
                "lat" => $cs[1],
                "alt" => $cs[2]
            );
        return $this->m_res;
    } else {
        return NULL;
    }
}

}

如果有人可以帮助我,我真的很感激。我猜这与我的配置文件中的新 url 和当前的 xml 没有为传感器正确设置有关?

4

1 回答 1

0

我的地理编码东西仍然可以正常工作,就像这样不要忘记使用您自己的个人 API 密钥!

/**
* Geocode postcode to get long/lat used when adding suppliers and sites
* @param - $postcode - string - Input post code to geocode
* @return - $lat,$long - array - array containing latitude coords
*/
function geocode($postcode) {
    $postcode = urlencode(trim($postcode)); // post code to look up in this case status however can easily be retrieved from a database or a form post
    //$request_url = "http://maps.googleapis.com/maps/api/geocode/xml?address=".$postcode."&sensor=false"; // the request URL you'll send to google to get back your XML feed
    define("MAPS_HOST", "maps.google.co.uk");
    define("KEY", "YOUR API KEY HERE");
    $base_url = "http://" . MAPS_HOST . "/maps/geo?output=xml" . "&key=" . KEY;
    $request_url = $base_url . "&q=" . $postcode;
    $xml = simplexml_load_file($request_url);
    $status = $xml->Response->Status->code;
    if (strcmp($status, "200") == 0) {
      // Successful geocode
      $geocode_pending = false;
      $coordinates = $xml->Response->Placemark->Point->coordinates;
      $coordinatesSplit = explode(",", $coordinates);
      // Format: Longitude, Latitude, Altitude
      return array("lat"=>$coordinatesSplit[1],"long"=>$coordinatesSplit[0]);
    } else {
      return array("lat"=>0,"long"=>0);
    }
}
于 2013-05-21T14:26:23.680 回答