如何从IP地址确定邮政编码和城市?

时间:2008-12-08 03:44:07

标签: geolocation geocoding

我正在寻找有助于将IP地址转换为邮政编码和城市的开放API或3D聚会产品的建议,以制作地理特定的网站内容。

7 个答案:

答案 0 :(得分:12)

我使用的是ip2nation:http://www.ip2nation.com

这是一个完全免费的MySQL数据库,可以将IP映射到国家/地区。它们在其站点上包含一些示例PHP脚本。

我在我的WordPress博客上使用它和Ozh的免费IP to Nation WordPress Plugin

即使你没有使用WordPress,也要下载插件,因为它会为你提供一套很好的PHP代码来访问数据库。他甚至还有一组漂亮的小国旗,你可以在旁边显示,或者代替国家名称,这就是我在博客的评论者姓名旁边自动显示标志的行为。

实际上,您不需要API。您所需要的只是数据库以及编写PHP和SQL代码以访问它的能力。

我不推荐ip2location供临时使用。他们为他们的数据库收取了很多费用,他们的数据库非常庞大,并且比大多数人需要更多的细节。

但ip2nation只会进入国家/地区级别。如果你确实需要城市和邮政编码(尽管其他答案/评论已经说明它们可能是错误的),那么除了ip2location,you can try GeoBytes。它们具有特别适用于特定于地理位置的网站内容的组件,例如GeoSelect:http://www.geobytes.com/GeoSelect.htm

另外search for "ip to zipcode" on Google

答案 1 :(得分:10)

我找到的最好的(意思是易于集成和免费)方式here。该服务是完全免费的,不需要任何本地安装,也不会强迫您在您的网站上放置横幅(而不是IP2Location)。它们的唯一限制是查询限制,这是非常合理的:您可以每2秒触发一次查询,即使您进行更频繁的查询,您也会得到稍微慢一点的结果。享受!

答案 2 :(得分:8)

答案 3 :(得分:2)

我希望所有想要从IP地址获取位置的用户都可以使用这个小代码获得正确的解决方案。

$ip_addr = $_SERVER['REMOTE_ADDR'];
$geoplugin = unserialize( file_get_contents('http://www.geoplugin.net/php.gp?ip='.$ip_addr) );

if ( is_numeric($geoplugin['geoplugin_latitude']) && is_numeric($geoplugin['geoplugin_longitude']) ) {
    $lat = $geoplugin['geoplugin_latitude'];
    $long = $geoplugin['geoplugin_longitude'];
}

答案 4 :(得分:1)

Geocoder.ca提供了大量的ip地址信息(仅限北美) 例如, http://geocoder.ca/99.229.2.190?geoit=xml(也支持geoit = json和jsonp)

<result>
<geodata>
  <latt>43.623262</latt>
  <longt>-79.749543</longt>
  <city>MISSISSAUGA</city>
  <prov>ON</prov>
  <postal>L5N7Z9</postal>
  <stnumber>1837</stnumber>
  <staddress>Samuelson CIR</staddress>
  <TimeZone>America/Toronto</TimeZone>
  <AreaCode>289</AreaCode>
  <confidence>1</confidence>
  <intersection>
    <street1>Samuelson Cir</street1>
    <street2>Stockbridge Crt</street2>
    <lattx>43.622696</lattx>
    <longtx>-79.748706</longtx>
    <city>MISSISSAUGA</city>
    <prov>ON</prov>
    <distance>0.179</distance>
  </intersection>
 </geodata>
 </result>

答案 5 :(得分:0)

以下是我发现使用http://ipinfodb.com/ip_locator.php获取其信息的代码段的修改版本。请注意,您也可以使用它们申请API密钥,并直接使用API​​获取您认为合适的信息。正如您所看到的http://ipinfodb.com/ip_location_api.php,它们包含从PHP到JavaScript到ASP.Net的所有示例。如上所述,下面不需要密钥,因为它通过页面提取其公共页面和正则表达式来获取指定信息。钥匙是免费的。

