Alamat Geocoding untuk Digunakan di KML

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

Tujuan

Tutorial ini ditujukan bagi developer yang sudah memahami bahasa skrip dan ingin mempelajari cara menggunakan Google Geocoding API untuk melakukan geocoding alamat dan menggabungkannya ke dalam file KML. Meskipun disertakan dalam Python, contoh kode dapat disesuaikan dengan cukup mudah ke sebagian besar bahasa pemrograman lainnya.

Geocoding adalah proses mengonversi alamat menjadi kumpulan koordinat lintang/bujur, sehingga memungkinkan penentuan alamat di peta. Anda mungkin ingin melakukan geocoding terhadap 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 mengamati Persyaratan Layanan untuk Geocoding API karena ada beberapa batasan terkait waktu penyimpanan hasil, serta jumlah elemen yang dapat Anda geocoding 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. Minim Python adalah implementasi DOM, dan DOM didukung di sebagian besar bahasa pemrograman, sehingga proses ini harus mudah ditransfer 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 dokumen 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, dan tambahkan ke elemen Document. Kemudian, buat elemen <description>, tetapkan nilai alamat, dan tambahkan ke elemen <Placemark>.
  7. Buat elemen <Point>, tambahkan elemen <coordinates> turunan, dan tambahkan ke elemen <Placemark>.
  8. Mengirim alamat ke Geocoder Maps API, yang akan mengirim respons dalam JSON atau XML. Gunakan urllib.urlopen() untuk mengambil file dan membacanya menjadi string.
  9. Uraikan respons dan ekstrak elemen bujur dan lintang.
  10. Buat node teks di elemen <coordinates> dan tetapkan string bujur/lintang sebagai nilainya.
  11. Menulis dokumen KML ke file teks.

Contoh Kode Python

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

Kode contoh untuk geocoding dengan Python 2.7 dan output JSON ditampilkan di bawah ini:

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

Mengatur Permintaan Geocode

Permintaan Geocoding akan tunduk pada batas harian kecepatan kueri maksimum geocoder tersebut. Lihat dokumentasi Google Geocoding API untuk informasi selengkapnya tentang batasan tersebut. 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 geocoding pada alamat sebelum melakukan iterasi ke alamat berikutnya.

Mengubah Negara Dasar

Geocoder diprogram untuk membiaskan hasilnya tergantung pada domain asal. Misalnya, memasukkan "syracuse" dalam kotak penelusuran di maps.google.com akan melakukan geocoding terhadap kota "Syracuse, NY", saat memasukkan kueri yang sama di maps.google.it (domain Italia) akan mencari kota "Siracusa" di Sisilia. Anda akan mendapatkan hasil yang sama dengan mengirimkan kueri tersebut melalui geocoding HTTP ke maps.google.it, bukan maps.google.com, yang dapat Anda lakukan dengan mengubah variabel mapsUrl dalam kode contoh di atas. Lihat dokumentasi Geocoding API untuk informasi selengkapnya tentang Pembiasan Wilayah.

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

Kesimpulan

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

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