Em PHP você pode resolver este problema da seguinte forma:
<?
error_reporting(E_ALL); // Somente ambiente teste
ini_set('display_errors', '1'); // Somente ambiente teste
ini_set("allow_url_fopen", "ON");
function getRealUserIp(){
switch(true){
case (!empty($_SERVER['HTTP_X_REAL_IP'])) : return $_SERVER['HTTP_X_REAL_IP'];
case (!empty($_SERVER['HTTP_CLIENT_IP'])) : return $_SERVER['HTTP_CLIENT_IP'];
case (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) : return $_SERVER['HTTP_X_FORWARDED_FOR'];
default : return $_SERVER['REMOTE_ADDR'];
}
}
$ip = getRealUserIp();
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}/json"));
$posicao = explode(",", $details->loc);
$latitude = $posicao[0];
$longitude = $posicao[1];
$localizacao = "";
$baseUrl = "http://maps.google.com/maps/api/geocode/json?latlng=$latitude,$longitude&sensor=false";
$requestUrl = str_replace(" ", "+", str_replace("+", "%2B", utf8_encode($baseUrl)));
$string = file_get_contents($requestUrl);
$json_retorno = json_decode($string, true);
if ($json_retorno["status"]=="OK"){
$bairro = $json_retorno["results"][0]["address_components"][2]["short_name"];
$cidade = $json_retorno["results"][0]["address_components"][4]["short_name"];
$estado = $json_retorno["results"][0]["address_components"][5]["short_name"];
if ($bairro <> ""){
$localizacao .= "Bairro: " . $bairro . " - ";
}
if ($cidade <> ""){
$localizacao .= "Cidade: " . $cidade . " - ";
}
if ($estado <> ""){
$localizacao .= "Estado: " . $estado;
}
}
echo ("Sua localização atual:" . $localizacao);
?>