PHP安装GeoIP扩展根据IP获取地理位置及计算距离的方法
php  /  管理员 发布于 7年前   261
根据IP获取访客所在国家/城市/经纬度 注意:Beta版要指定版本号.如果是apt安装的PHP,直接安装php5-geoip这个包即可. 免费下载GeoLiteCity数据库(解压后18MB): 测试: 在命令行用geoiplookup查看IP信息: 可见IP地址 geoip-database提供的GeoIP.dat只能精确到国家. 从maxmind官网下的数据库GeoLiteCity则信息更详细. geoiplookup 61.145.122.155 则同时显示上述两个数据库的信息. 根据IP确定经纬度与计算距离 可以用 根据用户IP确定经纬度. 返回的西经和南纬是负数. 5000米转成经纬度: 数据库用户表中设两个字段,分别存储用户的经度lat和纬度lon. 这个范围是一个粗略的范围,下面计算距离后把超过5公里的用户去掉即可. 根据上面查询出来的用户的经纬度, 然后就可以用uasort或array_multisort由近到远列出用户了,比如有名为win,osx,lin这3个用户:
安装GeoIP扩展:sudo apt-get install libgeoip-dev
pecl install geoip-1.1.0
php.ini中加入:extension=geoip.sogeoip.custom_directory="/usr/share/GeoIP"
http://dev.maxmind.com/geoip/legacy/install/city/wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gzgunzip GeoLiteCity.dat.gzsudo mkdir -v /usr/share/GeoIPsudo mv -v GeoLiteCity.dat /usr/share/GeoIP/GeoIPCity.dat
php -a
AS [country_code] => CN [country_code3] => CHN [country_name] => China //国家 [region] => 22 [city] => Beijing //城市 [postal_code] => [latitude] => 39.928901672363 //纬度 [longitude] => 116.38829803467 //经度 [dma_code] => 0 [area_code] => 0)
traceroute www.oschina.net
61.145.122.155
sudo apt-get install geoip-bin geoip-databasegeoiplookup 61.145.122.155 -f /usr/share/GeoIP/GeoIP.datGeoIP Country Edition: CN, China
geoiplookup 61.145.122.155 -f /usr/share/GeoIP/GeoIPCity.datGeoIP City Edition, Rev 1: CN, 30, Guangdong, Guangzhou, N/A, 23.116699, 113.250000, 0, 0
geoip_record_by_name($_SERVER['REMOTE_ADDR'])
注意:geoip_record_by_name()
纬度 Latitude: 1 deg = 110852 m
经度 Longitude: 1 deg = 111320*cos(lat) m
同一经线上,相差一纬度约为 110852 米
同一纬线上,相差一经度约为 111320*cos(lat) 米 (lat为该纬线的纬度)= ($lat-$y) and lat <= ($lat+$y) and lon >= ($lon-$x) and lon <= ($lon+$x);';
($lat-$y) <= lat <= ($lat+$y)($lon-$x) <= lon <= ($lon+$x)
用半正矢公式(Haversine)根据经纬度计算两点间距离: array( 'dis' => 1024, 'age' => 31 ), 'osx' => array( 'dis' => 512, 'age' => 15 ), 'lin' => array( 'dis' => 512, 'age' => 25 ));foreach($arr as $k => $v) { $sort['dis'][$k] = $v['dis']; $sort['age'][$k] = $v['age'];}//先按距离升序排序,如果距离相同,则按年龄降序排序array_multisort($sort['dis'], SORT_ASC, $sort['age'], SORT_DESC, $arr);echo json_encode($arr);//{"lin":{"dis":512,"age":25},"osx":{"dis":512,"age":15},"win":{"dis":1024,"age":31}}
您可能感兴趣的文章:
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号