如何从经纬度得到城市名称?

有没有一种方法可以使用谷歌地图的 javascript 应用程序接口(api)从经纬度获得一个城市名称?

如果是这样,我可以看一个例子吗?

264438 次浏览

下面是一个完整的例子:

<!DOCTYPE html>
<html>
<head>
<title>Geolocation API with Google Maps API</title>
<meta charset="UTF-8" />
</head>
<body>
<script>
function displayLocation(latitude,longitude){
var request = new XMLHttpRequest();


var method = 'GET';
var url = 'http://maps.googleapis.com/maps/api/geocode/json?latlng='+latitude+','+longitude+'&sensor=true';
var async = true;


request.open(method, url, async);
request.onreadystatechange = function(){
if(request.readyState == 4 && request.status == 200){
var data = JSON.parse(request.responseText);
var address = data.results[0];
document.write(address.formatted_address);
}
};
request.send();
};


var successCallback = function(position){
var x = position.coords.latitude;
var y = position.coords.longitude;
displayLocation(x,y);
};


var errorCallback = function(error){
var errorMessage = 'Unknown error';
switch(error.code) {
case 1:
errorMessage = 'Permission denied';
break;
case 2:
errorMessage = 'Position unavailable';
break;
case 3:
errorMessage = 'Timeout';
break;
}
document.write(errorMessage);
};


var options = {
enableHighAccuracy: true,
timeout: 1000,
maximumAge: 0
};


navigator.geolocation.getCurrentPosition(successCallback,errorCallback,options);
</script>
</body>
</html>

这里有一个现代的解决方案,它使用了一个承诺:

function getAddress (latitude, longitude) {
return new Promise(function (resolve, reject) {
var request = new XMLHttpRequest();


var method = 'GET';
var url = 'http://maps.googleapis.com/maps/api/geocode/json?latlng=' + latitude + ',' + longitude + '&sensor=true';
var async = true;


request.open(method, url, async);
request.onreadystatechange = function () {
if (request.readyState == 4) {
if (request.status == 200) {
var data = JSON.parse(request.responseText);
var address = data.results[0];
resolve(address);
}
else {
reject(request.status);
}
}
};
request.send();
});
};

这么说吧:

getAddress(lat, lon).then(console.log).catch(console.error);

承诺返回“ then”中的地址对象或“ catch”中的错误状态代码

下面的代码可以很好地获得城市名称(使用 谷歌地图地理 API) :

超文本标示语言

<p><button onclick="getLocation()">Get My Location</button></p>
<p id="demo"></p>
<script src="http://maps.google.com/maps/api/js?key=YOUR_API_KEY"></script>

剧本

var x=document.getElementById("demo");
function getLocation(){
if (navigator.geolocation){
navigator.geolocation.getCurrentPosition(showPosition,showError);
}
else{
x.innerHTML="Geolocation is not supported by this browser.";
}
}


function showPosition(position){
lat=position.coords.latitude;
lon=position.coords.longitude;
displayLocation(lat,lon);
}


function showError(error){
switch(error.code){
case error.PERMISSION_DENIED:
x.innerHTML="User denied the request for Geolocation."
break;
case error.POSITION_UNAVAILABLE:
x.innerHTML="Location information is unavailable."
break;
case error.TIMEOUT:
x.innerHTML="The request to get user location timed out."
break;
case error.UNKNOWN_ERROR:
x.innerHTML="An unknown error occurred."
break;
}
}


function displayLocation(latitude,longitude){
var geocoder;
geocoder = new google.maps.Geocoder();
var latlng = new google.maps.LatLng(latitude, longitude);


geocoder.geocode(
{'latLng': latlng},
function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
if (results[0]) {
var add= results[0].formatted_address ;
var  value=add.split(",");


count=value.length;
country=value[count-1];
state=value[count-2];
city=value[count-3];
x.innerHTML = "city name is: " + city;
}
else  {
x.innerHTML = "address not found";
}
}
else {
x.innerHTML = "Geocoder failed due to: " + status;
}
}
);
}

和@Sanchit Gupta 一样。

在这部分

if (results[0]) {
var add= results[0].formatted_address ;
var  value=add.split(",");
count=value.length;
country=value[count-1];
state=value[count-2];
city=value[count-3];
x.innerHTML = "city name is: " + city;
}

只要控制结果数组

if (results[0]) {
console.log(results[0]);
// choose from console whatever you need.
var city = results[0].address_components[3].short_name;
x.innerHTML = "city name is: " + city;
}

在 node.js 中,我们可以使用 节点地理编码器 Npm 模块从 lat,Ing,

Geo.js

var NodeGeocoder = require('node-geocoder');


var options = {
provider: 'google',
httpAdapter: 'https', // Default
apiKey: ' ', // for Mapquest, OpenCage, Google Premier
formatter: 'json' // 'gpx', 'string', ...
};


var geocoder = NodeGeocoder(options);


geocoder.reverse({lat:28.5967439, lon:77.3285038}, function(err, res) {
console.log(res);
});

产出:

节点 ge.js

[ { formattedAddress: 'C-85B, C Block, Sector 8, Noida, Uttar Pradesh 201301, India',
latitude: 28.5967439,
longitude: 77.3285038,
extra:
{ googlePlaceId: 'ChIJkTdx9vzkDDkRx6LVvtz1Rhk',
confidence: 1,
premise: 'C-85B',
subpremise: null,
neighborhood: 'C Block',
establishment: null },
administrativeLevels:
{ level2long: 'Gautam Buddh Nagar',
level2short: 'Gautam Buddh Nagar',
level1long: 'Uttar Pradesh',
level1short: 'UP' },
city: 'Noida',
country: 'India',
countryCode: 'IN',
zipcode: '201301',
provider: 'google' } ]

