Php GOOGLE Maps API v3与MySQL的动态关系
我正在设计我自己的第一个网页。这是一个不动产页面,一些用户会在其中添加开放式信息,而其他用户则可以提取这些信息。 数据库和web的代码非常好(两个月后…),插入和获取数据非常好。。。 现在谷歌地图。我正在尝试像trulia这样的东西,甚至是非常原创的东西(似乎是他们开始了混搭,对吧?)。crimereports.com也很不错 目标:从数据库中提取地址,从地理编码中获取long和lat,将其插入到表中,显示在谷歌地图中。另外:当人们浏览地图时,新的信息会弹出到地图中 以下是用于检索地址、地理代码以及将lat和lng添加回数据库的代码Php GOOGLE Maps API v3与MySQL的动态关系,php,mysql,database,google-maps-api-3,Php,Mysql,Database,Google Maps Api 3,我正在设计我自己的第一个网页。这是一个不动产页面,一些用户会在其中添加开放式信息,而其他用户则可以提取这些信息。 数据库和web的代码非常好(两个月后…),插入和获取数据非常好。。。 现在谷歌地图。我正在尝试像trulia这样的东西,甚至是非常原创的东西(似乎是他们开始了混搭,对吧?)。crimereports.com也很不错 目标:从数据库中提取地址,从地理编码中获取long和lat,将其插入到表中,显示在谷歌地图中。另外:当人们浏览地图时,新的信息会弹出到地图中 以下是用于检索地址、地理代码
<?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);
}
}
?>
响应->状态->代码;
如果(strcmp($status,“200”)==0){
//成功的地理编码
$geocode_pending=false;
$coordinates=$xml->Response->Placemark->Point->coordinates;
$CoordinationsSplit=拆分(“,”,$Coordinations);
//格式:经度、纬度、高度
$lat=$CoordinationsSplit[1];
$lng=$coordinatesSplit[0];
$query=sprintf(“更新属性”)。
设置纬度='%s',液化天然气='%s'。
其中id='%s'限制1;“,
mysql\u real\u escape\u字符串($lat),
mysql\u real\u escape\u字符串($lng),
mysql_real_escape_字符串($id));
$update\u result=mysql\u query($query);
如果(!$update\u结果){
die(“无效查询:”.mysql_error());
}
}否则如果(strcmp($status,“620”)==0){
//发送地理代码太快了
$delay+=100000;
}否则{
//地理编码失败
$geocode_pending=false;
回显“地址”。$Address。“无法进行地理编码。”;
回显“已接收状态”。$status。“
\n”;
}
usleep(延迟);
}
}
?>
以下是我对Google教程所做的更改(原始代码):
1) 更新了php:mysqli以避免错误。没有得到更多的php错误。
2) 已将url从“http://”更改。映射你的主机。“/maps/geo?output=xml”。“&key=”。钥匙
到
""
正在尝试将代码更新到API v3
如果我使用旧的url,我会得到错误610。
使用新的url,我得到:
(!)尖叫:已为忽略错误抑制 (!)警告:simplexml_load_file():I/O警告:无法加载外部实体“maps.googleapis.com/maps/api/geocode/output?参数&q=4200+Park+Blvd+”,在C:。。。。在线57 url未加载 充分披露:我是一个非常新的人,也许以上这些都没有意义。然而,我已经在这个问题上坚持了一个星期。(顺便说一句,对于那些刚接触谷歌地图的人来说,谷歌API 3开头的那本书是必须的。虽然它不涉及数据库,但它很好地解释了谷歌地图API) 有人能给我一个提示、一本书、一个教程吗?任何帮助都是巨大的帮助。 谢谢你抽出时间
<?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);
?>
第57行是
$xml=simplexml_load_file($request_url)或die(“url未加载”) 该$base\u url=”http://maps.googleapis.com/maps/api/geocode/output?parameters";代码>不指定输出。它应该是xml
或jason
。您传递的参数还有地址和sensor=false
或sensor=true
编辑
$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>";//
}
}
除去
$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>";//
}
}
编辑
$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>";//
}
}
echo$lat.,“$lng.”
“//
}
}
删除其余的代码,并确保在开始添加其余的代码之前能够正常工作这是部分成功。
此代码完成以下任务:
a) 从表中获取地址;
b) 从谷歌获取lat和lnt;
c) 将数据插入到表中
我还需要解决这个问题。此外,我是一个3个月大的程序员。。。我花了两周的时间才完成上面的工作。。。我把延迟留在那里只是为了参考(这是谷歌的教程,里面有来自网络上其他人的更改。)
我试图投票支持斯特拉坎先生的答案,但我在堆栈溢出中缺乏声誉。。。我做不到。这一修正方案同样有效。谢谢你抽出时间
<?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);
?>
响应->状态->代码;
如果(strcmp($status,“200”)==0){
//成功的地理编码
echo'
成功的地理编码
;
$geocode_pending=false;
}
否则如果(strcmp($status,“620”)==0){
//发送地理代码太快了
$delay+=100000;
}否则{
//地理编码失败
$geocode_pending=false;
回显“地址”。$Address。“无法进行地理编码。”;
回显“已接收状态”。$status。“
\n”;
}*/
usleep(延迟);
}
}
mysql_close($conn);
?>
谢谢您抽出时间!错误消息现在似乎更接近解决方案。首先,我用你的8行代码替换了这一行(url$base_url=“)。我对这一行不熟悉……这是我现在得到的:注意:未定义的变量:C中的行:…在第48行(这是你的第一行)。我还得到了以下错误:(注意:在第67行(第67行:$status=$xml->Response->status->code;)尝试获取C中非对象的属性:…)最后,我收到了这样一条消息:“地址…未能进行地理编码。已收到状态”。它会读取每个地址!您从$q=$row[“Address”];
Tryecho$q;
中得到了什么?谢谢您的帮助。错误消息:“未定义变量:C:\wamp\www\test\geocode.php中的行”。我尝试打印“q”,什么也没有发生。代码读取所有地址行并返回相同的消息:“正在尝试获取C:\wamp\www\test\…”中非对象的属性。我猜代码和mysql都很好。问题是与谷歌的连接,似乎url是主要障碍。我用键尝试了谷歌V2代码,它给出了610个错误。通过V3代码和您的帮助,我得到了上述错误。比以前不阅读mysql时要好。再次感谢您的帮助!我答案中的url是如果您在浏览器中键入了地址,则更正