【问题标题】:Changing from Google maps api v2 to v3从 Google maps api v2 更改为 v3
【发布时间】:2013-03-15 10:38:48
【问题描述】:

我已经使用 Google 地理编码 v3 大约 6 个月了,但它突然停止工作(我收到 610 错误)。直到最近一周左右才停止。

然后我发现了这个(见页面顶部的粉红色框!):https://developers.google.com/maps/documentation/geocoding/v2/

我已阅读所有文档,但不知道从哪里开始!

我希望这是一个小小的改变,因为我花了很长时间才走到这一步,有人可以帮忙吗?

[在此处查看完整网站][1]


更新:

require("database.php");
// Opens a connection to a MySQL server
$con = mysql_connect("localhost", $username, $password);

if (!$con)
{
    die('Could not connect: ' . mysql_error());
}

mysql_select_db("teamwork_poh", $con);


    $company = get_the_title();
    $address = get_field('address_line_1');
    $city = get_field('town_/_city');
    $post_code = get_field('post_code');
    $link = get_permalink();
    $type = get_field('kind_of_organisation');

    $sql = sprintf("select count('x') as cnt from markers where `name` = '%s'", mysql_real_escape_string($company));
    $row_dup = mysql_fetch_assoc(mysql_query($sql,$con));
    if ($row_dup['cnt'] == 0) {
        mysql_query("INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`, `link`) VALUES ('".$company."', '".$address.", ".$city.", ".$post_code."', '0.0', '0.0', '".$type."', '".$link."')");
    }
wp_reset_query();

require("database.php");

define("MAPS_HOST", "maps.googleapis.com");
define("KEY", "(my key)");

// Opens a connection to a MySQL server
$connection = mysql_connect("localhost", $username, $password);
if (!$connection) {
  die("Not connected : " . mysql_error());
}

// Set the active MySQL database
$db_selected = mysql_select_db($database, $connection);
if (!$db_selected) {
  die("Can\'t use db : " . mysql_error());
}

$query = "SELECT * FROM markers WHERE 1";
$result = mysql_query($query);
if (!$result) {
  die("Invalid query: " . mysql_error());
}

//Initialize delay in geocode speed

$delay=0;
$base_url = "http://" . MAPS_HOST . "/maps/api/geocode/json?address=";

while ($row = @mysql_fetch_assoc($result)) {
    if (!($row['lat'] * 1)) {
        $geocode_pending = true;

    while ($geocode_pending){

    $address = $row["address"];
    $id = $row["id"];

    $request_url = $base_url . "" . urlencode($address) ."&sensor=false";

    sleep(0.1);

$json = file_get_contents($request_url);
$json_decoded = json_decode($json);

$status = $json_decoded->status;

 if (strcmp($json_decoded->status, "OK") == 0) {

$geocode_pending = false;

      $lat = $json_decoded->results[0]->geometry->location->lat;
      $lng = $json_decoded->results[0]->geometry->location->lng;

// echo 'here';

      $query = sprintf("UPDATE markers " .
             " SET lat = '%s', lng = '%s' " .
             " WHERE id = '%s' LIMIT 1;",
             mysql_real_escape_string($lat),
             mysql_real_escape_string($lng),
             mysql_real_escape_string($id));
      $update_result = mysql_query($query);

      echo $id;

      if (!$update_result) {
        die("Invalid query: " . mysql_error());
      }
    }

   else {
 // failure to geocode
      $geocode_pending = false;
      echo "Address " . $address . " failed to geocode. ";
      echo "Received status " . $status . "\n";
    }

  //  usleep($delay);

    }
}

}

【问题讨论】:

  • 到底是什么问题(或者更具体地说,你的问题是什么)?我去你的网站,我看到了一张地图……
  • @duncan 它不再通过地理编码绘制标记。它在 3 月 8 日根据 google 链接停止工作,但无法确定要更改哪些内容才能再次对其进行地理编码标记。
  • 查看stackoverflow.com/a/15289007/2110460了解更多信息和更新指南链接
  • @Rafe 谢谢,我遇到了这个问题,但不知道我的哪里出了问题。我试过更改网址(请参阅有问题的更新),但这并不影响它,有什么想法吗?
  • 暂时忘记地图生成。你检查过你的xml吗?您确定要继续使用 xml 而不是切换到 json 吗?

标签: google-maps google-maps-api-3 google-geocoding-api


【解决方案1】:

当您将坐标存储在数据库中时,最好在插入新记录时进行地理编码。 即

