【问题标题】:How can I get city name from a latitude and longitude point?如何从经纬度点获取城市名称?
【发布时间】:2011-09-26 18:29:38
【问题描述】:

有没有办法使用 google maps api for javascript 从纬度和经度点获取城市名称?

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

【问题讨论】:

  • 您需要找到提供此功能的网络服务。

标签: javascript node.js google-maps geocoding latitude-longitude


【解决方案1】:

【讨论】:

  • 太棒了!我读了这个,现在有太多的查询;)谢谢。
  • 如果您使用 javascript API,则每个 IP 地址和每个用户是相同的,但如果您使用的是 PHP,并且您认为您会达到这些限制,则需要限制每秒 1 次的请求或使用代理服务器,但要小心代理,谷歌并不愚蠢,你不能敲它们。更多信息在这里:developers.google.com/maps/documentation/business/articles/…
【解决方案2】:

这是一个完整的示例:

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

【讨论】:

  • 有什么方法可以不经用户同意就从经纬度找出用户位置?
  • @VikasVerma 如果允许您在未经用户同意的情况下找到用户位置,这将是严重的隐私泄露
  • @omerio 谢谢,但我在那里编写了代码,如果他/她想继续,我强迫用户点击允许。
  • 这实际上给了我确切的家庭住址。正是我想要的。如何像城市和州或邮政编码一样提取?
【解决方案3】:

这是一个使用 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' 中返回地址对象或在 'catch' 中返回错误状态码

【讨论】:

  • 如果没有访问密钥,这将无法工作。传感器参数也过时了
【解决方案4】:

以下代码可以很好地获取城市名称(使用 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;
            }
        }
    );
}

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      在 node.js 中,我们可以使用 node-geocoder npm module 从 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);
      });
      

      输出:

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

      【讨论】:

      • 感谢您提供非常清晰和有效的反馈,“node-geocoder”和“@google/maps”的选择有什么区别吗?尽管它们似乎做同样的事情
      • 两个输出是一样的,但是 node-geocoder 是获取地址的简化模块,@google/maps 是获取地址的 api,我们需要配置。
      【解决方案7】:

      这是 Google 地理编码网络服务的最新示例

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

      只需将YOUR_API_KEY 更改为您从Google Geocoding API 获得的API 密钥

      P/S:Geocoding API 位于 Places 而不是 Maps ;)

      【讨论】:

        【解决方案8】:

        您可以使用纯 php 和 google geocode 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;
            }
        }
        

        【讨论】:

        • 不是 javascript 解决方案
        【解决方案9】:

        有很多可用的工具

        1. google maps API 就像所有人都写的一样
        2. 使用此数据 "https://simplemaps.com/data/world-cities" 下载免费版本并使用“http://beautifytools.com/excel-to-json-converter.php”等在线转换器将 excel 转换为 JSON
        3. 使用IP地址 这不好,因为使用某人的 IP 地址可能不好 用户认为你可以破解他们。

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

        【讨论】:

          【解决方案10】:

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

          他们有API for client - free。还有for backend,使用API​​_KEY(根据配额免费)。

          Their GitHub page.

          代码如下:

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

          【讨论】:

            【解决方案11】:

            如果您不想使用谷歌地理编码 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),
                    );
                  });
              };

            【讨论】:

            • OP 要求使用 Google Maps API 解决问题,我认为您没有回答问题。
            • 抱歉,我只是建议了另一种方法。如果他有谷歌地理编码 api 密钥,它确实可以正常工作。
            猜你喜欢
            • 1970-01-01
            • 2013-12-09
            • 1970-01-01
            • 2013-03-03
            • 2020-11-04
            • 1970-01-01
            • 1970-01-01
            • 2012-01-12
            相关资源
            最近更新 更多