Dengan adanya koordinat lat / panjang, bagaimana kita bisa mengetahui kota / negara?

141

Sebagai contoh jika kita memiliki set koordinat ini

"latitude": 48.858844300000001,
"longitude": 2.2943506,

Bagaimana kita bisa mengetahui kota / negara?

ming kamu
sumber
2
Anda mungkin membutuhkan semacam database. Saya akan mencoba bermain dengan Google Maps API sendiri ... mendukung lat / long.
beatgammit
1
Lihat juga Dapatkan negara dari garis bujur lintang
hippietrail

Jawaban:

96

Google Geocoding API gratis menyediakan layanan ini melalui HTTP REST API. Perhatikan, API adalah penggunaan dan tarif terbatas , tetapi Anda dapat membayar untuk akses tanpa batas.

Coba tautan ini untuk melihat contoh output (ini dalam json, output juga tersedia dalam XML)

https://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=true

Kevin
sumber
menerima ini karena inilah yang akhirnya saya tuju :) Jawaban Michael tentu saja merupakan pilihan hebat!
ming yeow
5
Reverse geocoding Google hanya diperbolehkan bersamaan dengan Google Map. Jika Anda menginginkan solusi yang tidak memiliki batasan seperti itu (meskipun bersifat komersial dan hanya memiliki kota-kota AS), periksa: askgeo.com
James D
mapquest api adalah pilihan lain di sini karena tidak memiliki batas laju dalam beberapa kasus dan batas laju sangat tinggi untuk berbagai kebutuhan geocoding.
Tom
2
gratis dapat diperdebatkan, hanya gratis di bawah batas tertentu.
Petah
@JamesD: Kebijakan API menyatakan bahwa jika Anda menampilkan data pada peta, maka itu harus berupa Google Map, tetapi Anda tidak harus menampilkannya di peta (atau sama sekali).
user276648
173

Pilihan lain:

  • Unduh basis data kota dari http://download.geonames.org/export/dump/
  • Tambahkan setiap kota sebagai lat / panjang -> Pemetaan kota ke indeks spasial seperti R-Tree (beberapa DB juga memiliki fungsi)
  • Gunakan pencarian tetangga terdekat untuk menemukan kota terdekat untuk titik tertentu

Keuntungan:

  • Tidak tergantung pada server eksternal yang tersedia
  • Sangat cepat (dengan mudah melakukan ribuan pencarian per detik)