function detect_location($ip=NULL, $asArray=FALSE) {
    if (empty($ip)) {
        if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; }
        elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; }
        else { $ip = $_SERVER['REMOTE_ADDR']; }
    }
    elseif (!is_string($ip) || strlen($ip) < 1 || $ip == '127.0.0.1' || $ip == 'localhost') {
        $ip = '8.8.8.8';
    }

    $url = 'http://ipinfodb.com/ip_locator.php?ip=' . urlencode($ip);
    $i = 0; $content; $curl_info;

    while (empty($content) && $i < 5) {
        $ch = curl_init();
        $curl_opt = array(
            CURLOPT_FOLLOWLOCATION => 1,
            CURLOPT_HEADER => 0,
            CURLOPT_RETURNTRANSFER  => 1,
            CURLOPT_URL => $url,
            CURLOPT_TIMEOUT => 1,
            CURLOPT_REFERER => 'http://' . $_SERVER['HTTP_HOST'],
        );
        if (isset($_SERVER['HTTP_USER_AGENT'])) $curl_opt[CURLOPT_USERAGENT] = $_SERVER['HTTP_USER_AGENT'];
        curl_setopt_array($ch, $curl_opt);
        $content = curl_exec($ch);
        if (!is_null($curl_info)) $curl_info = curl_getinfo($ch);
        curl_close($ch);
    }

    $araResp = array();
    if (preg_match('{<li>City : ([^<]*)</li>}i', $content, $regs)) $araResp['city'] = trim($regs[1]);
    if (preg_match('{<li>State/Province : ([^<]*)</li>}i', $content, $regs)) $araResp['state'] = trim($regs[1]);
    if (preg_match('{<li>Country : ([^<]*)}i', $content, $regs)) $araResp['country'] = trim($regs[1]);
    if (preg_match('{<li>Zip or postal code : ([^<]*)</li>}i', $content, $regs)) $araResp['zip'] = trim($regs[1]);
    if (preg_match('{<li>Latitude : ([^<]*)</li>}i', $content, $regs)) $araResp['latitude'] = trim($regs[1]);
    if (preg_match('{<li>Longitude : ([^<]*)</li>}i', $content, $regs)) $araResp['longitude'] = trim($regs[1]);
    if (preg_match('{<li>Timezone : ([^<]*)</li>}i', $content, $regs)) $araResp['timezone'] = trim($regs[1]);
    if (preg_match('{<li>Hostname : ([^<]*)</li>}i', $content, $regs)) $araResp['hostname'] = trim($regs[1]);

    $strResp = ($araResp['city'] != '' && $araResp['state'] != '') ? ($araResp['city'] . ', ' . $araResp['state']) : 'UNKNOWN';

    return $asArray ? $araResp : $strResp;
}

使用

detect_location();
//  returns "CITY, STATE" based on user IP

detect_location('xxx.xxx.xxx.xxx');
//  returns "CITY, STATE" based on IP you provide

detect_location(NULL, TRUE);    //   based on user IP
//  returns array(8) { ["city"] => "CITY", ["state"] => "STATE", ["country"] => "US", ["zip"] => "xxxxx", ["latitude"] => "xx.xxxxxx", ["longitude"] => "-xx.xxxxxx", ["timezone"] => "-07:00", ["hostname"] => "xx-xx-xx-xx.host.name.net" }

detect_location('xxx.xxx.xxx.xxx', TRUE);   //   based on IP you provide
//  returns array(8) { ["city"] => "CITY", ["state"] => "STATE", ["country"] => "US", ["zip"] => "xxxxx", ["latitude"] => "xx.xxxxxx", ["longitude"] => "-xx.xxxxxx", ["timezone"] => "-07:00", ["hostname"] => "xx-xx-xx-xx.host.name.net" }

答案 6 :(得分:0)

在Ruby中......这些是步骤

  1. 安装gem geocoder gem install geocoder
  2. 在ruby脚本中,有这些行。

    require "geocoder"

    puts Geocoder.address('76.95.251.102'); //相应地更改IP地址。

  3. 运行脚本以获取城市,州,邮政编码,国家/地区
  4. output: Bellflower, CA 90706, United States