这是 Google 的地理代码 Web 服务的最新样品

https://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&key=YOUR_API_KEY

只需将 YOUR_API_KEY更改为从 谷歌地理编码 API获得的 API 键

P/S: 地理编码 API is under 各就各位 NOT 地图 ;)

你可以做到这一点与纯 PHP 和谷歌地理代码应用程序接口

/*
*
* @param latlong (String) is Latitude and Longitude with , as separator for example "21.3724002,39.8016229"
**/
function getCityNameByLatitudeLongitude($latlong)
{
$APIKEY = "AIzaXXXXXXXXXXXXXXXXXXXXXXXXXXX"; // Replace this with your google maps api key
$googleMapsUrl = "https://maps.googleapis.com/maps/api/geocode/json?latlng=" . $latlong . "&language=ar&key=" . $APIKEY;
$response = file_get_contents($googleMapsUrl);
$response = json_decode($response, true);
$results = $response["results"];
$addressComponents = $results[0]["address_components"];
$cityName = "";
foreach ($addressComponents as $component) {
// echo $component;
$types = $component["types"];
if (in_array("locality", $types) && in_array("political", $types)) {
$cityName = $component["long_name"];
}
}
if ($cityName == "") {
echo "Failed to get CityName";
} else {
echo $cityName;
}
}

有许多可用的工具

  1. 谷歌地图应用程序接口一样都写了
  2. 使用这些数据 “ https://simplemaps.com/data/world-cities” 下载免费版本并使用类似“ http://beautifytools.com/excel-to-json-converter.php”的在线转换器将 Excel 转换为 JSON
  3. use IP address 这是不好的,因为使用某人的 IP 地址可能不好 用户认为你可以黑掉他们。

其他免费和付费的工具也可用

如果你不想使用谷歌地理编码 API,你可以参考一些其他免费 API 的开发目的。 例如,我使用[ mapquest] API 来获取位置名称。

您可以通过实现以下函数轻松获取位置名称

 const fetchLocationName = async (lat,lng) => {
await fetch(
'https://www.mapquestapi.com/geocoding/v1/reverse?key=API-Key&location='+lat+'%2C'+lng+'&outFormat=json&thumbMaps=false',
)
.then((response) => response.json())
.then((responseJson) => {
console.log(
'ADDRESS GEOCODE is BACK!! => ' + JSON.stringify(responseJson),
);
});
};

下面的代码对我来说很好用 城市, 国务院, country, 邮政编码 (使用 Google Map Geo API) :

 var url = "https://maps.googleapis.com/maps/api/geocode/json?latlng="+lat+","+long+"&key=KEY_HERE&sensor=false";
$.get(url, function(data) {
var results = data.results;
if (data.status === 'OK')
{
//console.log(JSON.stringify(results));
if (results[0])
{
var city = "";
var state = "";
var country = "";
var zipcode = "";
                    

var address_components = results[0].address_components;
                    

for (var i = 0; i < address_components.length; i++)
{
if (address_components[i].types[0] === "administrative_area_level_1" && address_components[i].types[1] === "political") {
state = address_components[i].long_name;
}
if (address_components[i].types[0] === "locality" && address_components[i].types[1] === "political" ) {
city = address_components[i].long_name;
}
                        

if (address_components[i].types[0] === "postal_code" && zipcode == "") {
zipcode = address_components[i].long_name;


}
                        

if (address_components[i].types[0] === "country") {
country = address_components[i].long_name;


}
}
var address = {
"city": city,
"state": state,
"country": country,
"zipcode": zipcode,
};
console.log(address);
}
else
{
window.alert('No results found');
}
}
else
{
window.alert('Geocoder failed due to: ' + status);
            

}
});

Public 函数 retornaCidade ($lat,$lng)

  {
$key      = "SUA CHAVE";
$url      = 'https://maps.googleapis.com/maps/api/geocode/json?latlng=' . $lat . ',' . $lng . '&key=' . $key;
$geoFull = json_decode ( file_get_contents ( $url ), true );


if ( $geoFull[ 'results' ] )
{
//console.log(JSON.stringify(results));
if ( $geoFull[ 'results' ][ 0 ] )
{
$cidade = "";
$estado = "";
$pais   = "";
$cep    = "";


$address_components = $geoFull[ 'results' ][ 0 ][ 'address_components' ];


for ( $i = 0; $i < count ( $address_components ); $i++ )
{
if ( ($address_components[ $i ][ 'types' ][ 0 ] == "administrative_area_level_1") && ($address_components[ $i ][ 'types' ][ 1 ] == "political" ))
{
$estado = str_replace('State of ', '',$address_components[ $i ][ 'long_name' ]);];
}
if ( ($address_components[ $i ][ 'types' ][ 0 ] == "administrative_area_level_2") && ($address_components[ $i ][ 'types' ][ 1 ] == "political" ))
{
$cidade = $address_components[ $i ][ 'long_name' ];
}


if ( $address_components[ $i ][ 'types' ][ 0 ] == "postal_code" && $cep == "" )
{
$cep = $address_components[ $i ][ 'long_name' ];
}


if ($address_components[ $i ][ 'types' ][ 0 ] == "country" )
{
$pais = $address_components[ $i ][ 'long_name' ];
}
}
$endereco = [
"cidade" => $cidade,
"estado" => $estado,
"pais"   => $pais,
"cep"    => $cep,
];
            

return $endereco;
}
else
{
return false;
}
}
else
{
return false;
}
}

You can use this library in your API based on Node to do reverse geocoding:

Https://github.com/rapomon/geojson-places