[英]PHP get visitor location by latitude longitude
試試這個,希望對您有幫助
function get_location($lat, $lon) {
$url = "http://maps.googleapis.com/maps/api/geocode/json?latlng=" .
$lat . "," . $lon . "&sensor=false";
$json = @file_get_contents($url);
$data = json_decode($json);
$status = $data->status;
$address = '';
if ($status == "OK") {
$address = $data->results[0]->formatted_address;
return $address;
} else
return '';
}
echo get_location($lat, $lon); //function call
如果我理解正確,那么您為訪客存儲了經度和緯度。 為了獲得具有這些值的地址,您將需要使用第三方API對位置進行“反向地理編碼”。
一些選項是:
- 谷歌的地理編碼服務
-Mapbox的API
-OSM可能也有東西。
您可以使用curl之類的方法從Mapbox網站查詢這些API的示例
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://api.mapbox.com/geocoding/v5/mapbox.places/-73.989,40.733.json?access_token=your-access-token",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "GET",
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
以下是我發現的使用http://ipinfodb.com/ip_locator.php來獲取其信息的代碼段的修改后的版本。 請記住,您也可以向他們申請API密鑰,並直接使用API來獲取您認為合適的信息。 如您所見, http://ipinfodb.com/ip_location_api.php ,它們提供了從PHP到JavaScript到ASP.Net的所有示例。 如前所述,下面不需要密鑰,因為它可以拉動其公共頁面,而Regex可以通過該頁面獲取指定的信息。 鑰匙是免費的。
function detect_location($ip=NULL, $asArray=FALSE) {
if (empty($ip)) {
if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; }
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; }
else { $ip = $_SERVER['REMOTE_ADDR']; }
}
elseif (!is_string($ip) || strlen($ip) < 1 || $ip == '127.0.0.1' || $ip == 'localhost') {
$ip = '8.8.8.8';
}
$url = 'http://ipinfodb.com/ip_locator.php?ip=' . urlencode($ip);
$i = 0; $content; $curl_info;
while (empty($content) && $i < 5) {
$ch = curl_init();
$curl_opt = array(
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $url,
CURLOPT_TIMEOUT => 1,
CURLOPT_REFERER => 'http://' . $_SERVER['HTTP_HOST'],
);
if (isset($_SERVER['HTTP_USER_AGENT'])) $curl_opt[CURLOPT_USERAGENT] = $_SERVER['HTTP_USER_AGENT'];
curl_setopt_array($ch, $curl_opt);
$content = curl_exec($ch);
if (!is_null($curl_info)) $curl_info = curl_getinfo($ch);
curl_close($ch);
}
$araResp = array();
if (preg_match('{<li>City : ([^<]*)</li>}i', $content, $regs)) $araResp['city'] = trim($regs[1]);
if (preg_match('{<li>State/Province : ([^<]*)</li>}i', $content, $regs)) $araResp['state'] = trim($regs[1]);
if (preg_match('{<li>Country : ([^<]*)}i', $content, $regs)) $araResp['country'] = trim($regs[1]);
if (preg_match('{<li>Zip or postal code : ([^<]*)</li>}i', $content, $regs)) $araResp['zip'] = trim($regs[1]);
if (preg_match('{<li>Latitude : ([^<]*)</li>}i', $content, $regs)) $araResp['latitude'] = trim($regs[1]);
if (preg_match('{<li>Longitude : ([^<]*)</li>}i', $content, $regs)) $araResp['longitude'] = trim($regs[1]);
if (preg_match('{<li>Timezone : ([^<]*)</li>}i', $content, $regs)) $araResp['timezone'] = trim($regs[1]);
if (preg_match('{<li>Hostname : ([^<]*)</li>}i', $content, $regs)) $araResp['hostname'] = trim($regs[1]);
$strResp = ($araResp['city'] != '' && $araResp['state'] != '') ? ($araResp['city'] . ', ' . $araResp['state']) : 'UNKNOWN';
return $asArray ? $araResp : $strResp;
}
detect_location();
// returns "CITY, STATE" based on user IP
detect_location('xxx.xxx.xxx.xxx');
// returns "CITY, STATE" based on IP you provide
detect_location(NULL, TRUE); // based on user IP
// returns array(8) { ["city"] => "CITY", ["state"] => "STATE", ["country"] => "US", ["zip"] => "xxxxx", ["latitude"] => "xx.xxxxxx", ["longitude"] => "-xx.xxxxxx", ["timezone"] => "-07:00", ["hostname"] => "xx-xx-xx-xx.host.name.net" }
detect_location('xxx.xxx.xxx.xxx', TRUE); // based on IP you provide
// returns array(8) { ["city"] => "CITY", ["state"] => "STATE", ["country"] => "US", ["zip"] => "xxxxx", ["latitude"] => "xx.xxxxxx", ["longitude"] => "-xx.xxxxxx", ["timezone"] => "-07:00", ["hostname"] => "xx-xx-xx-xx.host.name.net" }
call.php
<?php
$ip = $_REQUEST['REMOTE_ADDR']; // the IP address to query
$query = @unserialize(file_get_contents('http://ip-api.com/php/'.$ip));
if($query && $query['status'] == 'success') {
echo 'Hello visitor from '.$query['country'].', '.$query['city'].'!';
} else {
echo 'Unable to get location';
}
?>
和class.php :
<?php
class IPAPI {
static $fields = 65535; // refer to http://ip-api.com/docs/api:returned_values#field_generator
static $use_xcache = true; // set this to false unless you have XCache installed (http://xcache.lighttpd.net/)
static $api = "http://ip-api.com/php/";
public $status, $country, $countryCode, $region, $regionName, $city, $zip, $lat, $lon, $timezone, $isp, $org, $as, $reverse, $query, $message;
public static function query($q) {
$data = self::communicate($q);
$result = new static;
foreach($data as $key => $val) {
$result->$key = $val;
}
return $result;
}
private function communicate($q) {
$q_hash = md5('ipapi'.$q);
if(self::$use_xcache && xcache_isset($q_hash)) {
return xcache_get($q_hash);
}
if(is_callable('curl_init')) {
$c = curl_init();
curl_setopt($c, CURLOPT_URL, self::$api.$q.'?fields='.self::$fields);
curl_setopt($c, CURLOPT_HEADER, false);
curl_setopt($c, CURLOPT_TIMEOUT, 30);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
$result_array = unserialize(curl_exec($c));
curl_close($c);
} else {
$result_array = unserialize(file_get_contents(self::$api.$q.'?fields='.self::$fields));
}
if(self::$use_xcache) {
xcache_set($q_hash, $result_array, 86400);
}
return $result_array;
}
}
// example
$query = IPAPI::query("google.com");
echo 'Country: '.$query->country.', city: '.$query->city;
echo '<br><br>debug: <pre>';
var_dump($query);
echo '</pre>';
?>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.