PHP 설치 GeoIP 확장 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}}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.