Geocoding Alamat untuk Digunakan dalam KML

Mano Marks, Tim Geo Google
Ditulis: Desember 2007
Diperbarui: Desember 2013

Tujuan

Tutorial ini ditujukan bagi developer yang sudah memahami bahasa scripting dan ingin mempelajari cara menggunakan Google Geocoding API untuk melakukan geocode alamat dan memasukkannya ke dalam file KML. Meskipun contoh kode disajikan dalam Python, contoh kode tersebut dapat diadaptasi dengan cukup mudah ke sebagian besar bahasa pemrograman lainnya.

Geocoding adalah proses konversi alamat menjadi serangkaian koordinat lintang/bujur, sehingga memungkinkan untuk menunjukkan alamat di peta. Anda mungkin ingin melakukan geokode pada alamat dan memasukkannya langsung ke dalam file KML. Hal ini umum terjadi, misalnya, saat data dimasukkan ke dalam formulir dan Anda membuat file KML sebagai respons terhadap permintaan. File KML ini dapat disimpan dalam database, dalam sistem file, atau ditampilkan ke NetworkLink yang terhubung ke file Anda. Perhatikan bahwa saat menggunakan teknik ini, Anda harus mematuhi Persyaratan Layanan untuk Geocoding API karena ada beberapa batasan terkait waktu penyimpanan hasil, serta jumlah elemen yang dapat Anda geocode setiap hari.

Tutorial ini menunjukkan cara menggunakan Python untuk mengambil string "1600 Amphitheatre Pkwy, Mountain View, CA 94043" dan mengubahnya menjadi:

<?xml version='1.0' encoding='UTF-8'?> 
<kml xmlns='http://earth.google.com/kml/2.2'>
<Document>
<Placemark>
<description>1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA</description>
<Point>
<coordinates>-122.081783,37.423111,0</coordinates>
</Point>
</Placemark>
</Document>
</kml>

Membuat Dokumen KML

KML adalah bahasa markup XML, jadi kita dapat menggunakan fungsi xml.dom.minidom bawaan Python untuk membuat dokumen KML. Minidom Python adalah implementasi DOM, dan DOM didukung di sebagian besar bahasa pemrograman, sehingga proses ini akan mudah di-port ke bahasa pemrograman lain. Berikut langkah-langkahnya:

  1. Buat dokumen menggunakan xml.dom.minidom.Document() Python.
  2. Buat elemen <kml> root menggunakan createElementNS.
  3. Tambahkan ke dokumen menggunakan appendChild.
  4. Buat elemen Dokumen menggunakan createElement.
  5. Tambahkan ke elemen <kml> menggunakan appendChild.
  6. Untuk setiap alamat, buat elemen <Placemark> menggunakan createElement, lalu tambahkan ke elemen Document. Kemudian, buat elemen <description>, tetapkan nilai alamat ke elemen tersebut, dan tambahkan ke elemen <Placemark>.
  7. Buat elemen <Point>, tambahkan elemen turunan <coordinates>, dan tambahkan ke elemen <Placemark>.
  8. Kirim alamat ke Geocoder Maps API, yang mengirimkan respons dalam format JSON atau XML. Gunakan urllib.urlopen() untuk mengambil file dan membacanya ke dalam string.
  9. Parse respons dan ekstrak elemen bujur dan lintang.
  10. Buat node teks di elemen <coordinates> dan tetapkan string bujur/lintang sebagai nilainya.
  11. Tulis dokumen KML ke file teks.

Contoh Kode Python

Perhatikan bahwa kode contoh di bawah menggunakan variabel mapsKey tiruan—Anda harus mengganti kunci ini dengan kunci Anda sendiri.

Contoh kode untuk geocoding dengan Python 2.7 dan output JSON ditampilkan di bawah:

import urllib
import xml.dom.minidom
import json 

def geocode(address, sensor=False):
 # This function queries the Google Maps API geocoder with an
 # address. It gets back a csv file, which it then parses and
 # returns a string with the longitude and latitude of the address.

 # This isn't an actual maps key, you'll have to get one yourself.
 # Sign up for one here: https://code.google.com/apis/console/
  mapsKey = 'abcdefgh'
  mapsUrl = 'https://maps.googleapis.com/maps/api/geocode/json?address='
     
 # This joins the parts of the URL together into one string.
  url = ''.join([mapsUrl,urllib.quote(address),'&sensor=',str(sensor).lower()])
