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

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

TIM截图helingqi.png

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

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

先上地址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

文章翻页

 
已有 7 条评论
  1. 王玲子
    小乖.png
    王玲子 回复
  2. Waxxh
    不错不错,就是要带上几十公里长的大刀,我才跑不掉 捂嘴笑.png
    Waxxh 回复
    1. 王玲子
      @Waxxh 挖鼻.png 你等着,我带着50公里的刀来了
      王玲子 回复
    2. 落叶大大
      @Waxxh 滑稽.png 这个怪不了我,接口的问题
      落叶大大 回复
  3. 思绪的空中生活
    不准 误差大
    思绪的空中生活 回复
    1. 落叶大大
      @思绪的空中生活 阴险.png 怪我咯
      落叶大大 回复
  4. kira
    还行,还是比较准的,4.5公里
    kira 回复