Как я могу получить название города по широте и долготе?

92

Есть ли способ получить название города по широте и долготе с помощью API карт Google для javascript?

Если да, могу я посмотреть пример?

Деннис Мартинес
источник
вам нужно будет найти веб-сервис, который предлагает это.
Deviland 01

Ответы:

118

Это называется обратным геокодированием.

умный пещерный человек
источник
Потрясающие! Я читал об этом, а теперь о том, что слишком много вопросов;) спасибо.
Деннис Мартинес
Для каждого IP-адреса и для одного пользователя одно и то же, если вы используете javascript API, но если вы, например, используете PHP и думаете, что достигнете этих ограничений, вам необходимо ограничить количество запросов до 1 в секунду или использовать прокси-серверы, но будьте осторожны с прокси, гугл не глуп, и вы не можете их забить. Дополнительная информация здесь: developers.google.com/maps/documentation/business/articles/…
Энди Джи
26

Вот полный образец:

<!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>
Бенни Нойгебауэр
источник
Есть ли способ узнать местоположение пользователя по широте и долготе без согласия пользователя?
Викас Верма
8
@VikasVerma, это было бы серьезным нарушением конфиденциальности, если бы вам разрешили находить местоположение пользователя без его согласия
omerio
@omerio, спасибо, но я сделал там код, и заставил пользователя нажать кнопку "Разрешить", если он / она хочет продолжить.
Викас Верма
1
Это фактически дало мне мой точный домашний адрес. Именно то, что я хочу. Как мне извлечь точно так же, как город и штат или почтовый индекс?
ydobonebi
6

В node.js мы можем использовать модуль npm node-geocoder, чтобы получить адрес из 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»?, Хотя они, похоже, делают то же самое
Адэ
1
оба вывода одинаковы, но node-geocoder - это упрощенный модуль для получения адреса, а @ google / maps - это api для получения адреса, который нам нужно настроить.
KARTHIKEYAN.A
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);

Обещание возвращает адресный объект в 'then' или код состояния ошибки в 'catch'.

Стивен Спунгин
источник
3
Это не сработает без ключа доступа. Параметр датчика тоже устарел
Йоро Тенев
На самом деле это не работает
ProgrammingHobby
3

Следующий код отлично работает для получения названия города (с использованием API Google Map 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>

СЦЕНАРИЙ

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 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;
}
Фахад Хоссейн
источник
0

Доступно множество инструментов

  1. google maps API как все писали
  2. используйте эти данные « https://simplemaps.com/data/world-cities », загрузите бесплатную версию и конвертируйте excel в JSON с помощью какого-нибудь онлайн-конвертера, такого как « http://beautifytools.com/excel-to-json-converter.php »
  3. использовать IP-адрес, что нехорошо, потому что использование IP-адреса кого-либо может быть плохим для пользователей, которые думают, что вы можете их взломать.

доступны также другие бесплатные и платные инструменты

user12449933
источник
-1

BigDataCloud также имеет хороший API для этого, в том числе для пользователей nodejs.

у них есть API для клиента - бесплатно . Но также и для серверной части с использованием API_KEY (бесплатно по квоте).

Их страница на GitHub .

код выглядит так:

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

async foo() {
    ...
    const location: string = await client.getReverseGeocode({
          latitude:'32.101786566878445', 
          longitude: '34.858965073072056'
    });
}
OhadR
источник
-1

В случае, если вы не хотите использовать API геокодирования Google, вы можете обратиться к нескольким другим бесплатным 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 google geo coding.
панкадж чатурведи
-3

вы можете сделать это с чистым 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;
    }
}
Хенди Ахмед
источник
1
Не решение для javascript
Чинтан Патхак