#'&key=',mapsKey])
  jsonOutput = str(urllib.urlopen(url).read ()) # get the response 
  # fix the output so that the json.loads function will handle it correctly
  jsonOutput=jsonOutput.replace ("\\n", "")
  result = json.loads(jsonOutput) # converts jsonOutput into a dictionary 
  # check status is ok i.e. we have results (don't want to get exceptions)
  if result['status'] != "OK": 
    return ""
  coordinates=result['results'][0]['geometry']['location'] # extract the geometry 
  return str(coordinates['lat'])+','+str(coordinates['lng'])

def createKML(address, fileName):
 # This function creates an XML document and adds the necessary
 # KML elements.

  kmlDoc = xml.dom.minidom.Document()
  
  kmlElement = kmlDoc.createElementNS('http://earth.google.com/kml/2.2','kml')

  kmlElement = kmlDoc.appendChild(kmlElement)

  documentElement = kmlDoc.createElement('Document')
  documentElement = kmlElement.appendChild(documentElement)

  placemarkElement = kmlDoc.createElement('Placemark')
  
  descriptionElement = kmlDoc.createElement('description')
  descriptionText = kmlDoc.createTextNode(address)
  descriptionElement.appendChild(descriptionText)
  placemarkElement.appendChild(descriptionElement)
  pointElement = kmlDoc.createElement('Point')
  placemarkElement.appendChild(pointElement)
  coorElement = kmlDoc.createElement('coordinates')

  # This geocodes the address and adds it to a  element.
  coordinates = geocode(address)
  coorElement.appendChild(kmlDoc.createTextNode(coordinates))
  pointElement.appendChild(coorElement)

  documentElement.appendChild(placemarkElement)

  # This writes the KML Document to a file.
  kmlFile = open(fileName, 'w')
  kmlFile.write(kmlDoc.toprettyxml(' '))  
  kmlFile.close()

if __name__ == '__main__':
  createKML('1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA', 'google.kml')

Hal Lain yang Perlu Dipertimbangkan

Menentukan Waktu Permintaan Geocode

Permintaan geocoding akan tunduk pada batas harian kecepatan kueri maksimum geocoder. Lihat dokumentasi Google Geocoding API untuk mengetahui informasi selengkapnya tentang batas ini. Untuk memastikan Anda tidak mengirim kueri terlalu cepat ke geocoder, Anda dapat menentukan penundaan di antara setiap permintaan geocode. Anda dapat meningkatkan penundaan ini setiap kali menerima status OVER_QUERY_LIMIT, dan menggunakan loop while untuk memastikan Anda berhasil melakukan geokode alamat sebelum melakukan iterasi ke alamat berikutnya.

Mengubah Negara Dasar

Geocoder diprogram untuk memihak hasilnya, bergantung pada domain asal. Misalnya, memasukkan "syracuse" di kotak penelusuran di maps.google.com akan melakukan geocode kota "Syracuse, NY", sementara memasukkan kueri yang sama di maps.google.it (domain Italia) akan menemukan kota "Siracusa" di Sisilia. Anda akan mendapatkan hasil yang sama dengan mengirim kueri tersebut melalui geocoding HTTP ke maps.google.it, bukan maps.google.com, yang dapat Anda lakukan dengan mengubah variabel mapsUrl dalam contoh kode di atas. Lihat dokumentasi Geocoding API untuk mengetahui informasi selengkapnya tentang Region Biasing.

Catatan: Anda tidak dapat mengirim permintaan ke server maps.google.* yang tidak ada, jadi pastikan domain negara ada sebelum mengalihkan kueri geocoding Anda ke server tersebut. Untuk mengetahui dukungan geocode menurut negara, lihat postingan ini.

Kesimpulan

Dengan menggunakan kode di atas, Anda kini dapat melakukan geokode alamat menggunakan Python, membuat KML <Placemark> darinya, dan menyimpannya ke disk. Jika Anda merasa perlu melakukan geocoding lebih banyak alamat per hari daripada yang diizinkan oleh batas, atau geocoder Google tidak mencakup wilayah yang Anda minati, pertimbangkan untuk menggunakan layanan web geocoding tambahan.

Setelah Anda mengetahui cara melakukan geokode pada alamat, lihat artikel tentang Menggunakan KML di Google Mashup Editor dan Menggunakan PHP dan MySQL untuk membuat KML. Jika ada masalah atau pertanyaan tentang tutorial ini, posting di forum Stack Overflow.