Làm cách nào để lấy tên thành phố từ một điểm vĩ độ và kinh độ?


Câu trả lời:


118

Đây được gọi là Mã hóa địa lý ngược


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

Mỗi địa chỉ IP và mỗi người dùng đều 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 nghĩ rằng bạn sẽ đạt đến những giới hạn này, bạn sẽ cần giới hạn yêu cầu ở 1 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 ngu ngốc và bạn không thể làm hỏng chúng. Thông tin thêm tại đây: Develop.google.com/maps/documentation/business/articles/…
Andy Gee

26

Đâ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>

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

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

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

1
Điều này thực sự đã cho tôi địa chỉ nhà chính xác của tôi. Chính xác những gì tôi muốn. Làm cách nào để giải nén giống như thành phố và tiểu bang hoặc mã zip?
ydobonebi

6

Trong node.js, chúng ta có thể sử dụng mô-đun npm node- geocoder để lấy đị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' } ]

Cảm ơn vì phản hồi rất rõ ràng và hiệu quả, liệu có sự khác biệt nào giữa lựa chọn 'node-geocoder' và '@ google / maps' không ?, Mặc dù vậy, chúng dường như cũng làm điều tương tự
Ade

1
cả hai đầu ra đều giống nhau nhưng node-geocoder là mô-đun đơn giản hóa để lấy địa chỉ và @ google / maps là api để lấy địa chỉ mà chúng ta cần cấu hình.
KARTHIKEYAN.A


4

Đâ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ó 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 'then' hoặc mã trạng thái lỗi trong 'catch'


3
Điều này sẽ không hoạt động nếu không có khóa truy cập. Các thông số cảm biến là lỗi thời quá
joro Tenev

Nó thực sự không hoạt động
ProgrammingHobby

3

Mã sau hoạt động tốt để lấy tên thành phố (Sử dụng API địa lý của Google Map ):

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>

KỊCH BẢN

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

Giống 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ỉ cần điều khiển mảng kết quả

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

0

Có rất nhiều công cụ có sẵn

  1. API google maps như tất cả đã được viết
  2. sử dụng dữ liệu này " https://simplemaps.com/data/world-cities " tải xuống phiên bản miễn phí và chuyển đổi excel sang JSON bằng một số công cụ chuyển đổi trực tuyến như " http://beautifytools.com/excel-to-json-converter.php "
  3. sử dụng địa chỉ IP không tốt vì sử dụng địa chỉ IP của người không tốt có thể người dùng nghĩ rằng bạn có thể hack họ.

các công cụ miễn phí và trả phí khác cũng có sẵn


-1

BigDataCloud cũng có một API tuyệt vời cho việc này, cũng dành cho người dùng nodejs.

họ có API miễn phí cho khách hàng . Nhưng cũng đối với phụ trợ , sử dụng API_KEY (miễn phí theo hạn ngạch).

Trang GitHub của họ .

mã trông giống như:

const client = require('@bigdatacloudapi/client')(API_KEY);

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

-1

Trong trường hợp nếu bạn không muốn sử dụng API mã hóa địa lý của google hơn, bạn có thể tham khảo một số API miễn phí khác cho mục đích phát triển. ví dụ: tôi đã sử dụng API [mapquest] để lấy tên vị trí.

bạn có thể dễ dàng tìm nạp tên vị trí bằng cách triển khai chức năng sau

 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 đang yêu cầu giải pháp với API Google Maps, tôi nghĩ bạn không trả lời câu hỏi.
Michał Tkaczyk

Xin lỗi nhưng tôi chỉ đề xuất một cách thay thế để làm như vậy. và nó hoạt động tốt nếu anh ta có khóa api mã hóa địa lý của google.
pankaj chaturvedi

-3

bạn có thể làm điều đó với php thuần túy và api mã địa lý google

/*
 *
 * @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;
    }
}

1
Không phải là giải pháp javascript
Chintan Pathak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.