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

Javascript 如何从经纬度点获取城市名称?,javascript,node.js,google-maps,geocoding,latitude-longitude,Javascript,Node.js,Google Maps,Geocoding,Latitude Longitude,有没有一种方法可以使用google maps api for javascript从纬度和经度点获取城市名称 如果是这样,我可以看一个例子吗?这叫做反向地理编码 来自谷歌的文档: 对谷歌地理编码Web服务的示例调用: 这是一个完整的示例: <!DOCTYPE html> <html> <head> <title>Geolocation API with Google Maps API</title> <m

有没有一种方法可以使用google maps api for javascript从纬度和经度点获取城市名称


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

这叫做反向地理编码

  • 来自谷歌的文档:

  • 对谷歌地理编码Web服务的示例调用:


    • 这是一个完整的示例:

      <!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>
      
      
      地理定位API与谷歌地图API
      功能显示位置(纬度、经度){
      var request=new XMLHttpRequest();
      var方法='GET';
      var url='1〕http://maps.googleapis.com/maps/api/geocode/json?latlng=“+纬度+”、“+经度+”&传感器=真”;
      var async=true;
      open(方法、url、异步);
      request.onreadystatechange=函数(){
      if(request.readyState==4&&request.status==200){
      var data=JSON.parse(request.responseText);
      var地址=数据。结果[0];
      文件。写入(地址。格式化的地址);
      }
      };
      request.send();
      };
      var successCallback=函数(位置){
      var x=位置坐标纬度;
      变量y=位置坐标经度;
      显示位置(x,y);
      };
      var errorCallback=函数(错误){
      var errorMessage='未知错误';
      开关(错误代码){
      案例1:
      errorMessage='权限被拒绝';
      打破
      案例2:
      errorMessage='位置不可用';
      打破
      案例3:
      errorMessage='超时';
      打破
      }
      文件。编写(错误消息);
      };
      变量选项={
      EnableHighAccurance:正确,
      超时:1000,
      最大值:0
      };
      navigator.geolocation.getCurrentPosition(successCallback、errorCallback、options);
      
      这是一个使用承诺的现代解决方案:

      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”中返回地址对象,或在“catch”中返回错误状态代码。

      以下代码可以很好地获取城市名称(使用谷歌地图地理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>
      

      与@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中,我们可以使用节点地理编码器从lat、lng获取地址

      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);
      });
      
      输出:

      <!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 geo.js


      以下是谷歌地理编码网络服务的最新示例

      只需将
      您的\u API\u密钥
      更改为您从中获得的API密钥


      p/S:地理编码API位于位置下不是地图;)

      您可以使用纯php和google geocode api来实现

      /*
      *
      *@param latlong(字符串)是纬度和经度,带有分隔符,例如“21.3724002,39.8016229”
      **/
      函数getCityNameBystitudeLongitude($latlong)
      {
      $APIKEY=“aizaxxxxxxxxxxxxxxxxxxxxxxxxxxxx”//将其替换为您的谷歌地图api密钥
      $googleMapsUrl=”https://maps.googleapis.com/maps/api/geocode/json?latlng=“$latlong.”&language=ar&key=“.$APIKEY;
      $response=文件获取内容($googleMapsUrl);
      $response=json_decode($response,true);
      $results=$response[“results”];
      $addressComponents=$results[0][“address_components”];
      $cityName=“”;
      foreach($addressComponents作为$component){
      //echo$组件;
      $types=$component[“types”];
      if(in_数组(“locality”,$types)和&in_数组(“political”,$types)){
      $cityName=$component[“long_name”];
      }
      }
      如果($cityName==“”){
      echo“未能获取CityName”;
      }否则{
      echo$cityName;
      }
      }
      
      有许多可用的工具

    • 谷歌地图API就像所有人写的一样
    • 使用这些数据 "" 下载免费版本并使用一些在线转换器将excel转换为JSON,如“”
    • 使用IP地址 这是不好的,因为使用某人的IP地址可能不好 用户认为你可以破解它们
    • 其他免费和付费工具也可用

      也有一个很好的API用于此,也适用于nodejs用户

      他们有。而且,使用API_密钥(根据配额免费)

      代码如下所示:

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

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

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

      const fetchLocationName=async(lat,lng)=>{
      待命(
      'https://www.mapquestapi.com/geocoding/v1/reverse?key=API-Key&location='+lat+'%2C'+lng+'&outFormat=json&thumbMaps=false',
      )
      .then((response)=>response.json())
      .然后((responseJson)=>{
      console.log(
      “地址地理编码回来了!!=>”+JSON.stringify(responseJson),
      );
      });
      
      };太棒了!我读了这篇文章,现在又发现了太多的疑问;)谢谢。如果你使用javascript API,每个IP地址和每个用户都是一样的,但是如果你使用PHP,你认为你会达到这些限制,你需要将请求限制在每秒1个,或者使用代理服务器,但是要小心代理,谷歌并不愚蠢,你不能攻击它们。此处的更多信息:您需要找到一个提供此功能的web服务。是否有任何方法可以在未经用户批准的情况下从纬度和经度查找用户位置?@VikasVerma如果允许您在没有用户许可的情况下查找用户位置,这将严重侵犯隐私consent@omerio谢谢,但我在那个里做了代码,我强迫用户点击允许他/她想继续。这实际上给了我确切的家庭地址。正是我想要的。我如何像城市和州一样提取
      const client = require('@bigdatacloudapi/client')(API_KEY);
      
      async foo() {
          ...
          const location: string = await client.getReverseGeocode({
                latitude:'32.101786566878445', 
                longitude: '34.858965073072056'
          });
      }