KML में उपयोग करने के लिए जियोकोडिंग पते

MNO Marks, Google Geo टीम
लेखक: दिसंबर 2007
अपडेट किया गया: दिसंबर 2013

उद्देश्य

यह ट्यूटोरियल उन डेवलपर के लिए है जिन्हें स्क्रिप्ट लिखने की जानकारी है और जो वेब पते ढूंढने और उन्हें KML फ़ाइल में शामिल करने के लिए, Google जियोकोडिंग एपीआई इस्तेमाल करने का तरीका जानना चाहते हैं. हालांकि, कोड सैंपल Python में दिखाए जाते हैं, लेकिन वे ज़्यादातर प्रोग्रामिंग भाषाओं में आसानी से इस्तेमाल किए जा सकते हैं.

जियोकोडिंग, पते को अक्षांश/देशांतर निर्देशांकों के एक सेट में बदलने की प्रक्रिया है, इससे मैप पर पतों को दिखाया जा सकता है. आप चाहें, तो पतों को भौगोलिक फ़ॉर्मैट में बदलकर सीधे KML फ़ाइल में डाल सकते हैं. उदाहरण के लिए, यह आम बात है, जब किसी फ़ॉर्म में डेटा डाला जा रहा हो और आप अनुरोधों के जवाब में KML फ़ाइलें जनरेट कर रहे हों. KML फ़ाइलों को फ़ाइल सिस्टम में या डेटाबेस में स्टोर किया जा सकता है. इसके अलावा, फ़ाइलों को ऐसे NetworkLink पर वापस भेजा जा सकता है जो आपकी फ़ाइल से कनेक्ट होता है. ध्यान दें कि इस तकनीक का इस्तेमाल करने पर, आपको जियोकोडिंग एपीआई के लिए सेवा की शर्तों का पालन करना चाहिए, क्योंकि नतीजों को सेव करने के समय पर कुछ सीमाएं लागू होती हैं. साथ ही, हर दिन उन चीज़ों की संख्या भी ध्यान में रखी जा सकती है जिनके लिए आप वेब पेज पर भौगोलिक रूप से पहुंच सकते हैं.

इस ट्यूटोरियल में, स्ट्रिंग "1600 Amphitheatre Pkwy, Mountain View, CA 94043" को लेने और उसे इसमें बदलने के लिए, Python का इस्तेमाल करने का तरीका बताया गया है:

<?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 दस्तावेज़ बनाना

KML एक्सएमएल मार्कअप भाषा है. इसलिए, हम KML दस्तावेज़ बनाने के लिए Python के बिल्ट-इन xml.dom.minidom फ़ंक्शन का इस्तेमाल कर सकते हैं. Python का मिंडोम, DOM लागू करता है और DOM ज़्यादातर प्रोग्रामिंग भाषाओं में काम करता है. इसलिए, इस प्रोसेस को किसी दूसरी प्रोग्रामिंग लैंग्वेज में पोर्ट करना आसान होना चाहिए. निम्न चरणों का अनुसरण करें:

  1. Python की xml.dom.minidom.Document() का इस्तेमाल करके, दस्तावेज़ बनाएं.
  2. createElementNS. का इस्तेमाल करके रूट <kml> एलिमेंट बनाएं
  3. इसे appendChild का इस्तेमाल करके, दस्तावेज़ में जोड़ें.
  4. createElement का इस्तेमाल करके, दस्तावेज़ एलिमेंट बनाएं.
  5. इसे appendChild का इस्तेमाल करके <kml> एलिमेंट में जोड़ें.
  6. हर पते के लिए, createElement का इस्तेमाल करके <Placemark> एलिमेंट बनाएं और उसे Document एलिमेंट में जोड़ें. इसके बाद, <description> एलिमेंट बनाएं, उसे पते की वैल्यू असाइन करें, और उसे <Placemark> एलिमेंट में जोड़ें.
  7. <Point> एलिमेंट बनाएं, चाइल्ड <coordinates> एलिमेंट जोड़ें, और उसे <Placemark> एलिमेंट में जोड़ें.
  8. Maps API जियोकोडर पर पता भेजें, जो JSON या XML में जवाब भेजता है. फ़ाइल को फिर से पाने के लिए, urllib.urlopen() का इस्तेमाल करें और इसे स्ट्रिंग में पढ़ें.
  9. रिस्पॉन्स को पार्स करें और देशांतर और अक्षांश वाले एलिमेंट निकालें.
  10. <coordinates> एलिमेंट में एक टेक्स्ट नोड बनाएं और देशांतर/अक्षांश स्ट्रिंग को इसके मान के रूप में असाइन करें.
  11. KML दस्तावेज़ को किसी टेक्स्ट फ़ाइल में लिखें.

