首页 文章

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

提问于
浏览
70

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

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

7 回答

  • 2

    这被称为 Reverse Geocoding

    • Documentation from Google:

    http://code.google.com/apis/maps/documentation/geocoding/#ReverseGeocoding .

    • Sample Call to Google's geocode Web Service:

    http://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=true

  • 100

    Here is a complete sample:

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

    这是一个使用承诺的现代解决方案:

    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'中的错误状态代码

  • 25

    这是 Google's geocode Web Service 的最新样本

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

  • 1

    以下代码正常工作以获取城市名称(使用 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>
    

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

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

    output:

    node 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' } ]
    
  • 0

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

相关问题