PYTHON

Pendahuluan

Geocoding adalah proses mengubah deskripsi lokasi (seperti alamat fisik, atau nama tempat) menjadi sepasang lintang dan bujur di permukaan bumi untuk tempat itu. Ini juga mengacu pada konversi koordinat geografis ke deskripsi lokasi (seperti alamat), ini sering disebut geocoding terbalik. Dalam tutorial ini, kita akan belajar bagaimana melakukan keduanya dengan bantuan library GeoPy dengan Python. GeoPy adalah klien Python yang menyediakan beberapa layanan web geocoding populer, memudahkan pengembang Python untuk menemukan koordinat alamat, kota, atau negara dan sebaliknya.

Untuk memulai, mari kita instal:

pip3 install geopy

GeoPy menyediakan banyak pembungkus layanan geocoding, seperti OpenStreetMap Nominatim , Google Geocoding API V3 , Bing Maps dan banyak lagi. Dalam tutorial ini, kita akan tetap menggunakan OpenStreetMap Nominatim.

Inilah yang akan kita bahas:

  • Mendapatkan Lintang Dan Bujur Dari Alamat (Geocoding)
  • Mendapatkan Alamat Dari Lintang Dan Bujur (Geocoding Terbalik)

Mendapatkan Lintang Dan Bujur Dari Alamat (Geocoding)

Di bagian ini, kita akan menggunakan OpenStreetMap Nominatim API untuk mendapatkan garis lintang dan garis bujur dari alamat fisik, kota, atau nama lokasi apa pun. Mari impor perpustakaan terlebih dahulu:

from geopy.geocoders import Nominatim
import time
from pprint import pprint

Perhatikan bahwa kami memilih geocoder Nominatim, sekarang membuat instance baru:

# instasiasi klien Nominatim baru
app = Nominatim(user_agent="tutorial")

Sekarang mari kita coba untuk mendapatkan data geografis dari sebuah alamat:

# dapatkan data mentah lokasi
location = app.geocode("Nairobi, Kenya").raw
# print data mentah
pprint(location)

Keluaran:

{'boundingbox': ['-1.444471', '-1.163332', '36.6509378', '37.1038871'],
 'class': 'place',
 'display_name': 'Nairobi, Kenya',
 'icon': 'https://nominatim.openstreetmap.org/images/mapicons/poi_place_city.p.20.png',
 'importance': 0.845026759433763,
 'lat': '-1.2832533',
 'licence': 'Data © OpenStreetMap contributors, ODbL 1.0. '
            'https://osm.org/copyright',
 'lon': '36.8172449',
 'osm_id': 9185096,
 'osm_type': 'relation',
 'place_id': 273942566,
 'type': 'city'}

Luar biasa, kami memiliki garis lintang di lat atribut (di mana kami dapat mengakses dengan location['lat']) dan garis bujur di lon atribut, kami juga memiliki akses ke kotak pembatas alamat di boundingbox atribut. Seperti yang Anda lihat, API Nominatim tidak memerlukan alamat lengkap (yang terdiri dari jalan, nomor rumah dan kota), Anda juga dapat melewati alamat bisnis dan tempat yang Anda minati, itu mendukung itu! Namun, jika Anda memanggil fungsi ini berulang kali (seperti mengulangi daftar alamat), Anda akan menemukan kesalahan waktu habis, dan itu karena jika Anda membaca Kebijakan Penggunaan Nominatim , Anda harus menggunakan maksimal 1 permintaan per detik , dan itu benar-benar dapat diterima, karena ini adalah layanan gratis.

Akibatnya, fungsi di bawah ini mematuhi persyaratan itu dan tidur selama satu detik sebelum membuat permintaan:

def get_location_by_address(address):
    """Fungsi ini mengembalikan lokasi sebagai mentah dari alamat
    akan berulang sampai sukses"""
    time.sleep(1)
    try:
        return app.geocode(address).raw
    except:
        return get_location_by_address(address)

