KML'de Kullanılacak Coğrafi Kodlama Adresleri

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

Hedef

Bu eğitim, kodlama dillerine aşina olan ve adresleri coğrafi kodlama yapmak ve bunları bir KML dosyasına dahil etmek için Google Coğrafi Kodlama API'sini nasıl kullanacağınızı öğrenmek isteyen geliştiriciler için hazırlanmıştır. Kod örnekleri Python'da sunulurken diğer programlama dillerinin çoğuna kolayca uyarlanabilir.

Coğrafi kodlama, bir adresi enlem/boylam koordinatlarına dönüştürme işlemidir ve adreslerin bir haritada belirtilmesini sağlar. Adreslerin coğrafi biçimini belirleyebilir ve bunları doğrudan bir KML dosyasına yerleştirebilirsiniz. Bu durum, örneğin bir forma veri girildiğinde ve isteklere yanıt olarak KML dosyaları oluşturduğunuzda yaygın olarak görülen bir durumdur. Bu KML dosyaları bir veritabanında veya dosya sisteminde depolanabilir veya dosyanıza bağlanan bir Ağ Bağlantısı'na döndürülebilir. Bu teknikten yararlanırken, coğrafi kodlama API'sinin Hizmet Şartları'na uymanız gerekir. Sonuçların saklanabileceği süre ve her gün coğrafi kodlama yapabileceğiniz öğe sayısı bazı sınırlamalar içermektedir.

Bu eğitim, "1600 Amphitheatre Pkwy, Mountain View, CA 94043" dizesini almak ve müşteriye dönüştürmek için Python'u nasıl kullanacağınızı gösterir:

<?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 biçimlendirme dili olduğundan, KML dokümanı oluşturmak için Python'un yerleşik xml.dom.minidom işlevlerini kullanabiliriz. Python'un minimalizmi bir DOM uygulamasıdır ve DOM, çoğu programlama dilinde desteklendiği için bu sürecin başka bir programlama diline taşınması kolaydır. İzleyeceğiniz adımlar aşağıda açıklanmıştır:

  1. Python xml.dom.minidom.Document() uygulamasını kullanarak dokümanı oluşturun.
  2. Kök <kml> öğeyi createElementNS. kullanarak oluşturun
  3. appendChild kullanarak dokümanı dokümana ekleyin.
  4. createElement kullanarak bir doküman öğesi oluşturun.
  5. Değeri appendChild kullanarak <kml> öğesine ekleyin.
  6. Her adres için createElement öğesini kullanarak bir <Placemark> öğesi oluşturun ve bu öğeyi Document öğesine ekleyin. Ardından, bir <description> öğesi oluşturun, bu adrese adresin değerini atayın ve <Placemark> öğesine ekleyin.
  7. Bir <Point> öğesi oluşturun, bir alt <coordinates> öğesi ekleyin ve bu öğeyi <Placemark> öğesine ekleyin.
  8. Adresi, JSON veya XML biçiminde bir yanıt gönderen Maps API Coğrafi Kodlayıcı'ya gönderin. Dosyayı almak ve bir dize halinde okumak için urllib.urlopen() kullanın.
  9. Yanıtı ayrıştırıp boylam ve enlem öğelerini çıkarın.
  10. <coordinates> öğesinde bir metin düğümü oluşturun ve değer olarak boylam/enlem dizesini atayın.
  11. KML dokümanını bir metin dosyasına yazın.

Örnek Python Kodu

Aşağıdaki örnek kod, model bir eşleme anahtarı kullanır. 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 Bulundurulacak Diğer Noktalar

Coğrafi Kod İsteklerini Zamanlama

Coğrafi kodlama istekleri, coğrafi kodlamanın maksimum sorgu hızı günlük sınırlarına tabi olacaktır. Bu sınırlar hakkında daha fazla bilgi için lütfen Google Geocode API dokümanlarına bakın. Kodlayıcıya sorguları çok hızlı göndermemek için her coğrafi kodlama isteği arasında bir gecikme belirtebilirsiniz. OVER_QUERY_LIMIT durumu her aldığınızda bu gecikmeyi artırabilir ve sonraki adrese geçmeden önce adresi başarıyla coğrafi kodlamaya dahil etmek için while döngüsü kullanabilirsiniz.

Ana Ülkeyi Değiştirme

Coğrafi kodlayıcı, kaynak alana bağlı olarak sonuçlarına ağırlık verecek şekilde programlanır. Örneğin, maps.google.com adresindeki arama kutusuna "syracuse" yazdığınızda, "Syracuse, NY" şehrinin coğrafi kodlaması yapılır ve aynı sorgu maps.google.it'e (İtalya'nın alanı) girildiğinde Sicilya'daki "Siracusa" şehri bulunur. Aynı sonuçları HTTP coğrafi kodlama aracılığıyla maps.google.com yerine maps.google.it adresine göndererek de aynı sonuçları alırsınız. Bunun için yukarıdaki örnek kodda mapsUrl değişkenini değiştirebilirsiniz. Bölgeye Ağırlık Verme hakkında daha fazla bilgi için Geocode API dokümanlarına bakın.

Not: Mevcut olmayan bir haritalar.google.* sunucusuna istek gönderemezsiniz. Bu nedenle, coğrafi kodlama sorgularınızı bu ülkeye yönlendirmeden önce bir ülke alan adı bulunduğundan emin olun. Ülkelere göre coğrafi kodlama desteği için bu yayına göz atın.

Sonuç

Yukarıdaki kodu kullanarak artık Python ile bir adresin coğrafi kodlamasını yapabilir, buradaki KML'yi oluşturabilir ve diske kaydedebilirsiniz<Placemark>. Günlük olarak, izin verilenden daha fazla adresi coğrafi olarak kodlamanız gerektiğini fark ederseniz veya Google coğrafi kodlayıcının ilgilendiğiniz bölgeleri kapsamadığını fark ederseniz ek coğrafi kodlama web hizmetlerini kullanabilirsiniz.

Adreslerinizin coğrafi kodlamasını nasıl yaptığınıza göre artık Google Mashup Editor'da KML'yi kullanma ve KML oluşturmak için PHP ve MySQL kullanma konulu makaleleri inceleyebilirsiniz. Bu eğitimle ilgili herhangi bir sorunuz veya sorunuz varsa lütfen sorularınızı Stack Overflow forumunda yayınlayın.