设为首页 收藏本站
查看: 695|回复: 0

[经验分享] 使用 PHP/MySQL 在google map中解析地址为经纬度

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-8-27 10:34:03 | 显示全部楼层 |阅读模式
  为了存储与地址相关联的地址解析信息,我们需要设计合适的数据架构。在本文的示例中,我们希望在地图混搭程序上显示餐馆或酒吧。对于这类场所,典型的数据库表中应包含以下必要字段:


  • 地址的唯一 id
  • 文本字符串形式的场所地址
  • 经过地址解析的位置的 lat 值和 lng 值
  另外,我们希望所提供的地址数据库可以被实际用户使用,因此,需要为场所添加人类可读的名称以进行唯一标识,并添加 type 属性以区分餐馆和酒吧(仅出于增添乐趣的目的)。


  • 文本字符串形式的场所名称
  • 场所的 type(本示例中为酒吧或者餐馆)
  在创建地址表时,请注意,Google Maps API 中的 lat 值和 lng 值只需精确到 6 位数即可唯一标识某个场所。为了少占用存储空间,我们将 lat 字段和 lng 字段指定为 FLOAT(10,6) 大小的数字。这种大小的浮点数的存储精确度为小数点后 6 位数以及小数点前最多 4 位数,例如 -123.456789 度。
可以使用下面显示的 SQL 语句创建地址表:



CREATE TABLE `markers` (
  `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  `name` VARCHAR( 60 ) NOT NULL ,
  `address` VARCHAR( 80 ) NOT NULL ,
  `lat` FLOAT( 10, 6 ) NOT NULL ,
  `lng` FLOAT( 10, 6 ) NOT NULL ,
  `type` VARCHAR( 30 ) NOT NULL
) ENGINE = MYISAM ;
请注意,以下示例代码中使用了一个虚拟 KEY 常数,您需要将该键替换为自己的键,否则您的所有请求都会返回一个610状态代码。
  使用 PHP 5 和 XML 输出进行地址解析的示例代码如下所示 :



<?php
require("phpsqlgeocode_dbinfo.php");
define("MAPS_HOST", "maps.google.com");
define("KEY", "abcdefg");
// 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());
}
// Select all the rows in the markers table
$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/geo?output=xml" . "&key=" . KEY;
// Iterate through the rows, geocoding each address
while ($row = @mysql_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 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);
       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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-104917-1-1.html 上篇帖子: php中soap的使用实例以及生成WSDL文件,提供自动生成WSDL文件的类库——SoapDiscovery.class.php类 下篇帖子: 谈谈PHP内置函数命名
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表