Kekurangan:

  • Tidak otomatis diperbarui
  • Membutuhkan kode tambahan jika Anda ingin membedakan kasus di mana kota terdekat berjarak puluhan mil
  • Mungkin memberikan hasil aneh di dekat kutub dan garis tanggal internasional (meskipun tidak ada kota di tempat itu pula
Michael Borgwardt
sumber
5
Juga akan memberikan hasil aneh untuk kota-kota di dalam kota, misalnya lokasi tertentu di Roma dapat mengembalikan "Kota Vatikan" - tergantung pada lat / lon yang ditentukan dalam database untuk masing-masing.
Noel Abrahams
1
Mereka juga memiliki api ISTIRAHAT dan terlihat cukup baik: api.geonames.org/...
jeudyx
8
Contoh akan sangat berharga
Hack-R
GeoNames juga menawarkan layanan web gratis yang luar biasa!
mcont
Pada tahun 2020, GeoNames.org terlihat sangat tidak aktif, apakah ada yang tahu apakah itu terbaru? Masalahnya adalah di mana mereka menyebutkan tanggal pembaruan terakhir di situs.
joedotnot
45

Kamu butuh geopy

pip install geopy

lalu:

from geopy.geocoders import Nominatim
geolocator = Nominatim()
location = geolocator.reverse("48.8588443, 2.2943506")

print(location.address)

untuk mendapatkan informasi lebih lanjut:

print (location.raw)

{'place_id': '24066644', 'osm_id': '2387784956', 'lat': '41.442115', 'lon': '-8.2939909', 'boundingbox': ['41.442015', '41.442215', '-8.2940909', '-8.2938909'], 'address': {'country': 'Portugal', 'suburb': 'Oliveira do Castelo', 'house_number': '99', 'city_district': 'Oliveira do Castelo', 'country_code': 'pt', 'city': 'Oliveira, São Paio e São Sebastião', 'state': 'Norte', 'state_district': 'Ave', 'pedestrian': 'Rua Doutor Avelino Germano', 'postcode': '4800-443', 'county': 'Guimarães'}, 'osm_type': 'node', 'display_name': '99, Rua Doutor Avelino Germano, Oliveira do Castelo, Oliveira, São Paio e São Sebastião, Guimarães, Braga, Ave, Norte, 4800-443, Portugal', 'licence': 'Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright'}
Farsheed
sumber
2
Apakah ada batasan untuk ini? Ini tampaknya merupakan pendekatan tercepat. Mungkinkah ada alasan untuk tidak menggunakan ini pada pendekatan @ Michael?
Satys
1
baik itu membutuhkan layanan eksternal
maxbachmann
Ini pendekatan yang bagus, namun saya hanya perlu kabupaten, jadi saya perlu memperbaiki alamatnya. Saya berharap ada cara yang mengembalikan kabupaten.
Fatemeh Asgarinejad
22

Alternatif Open Source adalah Nominatim dari Open Street Map. Yang harus Anda lakukan adalah mengatur variabel dalam URL dan mengembalikan kota / negara lokasi itu. Silakan periksa tautan berikut untuk dokumentasi resmi: Nominatim

Rega
sumber
3
Perhatikan bahwa operasi kebijakan penggunaan Nominatim.osmfoundation.org/policies/nominatim menyatakan tingkat maksimum satu permintaan per detik sehingga hanya cocok untuk permintaan ad-hoc.
Matthew Wise
22

Saya sedang mencari fungsi yang sama dan saya melihat data " http://download.geonames.org/export/dump/ " dibagikan pada balasan sebelumnya (terima kasih telah berbagi, ini adalah sumber yang sangat baik), dan menerapkan layanan berbasis pada data cities1000.txt.

Anda dapat melihatnya berjalan di http://scatter-otl.rhcloud.com/location?lat=36&long=-78.9 (tautan rusak) Ubah saja garis lintang dan bujur untuk lokasi Anda.

Ini digunakan pada OpenShift (Platform RedHat). Panggilan pertama setelah periode idle yang lama mungkin memakan waktu, tetapi biasanya kinerja memuaskan. Jangan ragu untuk menggunakan layanan ini sesuka Anda ...

Anda juga dapat menemukan sumber proyek di https://github.com/turgos/Location .

turgo
sumber
Itu tidak bekerja dengan baik. Jika tidak bisa mendapatkan kota itu mencari kota terdekat yang dikenal. Berikut ini sebuah contoh: scatter-otl.rhcloud.com/... Dikatakan "Basseterre" bukannya "Saint John" ...
smartmouse
1
Itu benar. algoritma mencari kota terdekat yang tersedia dalam dataset. Untuk server yang digunakan di atas, saya menggunakan "cities1000.txt". Hanya memiliki kota-kota besar. Kode sumber tersedia di github.com/turgos/Location . Anda dapat memulai sendiri dengan data yang lebih detail dari " download.geonames.org/export/dump ".
turgos
Kelihatannya cities1000.txt adalah data yang lebih terperinci yang tersedia. Apakah saya benar?
smartmouse
8

Saya telah menggunakan Geocoder , pustaka Python bagus yang mendukung banyak penyedia, termasuk Google, Geonames, dan OpenStreetMaps, untuk menyebutkan beberapa saja . Saya sudah mencoba menggunakan perpustakaan GeoPy, dan sering mengalami timeout. Mengembangkan kode Anda sendiri untuk GeoNames bukanlah penggunaan waktu Anda yang terbaik dan Anda mungkin mendapatkan kode yang tidak stabil. Geocoder sangat mudah digunakan dalam pengalaman saya, dan memiliki dokumentasi yang cukup baik . Di bawah ini adalah beberapa contoh kode untuk mencari kota dengan lintang dan bujur, atau menemukan lintang / bujur dengan nama kota.

import geocoder

g = geocoder.osm([53.5343609, -113.5065084], method='reverse')
print g.json['city'] # Prints Edmonton

g = geocoder.osm('Edmonton, Canada')
print g.json['lat'], g.json['lng'] # Prints 53.5343609, -113.5065084
Hamman Samuel
sumber
Terima kasih telah berbagi ini tetapi tidak berfungsi untuk semua koordinat. Apakah jumlah digit koordinat harus dalam ukuran tertentu?
Fatemeh Asgarinejad
1
Saya percaya saya memilih garis bujur dan lintang dengan benar. Saya memiliki ribuan koordinat dari mana koordinat acak tidak berfungsi. Sekarang baik-baik saja. Saya menggunakan pendekatan lain. Terimakasih atas tanggapan Anda.
Fatemeh Asgarinejad
1
Selamat datang. Penasaran ingin tahu pendekatan apa yang cocok untuk Anda? Jika lebih baik daripada geocoder, saya juga ingin mencobanya sendiri!
Hamman Samuel
1
Saya menggunakan ini: dari impor geopy.geocoder Nominatim geolocator = Nominatim () location = geolocator.reverse ("41.4721, -72.6311") print (location.address) Ini memberikan seluruh alamat dan kemudian saya menyaring county dari itu.
Fatemeh Asgarinejad
1
Terima kasih, saya bekerja dengan dataset besar dan pada 2017, menggunakan GeoPy membuat saya banyak timeout. Mungkin 3 tahun kemudian mereka telah melonggarkan batasan mereka, jadi itu bagus untuk diketahui!
Hamman Samuel
5

Saya menghabiskan sekitar 30 menit untuk mencoba menemukan contoh kode tentang bagaimana melakukan ini dalam Javascript. Saya tidak dapat menemukan jawaban yang jelas dan cepat untuk pertanyaan yang Anda posting. Jadi ... saya buat sendiri. Mudah-mudahan orang dapat menggunakan ini tanpa harus menggali ke dalam API atau menatap kode yang mereka tidak tahu cara membaca. Ha kalau tidak ada yang lain saya bisa mereferensikan posting ini untuk barang-barang saya sendiri .. Pertanyaan yang bagus dan terima kasih untuk forum diskusi!

Ini memanfaatkan Google API.

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?key=<YOURGOOGLEKEY>&sensor=false&v=3&libraries=geometry"></script>

.

//CHECK IF BROWSER HAS HTML5 GEO LOCATION
if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function (position) {

        //GET USER CURRENT LOCATION
        var locCurrent = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);

        //CHECK IF THE USERS GEOLOCATION IS IN AUSTRALIA
        var geocoder = new google.maps.Geocoder();
            geocoder.geocode({ 'latLng': locCurrent }, function (results, status) {
                var locItemCount = results.length;
                var locCountryNameCount = locItemCount - 1;
                var locCountryName = results[locCountryNameCount].formatted_address;

                if (locCountryName == "Australia") {
                    //SET COOKIE FOR GIVING
                    jQuery.cookie('locCountry', locCountryName, { expires: 30, path: '/' }); 
                }
        });
    }
}
Kai Husen
sumber
5

