繁体   English   中英

如何从经纬度点获取城市名称?

[英]How can I get city name from a latitude and longitude point?

有没有办法使用谷歌地图 api 为 javascript 从纬度和经度点获取城市名称?

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

这是一个完整的示例:

<!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>

在 node.js 中,我们可以使用节点地理编码器 npm 模块从 lat、lng 获取地址,

地理.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);
});

output:

节点geo.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' } ]

这是谷歌地理编码 Web 服务的最新示例

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

只需将YOUR_API_KEY更改为您从Google 地理编码 API获得的 API 密钥

P/S:地理编码 APIPlaces NOT Maps下;)

这是使用 promise 的现代解决方案:

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);

promise 在 'then' 中返回地址 object 或在 'catch' 中返回错误状态码

以下代码可以正常获取城市名称(使用Google Map Geo API ):

HTML

<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;
            }
        }
    );
}

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

您可以通过执行以下 function 轻松获取位置名称

 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); ); }); };

以下代码对我来说很好地获取城市,state,国家,邮政编码(使用谷歌 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);
            
            }
        });

与@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;
}

BigDataCloud也为此提供了一个不错的 API,也适用于 nodejs 用户。

他们有API 供客户免费使用 但也适用于后端,使用 API_KEY(根据配额免费)。

他们的 GitHub 页面

代码如下:

const client = require('@bigdatacloudapi/client')(API_KEY);

async foo() {
    ...
    const location: string = await client.getReverseGeocode({
          latitude:'32.101786566878445', 
          longitude: '34.858965073072056'
    });
}

有很多可用的工具

  1. 谷歌地图 API 就像所有人都写过的
  2. use this data " https://simplemaps.com/data/world-cities " download free version and convert excel to JSON with some online converter like " http://beautifytools.com/excel-to-json-converter.php "
  3. 使用 IP 地址不好,因为使用某人的 IP 地址可能不好,用户认为您可以破解它们。

还提供其他免费和付费工具

公共 function 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;
      }
  }

您可以在您的 API 基于 Node 的库中使用此库进行反向地理编码:

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

你可以用纯 php 和谷歌地理编码 api

/*
 *
 * @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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM