2011-07-01 117 views

回答

90

这就是所谓的反向地理编码从谷歌

+0

太棒了!我对此进行了阅读,现在又有太多的疑问;)谢谢。 –

+0

如果您使用JavaScript API,则每个IP地址和每个用户都是相同的,但如果您使用的是PHP,并且您认为达到了这些限制,则需要将请求限制为每秒1次,或者使用代理服务器,但要小心代理,谷歌不愚蠢,你不能锤击它们。更多信息请访问:https://developers.google.com/maps/documentation/business/articles/usage_limits –

+0

@Azer http://www.microsoft.com/maps/choose-your-bing-maps-API.aspx – smartcaveman

21

下面是一个完整的示例:

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

没有用户认可,有什么方法可以从纬度和经度中找出用户位置? –

+4

@VikasVerma如果你被允许在未经他们同意的情况下找到用户位置,那么这将是一个严重的隐私违规 – omerio

+0

@omerio谢谢,但我在那里做了代码,我强迫用户点击允许,如果他/她想继续。 –

4

下面是使用一个承诺一个现代化的解决方案:

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

的承诺返回地址对象“那么”或“抓”

1

错误状态码下面的代码工作正常,获取城市名称(使用谷歌地图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; 
      } 
     } 
    ); 
} 
0

同@Sanchit古普塔。

这部分

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

在node.js中,我们可以使用节点地理编码 NPM模块从纬度,经度获取地址,

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

输出:

节点地理位置。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

感谢你提供的非常清晰的工作反馈,在节点地理编码器和@谷歌/地图之间会有什么区别吗?他们似乎也做了同样的事情,尽管 – Ade

+1

都输出是相同的,但节点地理编码器是简化的模块来获取地址和@谷歌/地图是API来获取我们需要配置的地址。 –

相关问题