PHP 설치 GeoIP 확장 IP 에 따라 지리 적 위치 및 거 리 를 계산 하 는 방법

4459 단어 PHP지리 적 위치
IP 에 따라 방문객 이 있 는 국가/도시/경위도 획득
GeoIP 확장 설치:

sudo apt-get install libgeoip-dev

pecl install geoip-1.1.0 
메모:베타 버 전 은 버 전 번 호 를 지정 해 야 합 니 다.apt 에 설 치 된 PHP 라면 p5-geoip 이 가방 을 직접 설치 하면 됩 니 다.
php.ini 에 가입:

extension=geoip.so
geoip.custom_directory="/usr/share/GeoIP"
GeoLiteCity 데이터베이스 무료 다운로드(압축 해제 후 18MB):
http://dev.maxmind.com/geoip/legacy/install/city/

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
테스트:

php -a

<?php
print_r(geoip_record_by_name('106.37.165.80')); //    Ctrl+D  
Array
(
 [continent_code] => 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
)

명령 행 에서 IP 정 보 를 geoiplookup 으로 보기:

traceroute www.oschina.net 
보 이 는 IP 주소

 61.145.122.155

sudo apt-get install geoip-bin geoip-database
geoiplookup 61.145.122.155 -f /usr/share/GeoIP/GeoIP.dat
GeoIP Country Edition: CN, China
geoip-database 가 제공 하 는 GeoIP.dat 는 국가 까지 만 정확 할 수 있 습 니 다.

geoiplookup 61.145.122.155 -f /usr/share/GeoIP/GeoIPCity.dat
GeoIP City Edition, Rev 1: CN, 30, Guangdong, Guangzhou, N/A, 23.116699, 113.250000, 0, 0
max mind 홈 페이지 의 데이터베이스 GeoLite City 는 정보 가 더욱 상세 합 니 다.
geoiplookup 61.145.122.155 는 상기 두 데이터 베 이 스 를 동시에 표시 합 니 다.
IP 에 따라 경위도 와 계산 거 리 를 확정 합 니 다.
쓸 수 있다

geoip_record_by_name($_SERVER['REMOTE_ADDR'])
사용자 IP 에 따라 경 위 를 확인 합 니 다.
주의:

geoip_record_by_name()
돌아 온 서경 과 남 위 는 마이너스 다.
5000 미터 에서 경위도 로 전환:
위도 위도:  1 deg = 110852 m
경도 경도:1 deg=111320*cos(lat)m
같은 날실 에서 1 위도 차 이 는 약 110852 미터 이다.
같은 위선 에서 한 경도 의 차 이 는 약 111320*cos(lat)미터(lat 는 이 위선 의 위도)이다.

<?php
//           ,  5000       
$y = 5000 / 110852; //     
$x = 5000 / (111320*cos($lat)); //     
$sql = '
 select * from user where 
 lat >= ($lat-$y) and lat <= ($lat+$y) and 
 lon >= ($lon-$x) and lon <= ($lon+$x);
';
데이터베이스 사용자 테이블 에 두 개의 필드 를 설정 하여 사용자 의 경도 lat 와 위도 lon 을 각각 저장 합 니 다.

($lat-$y) <= lat <= ($lat+$y)
($lon-$x) <= lon <= ($lon+$x)
이 범 위 는 대략적인 범위 이 며,아래 에서 거 리 를 계산 한 후 5 킬로미터 가 넘 는 사용 자 를 제거 하면 된다.
위 에서 조회 한 사용자 의 경위도 에 따라
반 정시 공식(Haversine)으로 경위도 에 따라 두 점 간 거 리 를 계산한다.

<?php
function distance($lat1, $lon1, $lat2, $lon2) {
 $R = 6371393; //      ,   
 $dlat = deg2rad($lat2-$lat1);
 $dlon = deg2rad($lon2-$lon1);
 $a = pow(sin($dlat/2), 2) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * pow(sin($dlon/2), 2);
 $c = 2 * atan2(sqrt($a), sqrt(1-$a));
 $d = $R * $c;
 return round($d);
}
echo distance(0, 0, -1, 0); // 111202 
그리고 uasort 또는 arraymultisort 는 가 까 운 곳 에서 먼 곳 까지 사용 자 를 보 여 줍 니 다.예 를 들 어 win,osx,lin 등 세 명의 사용자 가 있 습 니 다.

<?php
$arr = array(
 'win' => 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}}

좋은 웹페이지 즐겨찾기