Jadi, setiap kali kesalahan batas waktu muncul, kami menangkapnya dan memanggil fungsi secara rekursif, dan fungsi ini akan tidur selama satu detik lagi dan mudah-mudahan, mengambil hasilnya:

address = "Makai Road, Masaki, Dar es Salaam, Tanzania"
location = get_location_by_address(address)
latitude = location["lat"]
longitude = location["lon"]
print(f"{latitude}, {longitude}")
# cetak semua data yang dikembalikan
pprint(location)

Keluaran:

-6.7460493, 39.2750804
{'boundingbox': ['-6.7467061', '-6.7454602', '39.2741806', '39.2760514'],
 'class': 'highway',
 'display_name': 'Makai Road, Masaki, Msasani, Dar es-Salaam, Dar es Salaam, '
                 'Coastal Zone, 2585, Tanzania',
 'importance': 0.82,
 'lat': '-6.7460493',
 'licence': 'Data © OpenStreetMap contributors, ODbL 1.0. '
            'https://osm.org/copyright',
 'lon': '39.2750804',
 'osm_id': 23347726,
 'osm_type': 'way',
 'place_id': 89652779,
 'type': 'residential'}

Mendapatkan Alamat Dari Lintang Dan Bujur (Geocoding Terbalik)

Sekarang untuk mengambil alamat, kota dan negara dan berbagai informasi lainnya, hanya dari garis lintang dan garis bujur, kita cukup menggunakan reverse() metode alih-alih geocode() , yang menerima koordinat ( latitude dan longitude) sebagai string yang dipisahkan oleh koma.

Fungsi berikut membalikkan geocode koordinat bersama dengan menghormati kebijakan penggunaan Nominatim:

def get_address_by_location(latitude, longitude, language="en"):
    """Fungsi ini mengembalikan alamat sebagai mentah dari lokasi
    akan berulang sampai sukses"""
    # buat string koordinat untuk diteruskan ke fungsi reverse()
    coordinates = f"{latitude}, {longitude}"
    # tidur sebentar untuk menghormati Kebijakan Penggunaan
    time.sleep(1)
    try:
        return app.reverse(coordinates, language=language).raw
    except:
        return get_address_by_location(latitude, longitude)

Jadi fungsi ini mengharapkan garis lintang dan garis bujur sebagai parameter dan mengembalikan data geografis mentah, berikut adalah contoh penggunaan:

# tentukan koordinat Anda
latitude = 36.723
longitude = 3.188
# dapatkan info alamatnya
address = get_address_by_location(latitude, longitude)
# cetak semua data yang dikembalikan
pprint(address)

Keluaran:

{'address': {'country': 'Algeria',
             'country_code': 'dz',
             'county': 'Dar El Beida District',
             'postcode': '16110',
             'state': 'Algiers',
             'town': 'Bab Ezzouar'},
 'boundingbox': ['36.7231765', '36.7242661', '3.1866439', '3.1903998'],
 'display_name': 'Bab Ezzouar, Dar El Beida District, Algiers, 16110, Algeria',
 'lat': '36.72380363740118',
 'licence': 'Data © OpenStreetMap contributors, ODbL 1.0. '
            'https://osm.org/copyright',
 'lon': '3.188236679492425',
 'osm_id': 42812185,
 'osm_type': 'way',
 'place_id': 98075368}

Jadi ini akan mengembalikan semua data alamat, termasuk negara bagian, kota, kode pos, distrik, dan lainnya. Jika Anda ingin mengembalikan informasi ini dalam bahasa tertentu, Anda dapat mengatur language parameter ke bahasa yang Anda inginkan, atau Anda dapat mengaturnya False untuk bahasa default untuk lokasi tertentu.

Kesimpulan

Seperti biasa, kami hanya melihat contoh sederhana tentang apa yang dapat dilakukan GeoPy, saya sangat menyarankan Anda membaca dokumentasi jika Anda tertarik dengan utilitas yang lebih canggih.

Sumber asli : thepythoncode