KML'de Kullanılmak Üzere Adresleri Coğrafi Kodlama

Mano Marks, Google Coğrafi Ekibi
Yayınlanma tarihi: Aralık 2007
Güncellenme tarihi: Aralık 2013

Hedef

Bu eğitim, komut dosyası oluşturma dillerini bilen ve adresleri coğrafi olarak kodlamak ve bunları bir KML dosyasına dahil etmek için Google Geocoding API'yi nasıl kullanacağını öğrenmek isteyen geliştiriciler için hazırlanmıştır. Kod örnekleri Python'da sunulsa da diğer programlama dillerine kolayca uyarlanabilir.

Coğrafi kodlama, bir adresi enlem/boylam koordinatları kümesine dönüştürme işlemidir. Bu işlem, adreslerin haritada gösterilmesini sağlar. Adresleri coğrafi olarak kodlayıp doğrudan bir KML dosyasına yerleştirmek isteyebilirsiniz. Örneğin, bir forma veri girilirken ve isteklere yanıt olarak KML dosyaları oluşturulurken bu durum yaygındır. Bu KML dosyaları bir veritabanında, dosya sisteminde depolanabilir veya dosyanıza bağlanan bir NetworkLink'e döndürülebilir. Bu tekniği kullanırken sonuçların saklanabileceği süre ve her gün coğrafi kodunu oluşturabileceğiniz öğe sayısı konusunda bazı sınırlamalar olduğundan, Coğrafi Kodlama API'si Hizmet Şartları'na uymanız gerektiğini unutmayın.

Bu eğiticide, Python kullanarak "1600 Amphitheatre Pkwy, Mountain View, CA 94043" dizesini nasıl alıp şu hale getireceğiniz gösterilmektedir:

<?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>

KML dokümanı oluşturma

KML bir XML işaretleme dili olduğundan KML belgesi oluşturmak için Python'ın yerleşik xml.dom.minidom işlevlerini kullanabiliriz. Python'ın minidom'u bir DOM uygulamasıdır ve DOM çoğu programlama dilinde desteklenir. Bu nedenle, bu işlemin başka bir programlama diline aktarılması kolay olmalıdır. Şu adımları uygulayabilirsiniz:

  1. Python'ın xml.dom.minidom.Document() özelliğini kullanarak dokümanı oluşturun.
  2. <kml> kullanarak kök <kml> öğesini oluşturun. createElementNS.
  3. appendChild kullanarak dokümana ekleyin.
  4. createElement kullanarak bir Doküman öğesi oluşturun.
  5. appendChild kullanarak <kml> öğesine ekleyin.
  6. Her adres için createElement kullanarak bir <Placemark> öğesi oluşturun ve bunu Document öğesine ekleyin. Ardından, bir <description> öğesi oluşturun, adresi bu öğeye atayın ve <Placemark> öğesine ekleyin.
  7. <Point> öğesi oluşturun, alt <coordinates> öğesi ekleyin ve bunu <Placemark> öğesine ekleyin.
  8. Adresi, JSON veya XML biçiminde yanıt gönderen Maps API Geocoder'a gönderin. Dosyayı almak ve bir dizeye okumak için urllib.urlopen() kullanın.
  9. Yanıtı ayrıştırın ve boylam ile enlem öğelerini ayıklayın.
  10. <coordinates> öğesinde bir metin düğümü oluşturun ve boylam/enlem dizesini değer olarak atayın.
  11. KML belgesini bir metin dosyasına yazın.

Örnek Python Kodu

Aşağıdaki örnek kodda sahte bir mapsKey değişkeni kullanıldığını unutmayın. Bu anahtarı kendi anahtarınızla değiştirmeniz gerekir.

Python 2.7 ve JSON çıkışıyla coğrafi kodlama için örnek kod aşağıda gösterilmiştir:

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')

Göz Önünde Bulundurulması Gereken Diğer Noktalar

Coğrafi Kodlama İsteklerinin Zamanlaması

Coğrafi kodlama istekleri, coğrafi kodlayıcının günlük maksimum sorgu oranı sınırlarına tabi olur. Bu sınırlar hakkında daha fazla bilgi için lütfen Google Geocoding API belgelerine bakın. Coğrafi kod çözücüye çok hızlı bir şekilde sorgu göndermediğinizden emin olmak için her coğrafi kod çözme isteği arasında bir gecikme belirtebilirsiniz. OVER_QUERY_LIMIT durumu aldığınız her seferde bu gecikmeyi artırabilir ve bir adresi başarıyla coğrafi olarak kodladığınızdan emin olmak için while döngüsü kullanabilirsiniz.

Temel ülkeyi değiştirme

Coğrafi kodlayıcı, sonuçlarını kaynak alanına göre önyargılı olacak şekilde programlanmıştır. Örneğin, maps.google.com adresindeki arama kutusuna "syracuse" yazıldığında "Syracuse, NY" şehri coğrafi olarak kodlanır. Aynı sorgu maps.google.it (İtalya'nın alanı) adresine girildiğinde ise Sicilya'daki "Siracusa" şehri bulunur. Bu sorguyu maps.google.com yerine maps.google.it adresine HTTP coğrafi kodlaması üzerinden göndererek de aynı sonuçları elde edebilirsiniz. Bunu, yukarıdaki örnek kodda mapsUrl değişkenini değiştirerek yapabilirsiniz. Bölge Tercihi hakkında daha fazla bilgi için Coğrafi Kodlama API'si belgelerine bakın.

Not: Olmayan bir maps.google.* sunucusuna istek gönderemezsiniz. Bu nedenle, coğrafi kodlama sorgularınızı yönlendirmeden önce bir ülke alanının mevcut olduğundan emin olun. Ülkeye göre coğrafi kod desteği için bu gönderiye göz atın.

Sonuç

Yukarıdaki kodu kullanarak artık Python ile bir adrese coğrafi kodlama uygulayabilir, bu adresten KML dosyası oluşturabilir ve dosyayı diske kaydedebilirsiniz.<Placemark> Sınırların izin verdiğinden daha fazla adresi coğrafi olarak kodlamanız gerektiğini veya Google coğrafi kodlayıcının ilgilendiğiniz bölgeleri kapsamadığını fark ederseniz ek coğrafi kodlama web hizmetlerini kullanmayı düşünebilirsiniz.

Adreslerinize nasıl coğrafi kodlama yapacağınızı öğrendiğinize göre, Google Mashup Editor'da KML kullanma ve KML oluşturmak için PHP ve MySQL kullanma başlıklı makalelere göz atın. Bu eğitimle ilgili sorunlarınız veya sorularınız varsa lütfen Stack Overflow forumunda paylaşın.