require("dbinfo.php");//Your database parameters
//Connect to database
$dbh = new PDO("mysql:host=$host;dbname=$database", $username, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
    //Prepare query
    $name = "%".$company."%";//Wildcard for PDO paramerter
    $countSql = "SELECT COUNT(*) FROM markers WHERE `name` LIKE ?"; 
    $countStmt = $dbh->prepare($countSql);
    // Assign parameter
    $countStmt->bindParam(1,$name);
    //Execute query
    $countStmt->execute();  
    // check the row count  
    if ($countStmt->fetchColumn() == 0) { #1 EDIT changed >0 to ==0
        echo "No row matched the query."; //EDIT  From Row
        $q =$address.','.$city.','.$post_code.',UK'; 
        echo "\n";
        $base_url = "http://maps.googleapis.com/maps/api/geocode/xml?address=";
        $request_url = $base_url.urlencode($q)."&sensor=false";
        $xml = simplexml_load_file($request_url) or die("url not loading");
        if($xml->status=="OK"){#2
            // Successful geocode
            $lat = $xml->result->geometry->location->lat;
            $lng = $xml->result->geometry->location->lng; 
            $insertSql ="INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`, `link`) VALUES (?,?,?,?,?,?)";
            $insertStmt = $dbh->prepare($insertSql);
            // Assign parameter
            $insertStmt->bindParam(1,$company);
            $insertStmt->bindParam(2,$address); 
            $insertStmt->bindParam(3,$lat);
            $insertStmt->bindParam(4,$lng);
            $insertStmt->bindParam(5,$type);
            $insertStmt->bindParam(6,$link);
            //Execute query
            $insertStmt->execute();
        } #2
        else{
            "No rows inserted."; 
        }#2
    } #1
    else {#1
    echo "Rows matched the query."; //EDIT From No row
    } #1 
}// End try 


catch(PDOException $e) {
    echo "I'm sorry I'm afraid you can't do that.". $e->getMessage() ;// Remove or modify after testing 
    file_put_contents('PDOErrors.txt',date('[Y-m-d H:i:s]').", myFile.php, ". $e->getMessage()."\r\n", FILE_APPEND);  
 }

我已将您的代码转换为 PDO,因为建议停止使用 mysql_functions,因为这些已被弃用。

我让你来实现你将如何处理不返回坐标的地理编码。也可以查看和处理以下状态码

OVER_QUERY_LIMIT

零结果

请求拒绝

INVALID_REQUEST

状态码实现见pastebin

【讨论】:

  • @Rob 我已将代码更新为 PDO,因为我不再使用 mysql_ 函数,并且更容易修改我的代码以满足您的要求。代码有效
  • @Rob 代码中有错误,我将在答案中更改它。由于您遇到超限问题,我已添加代码并将其粘贴到patebin
  • 啊啊啊啊啊明白了!这是我的其他代码与它发生冲突,它正在创建标记,然后你的代码也在做同样的事情,但对其进行地理编码,所以它们发生了冲突。我会给它更多的测试,但它看起来像它的工作。非常感谢您的耐心!
  • 如果您查看 pastebin,您会看到我添加了如何处理状态代码。您采取的操作取决于您的应用程序
  • 好的,太棒了。只是为了澄清我对正在发生的事情的理解,它正在获取地址,检查名称是否唯一,对其进行地理编码,然后将结果保存在数据库中。目前只需要地址的第 1 行,为了准确起见,我应该包括第 2 行和县吗?这会让它更准确和更多的绘图机会吗?最后一个问题 - 整个过程发出 1 个地理编码请求?
【解决方案2】:

按照我们早期的 cmets,只需进行一些更改即可让您重新站起来。

这些是,更改 v3 地理编码的地址

define("MAPS_HOST", "maps.googleapis.com");
$base_url = "http://" . MAPS_HOST . "/maps/api/geocode/xml?";
$request_url = $base_url . "address=" . urlencode($address) . "&sensor=false";

然后更改返回的 xml 文件中的路径以设置纬度/经度

$coordinates = $xml->Response->Placemark->Point->coordinates;
$coordinatesSplit = split(",", $coordinates);
// Format: Longitude, Latitude, Altitude
$lat = $coordinatesSplit[1];
$lng = $coordinatesSplit[0];

可以完全替换为

$lat = $xml->result->geometry->location->lat;
$lng = $xml->result->geometry->location->lng;

关于阻止它超出地理编码限制的下一篇文章。您需要做的是在运行地理编码之前设置一个简单的检查。

while ($row = @mysql_fetch_assoc($result)) {
    if (!($row['lat'] * 1)) {// add this line
        $geocode_pending = true;
            while ($geocode_pending){
                //do geocoding stuff
            }
        }
    }// add this close
}

【讨论】:

  • 只是一个简单的问题(感谢您的回答,它解决了最初的问题) - 我现在达到了地理编码查询限制,只是因为它每次都尝试对所有 130 个地址进行地理编码。解决方案是在地址输入数据库时​​对其进行地理编码,但不确定如何执行此操作。我试过大卫的答案,但没有运气,还有其他选择吗?
  • 我以为您对此有一个新问题。简单的答案是在 $geocode_pending = true; 之前进行检查。查看 lat 和 lng 是否已经设置。如果不是,则运行代码,如果是,则跳过它。
  • 我被告知要继续这个问题。任何一个代码示例的机会,它现在已经超出了我的脑海。那么赏金就是你的了!
  • 该更新应该可以解决问题。我这样做是为了检查数字 0 或字符串“0.0”的任何组合。如果它不适合您的需求/编码实践,您可能需要修改它。
  • 好的,谢谢,我目前仍然超出查询限制。需要多长时间才能清除?我想我会知道一旦它消失了它是否有效。标记以零纬度/经度进入数据库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 2011-03-21
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
相关资源
最近更新 更多