【问题标题】:How get latitude and longitude by client ip? [duplicate]如何通过客户端 ip 获取经纬度? [复制]
【发布时间】:2014-04-14 22:26:25
【问题描述】:

我使用这个函数来获取客户端 IP

function get_client_ip() {
    $ipaddress = '';
    if ($_SERVER['HTTP_CLIENT_IP'])
        $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
    else if($_SERVER['HTTP_X_FORWARDED_FOR'])
        $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
    else if($_SERVER['HTTP_X_FORWARDED'])
        $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
    else if($_SERVER['HTTP_FORWARDED_FOR'])
        $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
    else if($_SERVER['HTTP_FORWARDED'])
        $ipaddress = $_SERVER['HTTP_FORWARDED'];
    else if($_SERVER['REMOTE_ADDR'])
        $ipaddress = $_SERVER['REMOTE_ADDR'];
    else
        $ipaddress = 'UNKNOWN';

    return $ipaddress; 
}

$ip = get_client_ip();

但是我如何从服务器端而不是客户端获取纬度和经度?

【问题讨论】:

标签: php wordpress web


【解决方案1】:

PHP 没有对此的内置支持。您可以利用ip2location等第三方库从IP地址中获取经度和纬度。

旁注:通过 IP 地址确定纬度 - 经度可能无法获取准确的信息。

使用geoplugin.net。看看这是否适合你。

<?php
$new_arr[]= unserialize(file_get_contents('http://www.geoplugin.net/php.gp?ip='.$_SERVER['REMOTE_ADDR']));
echo "Latitude:".$new_arr[0]['geoplugin_latitude']." and Longitude:".$new_arr[0]['geoplugin_longitude'];

OUTPUT :

Latitude:180.240601 and Longitude:12.9819

【讨论】:

  • 是开源的吧?
  • 不,不是。您需要购买它。
  • 我对队友一无所知。
  • 查看我的回答我正在使用它。并且是开源的。
  • 通过链接in1.php.net/manual/en/book.geoip.php查看我的答案
【解决方案2】:

同样是开源的 php.net 的最佳选择:Geo IP

您可以使用以下步骤安装它。在我提供的链接上给出:

在终端中运行这些命令。

wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gunzip GeoLiteCity.dat.gz
sudo mkdir -v /usr/share/GeoIP
sudo mv -v GeoLiteCity.dat /usr/share/GeoIP/GeoIPCity.dat

sudo apt-get install php5-geoip

希望对你有帮助!!

【讨论】:

  • 谢谢你能展开吗?
  • 跟随教程。您需要先使用终端安装geoIP
  • 我在那里检查过,但我没有看到我从页面顶部的函数中获得的通过 ip 给我纬度的函数
  • 它可以通过IP和网站地址来给出纬度。我正在使用它。
  • 只用 print_r(geoip_record_by_name('111.118.212.180'));或 print_r(geoip_record_by_name('google.com'));安装后你就知道了。
【解决方案3】:

您应该考虑使用 Javascript API navigator.geolocation 从客户端获取用户的确切位置。使用它的好处是,它会很准确。

IP 到 Geo 的问题在于,无法保证信息准确无误。这取决于数据的更新程度。

另一方面,javascript API 直接根据 GPS 或网络地址获取地理位置(以准确者为准)。但用户必须授予访问其 GPS 的权限。

您可以使用 Javascript(如果用户允许)或回退到 ip 到地理转换

如何使用

 if (navigator.geolocation && navigator.geolocation.getCurrentPosition) {
      navigator.geolocation.getCurrentPosition(function(position) {
          // save location by sending to server
      }, function() { alert("Couldn't get your position!"); });
 }

【讨论】:

  • 谢谢,但它必须在服务器端,因为我在数据库中过滤
  • 谢谢也为我工作!!!!
【解决方案4】:

为了获得快速、复制和粘贴的解决方案,我已经编写了完成此任务的代码。

我使用这个功能:

    function getUserIP()
    {
        $client  = @$_SERVER['HTTP_CLIENT_IP'];
        $forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
        $remote  = $_SERVER['REMOTE_ADDR'];

        if(filter_var($client, FILTER_VALIDATE_IP))
        {
            $ip = $client;
        }
        elseif(filter_var($forward, FILTER_VALIDATE_IP))
        {
            $ip = $forward;
        }
        else
        {
            $ip = $remote;
        }

        return $ip;
    }

    $ipAddr = getUserIP();

    $geoIP  = json_decode(file_get_contents("http://freegeoip.net/json/$ipAddr"), true);

    echo 'lat: ' . $geoIP['latitude'] . '<br />';
    echo 'long: ' . $geoIP['longitude'];

输出:

34.0731
118.3994

它使用(免费的)freegeoip.net API,我发现它在综合数据库中速度非常快。由于是免费的,它限制为每小时 10000 个请求(每秒不到 3 个),这应该足以满足大多数项目的需求。

【讨论】:

  • 这个方法不准确
  • 使用这种方法我得到纬度 31.5 但是当我在谷歌地图中查看时我得到 32.564102 类似这样的东西
  • @user3405726,你能给出IP地址吗?
  • ip地址5.29.204.156
  • 这将是数据库中最近的注册点。 免费软件是准确的。如果您想要准确 位置,则需要使用不依赖 IP 地址的 GPS(非免费)。这与您将获得的 IP 地址一样准确,这是您最初的请求。
猜你喜欢
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 2018-12-25
  • 1970-01-01
相关资源
最近更新 更多