2011-07-01 32 views

Trả lời

90

này được gọi là Xếp Geocoding

+0

Tuyệt vời! Tôi đọc về điều này, và bây giờ là hơn quá nhiều truy vấn;) cảm ơn. –

+0

Mỗi địa chỉ IP và mỗi người dùng duy nhất giống nhau nếu bạn đang sử dụng API javascript nhưng nếu bạn đang sử dụng PHP chẳng hạn và bạn cho rằng bạn sẽ đạt đến các giới hạn này, bạn sẽ cần giới hạn yêu cầu 1 mỗi giây hoặc sử dụng máy chủ proxy nhưng hãy cẩn thận với proxy, google không phải là ngu ngốc và bạn không thể búa chúng. Thông tin thêm tại đây: 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

Đây là một mẫu hoàn chỉnh:

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

Có cách nào để tìm vị trí của người dùng từ vĩ độ và kinh độ mà không có sự chấp thuận của người dùng? –

+4

@VikasVerma sẽ là vi phạm quyền riêng tư nghiêm trọng nếu bạn được phép tìm vị trí của người dùng mà không có sự đồng ý của họ – omerio

+0

@omerio cảm ơn nhưng tôi đã tạo mã ở đó. Tôi buộc người dùng phải nhấp vào cho phép nếu họ muốn tiếp tục. –

4

Dưới đây là một giải pháp hiện đại sử dụng một lời hứa:

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

Và gọi nó là như thế này:

getAddress(lat, lon).then(console.log).catch(console.error); 

Lời hứa trả về đối tượng địa chỉ trong 'rồi' hoặc mã trạng thái lỗi trong 'bắt'

1

Tiếp theo Mã Works Fine để Nhận Tên thành phố (Sử dụng Google Map API Geo):

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

Tương tự như @Sanchit Gupta.

trong phần này

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

chỉ an ủi các kết quả mảng

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

Trong Node.js chúng ta có thể sử dụng nút -geocoder mô-đun NPM để có được địa chỉ từ 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); 
}); 

đầu ra:

nút 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

Cảm ơn bạn đã phản hồi rất rõ ràng và làm việc, sẽ có bất kỳ sự khác biệt nào giữa lựa chọn 'nút địa lý' và '@ google/maps' hay không?, Chúng dường như làm điều tương tự mặc dù – Ade

+1

cả đầu ra giống nhau nhưng nút-geocoder được đơn giản hóa mô-đun để có được địa chỉ và @ google/maps là api để có được địa chỉ mà chúng ta cần phải cấu hình. –

Các vấn đề liên quan