Python कोड का नमूना

ध्यान दें कि नीचे दिया गया सैंपल कोड एक डमी मैपकी वैरिएबल का इस्तेमाल करता है—आपको इस कुंजी को अपनी अपनी की से बदलना होगा.

Python 2.7 और JSON आउटपुट के साथ जियोकोडिंग के लिए सैंपल कोड नीचे दिखाया गया है:

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

गौर करने लायक दूसरे पहलू

जियोकोड अनुरोधों का समय सेट करना

जियोकोडिंग अनुरोध, भौगोलिक सोर्स की ज़्यादा से ज़्यादा क्वेरी दर की रोज़ की सीमाओं पर निर्भर करेंगे. इन सीमाओं के बारे में ज़्यादा जानकारी के लिए, कृपया Google जियोकोडिंग एपीआई दस्तावेज़ देखें. यह तय करने के लिए कि आप भौगोलिक स्थान पर मौजूद क्वेरी को तेज़ी से न भेजें, आप हर भौगोलिक अनुरोध के बीच देरी की जानकारी दे सकते हैं. हर बार OVER_QUERY_LIMIT का स्टेटस मिलने पर, आपके पास इस देरी को बढ़ाने का विकल्प होता है. साथ ही, while लूप का इस्तेमाल करके, यह पक्का किया जा सकता है कि अगले पते पर जाने से पहले आपने पते को जोड़ दिया है.

मूल देश बदलना

इंट्रानेट को मूल डोमेन के आधार पर, इसके परिणामों को मापदंड से बाहर करने के लिए प्रोग्राम किया गया है. उदाहरण के लिए, maps.google.com पर खोज बॉक्स में "siriacuse" दर्ज करने से "Siracuse, NY" शहर का भौगोलिक रूप दिखाई देगा, जबकि maps.google.it (इटली का डोमेन) पर वही क्वेरी डालने पर, सिसली शहर "सिराकुसा" दिखेगा. आपको उसी क्वेरी को maps.google.com के बजाय maps.google.it पर एचटीटीपी जियोकोडिंग से भेजने पर वही नतीजे मिलेंगे, जो आप ऊपर दिए गए सैंपल कोड में mapsUrl वैरिएबल में बदलाव करके कर सकते हैं. क्षेत्र के हिसाब से मापदंड तय करने के बारे में ज़्यादा जानकारी के लिए, जियोकोडिंग एपीआई का दस्तावेज़ देखें.

ध्यान दें: आप मैप मौजूद न होने की स्थिति में, maps.google.* सर्वर पर अनुरोध नहीं भेज सकते. इसलिए, अपनी जियोकोडिंग क्वेरी पर रीडायरेक्ट करने से पहले यह पक्का कर लें कि कोई देश का डोमेन मौजूद हो. देश के हिसाब से, जीडीपीआर सहायता के लिए, यह पोस्ट देखें.

नतीजा

ऊपर दिए गए कोड का इस्तेमाल करके, किसी पते को Python इस्तेमाल करके, वेब पते से वेब पते से बदला जा सकता है. साथ ही, इसके लिए KML <Placemark> बनाया जा सकता है और डिस्क में सेव किया जा सकता है. अगर आपको लगता है कि आपको हर दिन अपने पते से ज़्यादा पते मैप करने की ज़रूरत है, या यह है कि Google जियोकोडर उन क्षेत्रों को शामिल नहीं करता है जिनमें आपकी दिलचस्पी है, तो ज़्यादा जियोकोडिंग वेब सेवाओं का इस्तेमाल करने पर विचार करें.

अब आपको अपने पते भौगोलिक रूप से जोड़ने का तरीका पता है, इसलिए Google मैशअप एडिटर में KML का इस्तेमाल करना और KML बनाने के लिए PHP और MySQL का इस्तेमाल करना लेख पढ़ें. अगर आपको इस ट्यूटोरियल में कोई समस्या है या इससे जुड़े सवाल हैं, तो कृपया Stack Overflow फ़ोरम में पोस्ट करें.