Bagaimana cara mendapatkan nama kota dari titik lintang dan bujur?

92

Adakah cara untuk mendapatkan nama kota dari titik lintang dan bujur dengan menggunakan api google maps untuk javascript?

Jika demikian, bisakah saya melihat contoh?

Dennis Martinez
sumber
Anda perlu mencari layanan web yang menawarkan ini.
Devil dan

Jawaban:

118

Ini disebut Geocoding Terbalik

orang pintar
sumber
Hebat! Saya membaca tentang ini, dan sekarang terlalu banyak pertanyaan datang;) terima kasih.
Dennis Martinez
Per alamat IP dan per pengguna tunggal sama jika Anda menggunakan API javascript tetapi jika Anda menggunakan PHP misalnya dan menurut Anda akan mencapai batas ini, Anda harus membatasi permintaan menjadi 1 per detik atau menggunakan server proxy tetapi berhati-hatilah dengan proxy, google tidak bodoh dan Anda tidak dapat memaluinya. Info lebih lanjut di sini: developers.google.com/maps/documentation/business/articles/…
Andy Gee
26

Berikut contoh lengkapnya:

<!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>
Benny Neugebauer
sumber
Adakah cara untuk mengetahui lokasi pengguna dari lintang dan bujur tanpa persetujuan pengguna?
Vikas Verma
8
@VikasVerma itu akan menjadi pelanggaran privasi yang serius jika Anda diizinkan untuk menemukan lokasi pengguna tanpa persetujuan mereka
omerio
@omerio terima kasih tetapi saya membuat kode di sana saya memaksa pengguna untuk mengklik izinkan jika dia ingin melanjutkan.
Vikas Verma
1
Ini benar-benar memberi saya alamat rumah saya yang sebenarnya. Persis seperti yang saya inginkan. Bagaimana cara mengekstrak seperti kota dan negara bagian atau kode pos?
ydobonebi
6

Di node.js kita dapat menggunakan modul node-geocoder npm untuk mendapatkan alamat dari 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);
});

keluaran:

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' } ]
KARTHIKEYAN.A
sumber
Terima kasih atas umpan balik yang sangat jelas dan berfungsi, apakah akan ada perbedaan antara pilihan 'node-geocoder' dan '@ google / maps'?, Mereka tampaknya melakukan hal yang sama
Ade
1
kedua keluarannya sama tetapi node-geocoder adalah modul yang disederhanakan untuk mendapatkan alamat dan @ google / maps adalah api untuk mendapatkan alamat yang perlu kita konfigurasikan.
KARTHIKEYAN.A
4

Berikut solusi modern menggunakan janji:

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

Dan sebut saja seperti ini:

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

Promise mengembalikan objek alamat di 'then' atau kode status kesalahan di 'catch'

Steven Spungin
sumber
3
Ini tidak akan berfungsi tanpa kunci akses. Parameter sensor juga sudah usang
Joro Tenev
Ini sebenarnya tidak berfungsi
ProgrammingHobby
3

Kode Berikut Berfungsi dengan Baik untuk Mendapatkan Nama Kota (Menggunakan 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>

NASKAH

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;
            }
        }
    );
}
Sanchit Gupta
sumber
0

Sama seperti @Sanchit Gupta.

di bagian ini

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

hanya menghibur larik hasil

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;
}
Fahad Hossain
sumber
0

Ada banyak alat yang tersedia

  1. Google maps API seperti yang telah ditulis semua orang
  2. gunakan data ini " https://simplemaps.com/data/world-cities " unduh versi gratis dan konversikan excel ke JSON dengan beberapa konverter online seperti " http://beautifytools.com/excel-to-json-converter.php "
  3. menggunakan alamat IP yang tidak baik karena menggunakan alamat IP seseorang mungkin tidak akan membuat pengguna berpikir bahwa Anda dapat meretasnya.

alat gratis dan berbayar lainnya juga tersedia

pengguna12449933
sumber
-1

BigDataCloud juga memiliki API yang bagus untuk ini, juga untuk pengguna nodejs.

mereka memiliki API untuk klien - gratis . Tapi juga untuk backend , menggunakan API_KEY (gratis sesuai kuota).

Halaman GitHub mereka .

kodenya terlihat seperti:

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

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

Jika Anda tidak ingin menggunakan Google geocoding API daripada Anda dapat merujuk ke beberapa API Gratis lainnya untuk tujuan pengembangan. misalnya saya menggunakan [mapquest] API untuk mendapatkan nama lokasi.

Anda dapat mengambil nama lokasi dengan mudah dengan menerapkan fungsi berikut ini

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

pankaj chaturvedi
sumber
OP meminta solusi dengan Google Maps API, saya pikir Anda tidak menjawab pertanyaan itu.
Michał Tkaczyk
Maaf, tetapi saya hanya menyarankan cara alternatif untuk melakukannya. dan itu berfungsi dengan baik jika dia memiliki kunci api google geo coding.
pankaj chaturvedi
-3

Anda dapat melakukannya dengan php murni dan api geocode 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;
    }
}
Hendi Ahmed
sumber
1
Bukan solusi javascript
Chintan Pathak