Saya tahu pertanyaan ini benar-benar sudah tua, tetapi saya telah mengerjakan masalah yang sama dan saya menemukan paket yang sangat efisien dan nyaman reverse_geocoder, yang dibangun oleh Ajay Thampi. Kode tersedia di sini . Itu didasarkan pada implementasi paralel dari pohon-pohon KD yang sangat efisien untuk sejumlah besar poin (saya butuh beberapa detik untuk mendapatkan 100.000 poin.

Itu didasarkan pada database ini , sudah disorot oleh @turgos.

Jika tugas Anda adalah menemukan negara dan kota dari daftar koordinat dengan cepat, ini adalah alat yang hebat.

Giorgio Balestrieri
sumber
3

Ini benar-benar tergantung pada batasan teknologi apa yang Anda miliki.

Salah satu caranya adalah memiliki basis data spasial dengan garis besar negara dan kota yang Anda minati. Secara garis besar maksud saya bahwa negara dan kota disimpan sebagai poligon jenis spasial. Set koordinat Anda dapat dikonversi ke titik jenis spasial dan ditanyai dengan poligon untuk mendapatkan nama negara / kota tempat titik tersebut berada.

Berikut adalah beberapa database yang mendukung tipe spasial: SQL server 2008 , MySQL , postGIS - ekstensi postgreSQL dan Oracle .

Jika Anda ingin menggunakan layanan sebagai pengganti memiliki database Anda sendiri untuk ini, Anda dapat menggunakan GeoPlanet Yahoo . Untuk pendekatan layanan, Anda mungkin ingin memeriksa jawaban ini di gis.stackexchange.com , yang mencakup ketersediaan layanan untuk menyelesaikan masalah Anda.

steenhulthin
sumber
1

Anda dapat menggunakan Google Geocoding API

Di bawah adalah fungsi php yang mengembalikan Alamat, Kota, Negara dan Negara

public function get_location($latitude='', $longitude='')
{
    $geolocation = $latitude.','.$longitude;
    $request = 'http://maps.googleapis.com/maps/api/geocode/json?latlng='.$geolocation.'&sensor=false'; 
    $file_contents = file_get_contents($request);
    $json_decode = json_decode($file_contents);
    if(isset($json_decode->results[0])) {
        $response = array();
        foreach($json_decode->results[0]->address_components as $addressComponet) {
            if(in_array('political', $addressComponet->types)) {
                    $response[] = $addressComponet->long_name; 
            }
        }

        if(isset($response[0])){ $first  =  $response[0];  } else { $first  = 'null'; }
        if(isset($response[1])){ $second =  $response[1];  } else { $second = 'null'; } 
        if(isset($response[2])){ $third  =  $response[2];  } else { $third  = 'null'; }
        if(isset($response[3])){ $fourth =  $response[3];  } else { $fourth = 'null'; }
        if(isset($response[4])){ $fifth  =  $response[4];  } else { $fifth  = 'null'; }


        $loc['address']=''; $loc['city']=''; $loc['state']=''; $loc['country']='';
        if( $first != 'null' && $second != 'null' && $third != 'null' && $fourth != 'null' && $fifth != 'null' ) {
            $loc['address'] = $first;
            $loc['city'] = $second;
            $loc['state'] = $fourth;
            $loc['country'] = $fifth;
        }
        else if ( $first != 'null' && $second != 'null' && $third != 'null' && $fourth != 'null' && $fifth == 'null'  ) {
            $loc['address'] = $first;
            $loc['city'] = $second;
            $loc['state'] = $third;
            $loc['country'] = $fourth;
        }
        else if ( $first != 'null' && $second != 'null' && $third != 'null' && $fourth == 'null' && $fifth == 'null' ) {
            $loc['city'] = $first;
            $loc['state'] = $second;
            $loc['country'] = $third;
        }
        else if ( $first != 'null' && $second != 'null' && $third == 'null' && $fourth == 'null' && $fifth == 'null'  ) {
            $loc['state'] = $first;
            $loc['country'] = $second;
        }
        else if ( $first != 'null' && $second == 'null' && $third == 'null' && $fourth == 'null' && $fifth == 'null'  ) {
            $loc['country'] = $first;
        }
      }
      return $loc;
}
Nishad Up
sumber
jika saya hanya menginginkan administrative_area_level_ 3 atau lokalitas (jika administrative_area_level_ 3 tidak tersedia), mana yang harus saya modifikasi? baru untuk php ..
Agustus
1

Loc2country adalah alat berbasis Golang yang mengembalikan kode negara ISO alpha-3 untuk koordinat lokasi tertentu (lat / lon). Merespon dalam mikrodetik. Ini menggunakan geohash ke peta negara.

Data geohash dihasilkan menggunakan georaptor .

Kami menggunakan geohash pada level 6 untuk alat ini, yaitu, kotak ukuran 1,2km x 600m.

Ashwin Nair
sumber
0

Silakan periksa jawaban di bawah ini. Ini bekerja untuk saya

if(navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function(position){

        initialize(position.coords.latitude,position.coords.longitude);
    }); 
}

