IP定位:基于腾讯地图SDK 低精度定位

TIM截图20180426205031.png

好久没有写博客了,服务器倒是折腾的多。
最近写了一个MVC框架,所以写了个小玩意儿-基于腾讯地图SDK 低精度定位。

受技术所限,我也不知道这玩意儿准不准,不管你准不准,反正我测试是不准的。

前面我发过一个很粗糙的百度高精度的文章,那个确实吓人,不过百度已经关闭了相关接口,所以也就废了。

先上地址https://zku.me/

默认模式,即访问为当前IP地址,由于接口限制,不支持港澳台及国外IP;

查询模式,后面接入IP参数即可,如 zku.me/?ip=207.46.157.49

本着开(shui)源(wen)精(zhang)神,所以我就献丑了。

if (isset($_GET['ip'])) {
    $ip = $_GET['ip'];
} else {
    $ip = getIp();
}
$key = 'BDXBZ-33YWD-XYN4K-PBL7V-K2XNK-OSFL7';
$url = "http://apis.map.qq.com/ws/location/v1/ip?ip={$ip}&key={$key}";
$arr = json_decode(file_get_contents($url), true);
if (is_array($arr)) {
    if ($arr['status'] == 0) {
        $lng     = $arr['result']['location']['lng'];
        $lat     = $arr['result']['location']['lat'];
        $url     = "http://map.baidu.com/?latlng={$lat},{$lng}&title=&src=ja&coord_type=bd09ll&autoOpen=false&output=html";
        $result  = $this->getAddress($lat, $lng, $key);
        $address = $result['address'] . " ({$result['formatted_addresses']['recommend']})";
    } else {
        $address = $arr['message'];
        $url     = '#';
    }
} else {
    $address = '局域网或IP 不支持';
    $url     = '#';
}

/**
 * 根据经纬度获取详细地址
 * @param  {float} $lat 经度
 * @param  {float} $lng 纬度
 * @param  {string} $ak 百度ak
 * @return {string}  返回地址
 */
function getAddress($lat, $lng, $key)
{
    if (empty($lat) || empty($lng)) {
        return '参数错误';
    } else {
        $url = "http://apis.map.qq.com/ws/geocoder/v1/?location={$lat},{$lng}&key={$key}&get_poi=0&coord_type=3";
        $str = file_get_contents($url);
        $arr = json_decode($str, true);
        if (is_array($arr)) {
            return $arr['result'];
        } else {
            return '参数错误';
        }
    }
}

/**
 * 获取IP 函数
 * @param  integer $type 类型
 * @return string        结果
 */
function getIp($type = 0)
{
    $type      = $type ? 1 : 0;
    static $ip = null;
    if ($ip !== null) {
        return $ip[$type];
    }

    if (@$_SERVER['HTTP_X_REAL_IP']) {
        //nginx 代理模式下,获取客户端真实IP
        $ip = $_SERVER['HTTP_X_REAL_IP'];
    } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
        //客户端的ip
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        //浏览当前页面的用户计算机的网关
        $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        $pos = array_search('unknown', $arr);
        if (false !== $pos) {
            unset($arr[$pos]);
        }

        $ip = trim($arr[0]);
    } elseif (isset($_SERVER['REMOTE_ADDR'])) {
        $ip = $_SERVER['REMOTE_ADDR']; //浏览当前页面的用户计算机的ip地址
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    // IP地址合法验证
    $long = sprintf("%u", ip2long($ip));
    $ip   = $long ? array($ip, $long) : array('0.0.0.0', 0);
    return $ip[$type];
}

以上为核心代码,当然我是结合我自己的框架写的,至于前端代码请参照DEMO。

最后,不管你准不准,反正我测试是不准的。

查询地址 https://zku.me

本站采用「署名 4.0 国际(CC BY 4.0)」创作共享协议,转载请注明本文出处及链接。

Tags: IP定位,腾讯地图,定位

文章翻页

头像
游客
发表评论
  1. 小乖.png

  2. 不错不错,就是要带上几十公里长的大刀,我才跑不掉 捂嘴笑.png

  3. 不准 误差大

  4. 还行,还是比较准的,4.5公里