答案 0 :(得分:1)
试试这个希望这会对你有所帮助
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
答案 1 :(得分:0)
如果我理解正确,您可以为访客存储纬度和经度。为了获得具有这些值的地址,您需要使用第三方API来反转地理编码"位置。
有些选择是:
- Google的地理编码服务
- Mapbox的API
- OSM也可以有一些东西。
您可以使用curl之类的内容来查询这些API 来自Mapbox网站的示例
<?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;
}
答案 2 :(得分:0)
以下是我发现使用http://ipinfodb.com/ip_locator.php获取其信息的代码段的修改版本。请注意,您也可以使用它们申请API密钥,并直接使用API获取您认为合适的信息。正如您所看到的http://ipinfodb.com/ip_location_api.php,它们包含从PHP到JavaScript到ASP.Net的所有示例。如上所述,下面不需要密钥,因为它通过页面提取公共页面和正则表达式以获取指定信息。 Key是免费的。
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>';
?>