function initialize(lat,lng) {
    //directionsDisplay = new google.maps.DirectionsRenderer(rendererOptions);
    //directionsService = new google.maps.DirectionsService();
    var latlng = new google.maps.LatLng(lat, lng);

    //alert(latlng);
    getLocation(latlng);
}

function getLocation(latlng){

    var geocoder = new google.maps.Geocoder();
    geocoder.geocode({'latLng': latlng}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                if (results[0]) {
                    var loc = getCountry(results);
                    alert("location is::"+loc);
                }
            }
        });

}

function getCountry(results)
{
    for (var i = 0; i < results[0].address_components.length; i++)
    {
        var shortname = results[0].address_components[i].short_name;
        var longname = results[0].address_components[i].long_name;
        var type = results[0].address_components[i].types;
        if (type.indexOf("country") != -1)
        {
            if (!isNullOrWhitespace(shortname))
            {
                return shortname;
            }
            else
            {
                return longname;
            }
        }
    }

}

function isNullOrWhitespace(text) {
    if (text == null) {
        return true;
    }
    return text.replace(/\s/gi, '').length < 1;
}
Sumain Jain
sumber
0

Jika Anda menggunakan Google Places API, ini adalah bagaimana Anda bisa mendapatkan negara dan kota dari objek tempat menggunakan Javascript:

function getCityAndCountry(location) {
  var components = {};
  for(var i = 0; i < location.address_components.length; i++) {
    components[location.address_components[i].types[0]] = location.address_components[i].long_name;
  }

  if(!components['country']) {
    console.warn('Couldn\'t extract country');
    return false;
  }

  if(components['locality']) {
    return [components['locality'], components['country']];
  } else if(components['administrative_area_level_1']) {
    return [components['administrative_area_level_1'], components['country']];
  } else {
    console.warn('Couldn\'t extract city');
    return false;
  }
}
vedo27
sumber