1

我正在设计我自己的第一个网页。这是一个房地产页面,一些用户将添加开放房屋信息,而其他用户可以提取信息。数据库和网络的代码非常好(两个月后......)并且插入和获取数据很甜蜜......现在谷歌地图。我正在尝试拥有像 trulia 甚至是非常原始的Housingmaps.com之类的东西(似乎他们开始了混搭,对吧?)。crimereports.com 也非常好。

目标:从数据库中提取地址,从地理编码中获取经纬度,将其插入表中,在谷歌地图中显示。另外:当人们平移地图时,新信息会弹出到地图中。

这是检索地址、地理代码以及将 lat 和 lng 添加回数据库的代码。

<?php
//require("phpsqlajax_dbinfo.php");

// Opens a connection to a MySQL server
$username = "abc"; //personal info changed to abc
$password = "abc";
$hostname = "abc"; 
$database = "abc";
$connection = mysqli_connect($hostname, $username, $password);
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

//if (!$connection) {
  //die("Not connected : " . mysql_error());
//}

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



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

// Select all the rows in the markers table
$query = "SELECT * FROM brokerstour.property WHERE 1";
$result = mysqli_query($connection, $query);
if (!$result) {
  die("Invalid query: " . mysql_error());
}

// Initialize delay in geocode speed
$delay = 0;
$base_url = "http://maps.googleapis.com/maps/api/geocode/output?parameters";

// Iterate through the rows, geocoding each address
while ($row = @mysqli_fetch_assoc($result)) {
  $geocode_pending = true;

  while ($geocode_pending) {
    $address = $row["address"];
    $id = $row["id"];
    $request_url = $base_url . "&q=" . urlencode($address);
    $xml = simplexml_load_file($request_url) or die("url not loading");

    $status = $xml->Response->Status->code;
    if (strcmp($status, "200") == 0) {
      // Successful geocode
      $geocode_pending = false;
      $coordinates = $xml->Response->Placemark->Point->coordinates;
      $coordinatesSplit = split(",", $coordinates);
      // Format: Longitude, Latitude, Altitude
      $lat = $coordinatesSplit[1];
      $lng = $coordinatesSplit[0];

      $query = sprintf("UPDATE property " .
             " 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);
      if (!$update_result) {
        die("Invalid query: " . mysql_error());
      }
    } else if (strcmp($status, "620") == 0) {
      // sent geocodes too fast
      $delay += 100000;
    } else {
      // failure to geocode
      $geocode_pending = false;
      echo "Address " . $address . " failed to geocoded. ";
      echo "Received status " . $status . "
\n";
    }
    usleep($delay);
  }
}
?>

这是我对谷歌教程(原始代码)所做的更改: 1)更新了 php: mysqli 以避免错误。没有得到更多的php错误。2) 将 url 从 "http://" 更改。MAPS_HOST 。“/maps/geo?output=xml”。“&键=”。钥匙; TO“ http://maps.googleapis.com/maps/api/geocode/output?parameters ”试图将代码更新到 API v3。

如果我使用旧网址,我会收到错误 610。使用新网址,我会得到:


(!)SCREAM:忽略(!)的错误抑制警告:simplexml_load_file():I / O警告:无法加载外部实体“maps.googleapis.com/maps/api/geocode/output?parameters&q=4200+Park+Blvd+ " 在 C:.... 第 57 行 .....

网址未加载

全面披露:我很新,也许上面的内容甚至没有意义。但是,我已经在这个问题上停留了一周。(顺便说一下,对于那些刚接触谷歌地图的人来说,《Beginning Google API 3》一书是必须的。虽然它不处理数据库,但很好地解释了谷歌地图 API)。

有人可以提供任何提示,书籍,教程吗?任何帮助都是很大的帮助。感谢您的时间。

第 57 行是 $xml = simplexml_load_file($request_url) 或 die("url not loading");

4

2 回答 2

2

$base_url = "http://maps.googleapis.com/maps/api/geocode/output?parameters";您没有指定输出。它应该是 xmljason。此外,您传递的参数是地址,sensor = false或者sensor = true

编辑

消除

$geocode_pending = true;
while ($geocode_pending) {

结束编辑

$q = $row["address"];
$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"){
    // Successful geocode
    $lat = $xml->result->geometry->location->lat;
    $lng = $xml->result->geometry->location->lng; 

编辑

    echo $lat.","$lng."<br>";//
    } 
    }

删除其余代码并确保它在逐步添加其余代码之前有效

于 2013-04-05T16:08:29.537 回答
1

这是部分成功。此代码完成: a) 从表中获取地址;b) 从谷歌获取 lat 和 lnt;c) 将数据插入表中。

我仍然需要处理延迟。此外,我是一个 3 个月大的程序员......为了完成上述工作,我花了两个星期的时间......我把延迟留在那里仅供参考(这是来自谷歌的教程,其中包含网络上其他人的更改。 )

我试图投票赞成 Strachan 先生的答案,但我在堆栈溢出中缺乏声誉......无法做到。该修复也有效。感谢您的时间。

<?php

$conn = mysql_connect('localhost', 'rxxt', 'xxxxxxx');
if(!$conn)
 {
   echo "Database Error.";
 }
 else
 {
   echo "Connected.";
   mysql_select_db('YOUR TABLE', $conn);
   $query = "SELECT * from YOUR TABLE";
   $result = mysql_query($query, $conn) or die($query.mysql_error());
    while($row = mysql_fetch_array($result))
    { 

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

      $loc_address = str_replace(" ", "+", $address); //to replace spaces by '+' signs
          $location = $loc_address;
      echo $location."<br>";
      $delay = 0;  // this delay is here just to avoid errors - 
          $url = "http://maps.google.com/maps/api/geocode/json?address=".$location."&sensor=false";
          echo $url;
            $output=file_get_contents($url);
            $out= json_decode($output);
            $lat = $out->results[0]->geometry->location->lat;
            $lng = $out->results[0]->geometry->location->lng;
            echo '<br>Lat is '. $lat;
            echo '<br>Long is '. $lng;


       $query = sprintf("UPDATE YOUR TABLE " .
             " 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 "Successfully inserted.";
    // Below is just for reference - they say we need the delay. The may problem: does not get the status to compare to 200, 620, etc.   
    /*$status = $xml->Response->Status->code;  
    if (strcmp($status, "200") == 0) {
            // Successful geocode
            echo '<br />successfull geocode</strong><br />';
            $geocode_pending = false;
    }
    else if (strcmp($status, "620") == 0) {
         // sent geocodes too fast
         $delay += 100000;
            } else {
         // failure to geocode
         $geocode_pending = false;
         echo "Address " . $address . " failed to geocoded. ";
         echo "Received status " . $status . "
        \n";
          }*/
    usleep($delay); 
    }
 }
mysql_close($conn);
?>
于 2013-04-10T17:05:37.057 回答