KML-এ ব্যবহারের জন্য জিওকোডিং ঠিকানা

মানো মার্কস, গুগল জিও টিম
লেখক: ডিসেম্বর 2007
আপডেট করা হয়েছে: ডিসেম্বর 2013

উদ্দেশ্য

এই টিউটোরিয়ালটি এমন ডেভেলপারদের জন্য তৈরি করা হয়েছে যারা স্ক্রিপ্টিং ভাষাগুলির সাথে পরিচিত এবং কীভাবে Google জিওকোডিং API ব্যবহার করে জিওকোড ঠিকানাগুলিকে একটি KML ফাইলে অন্তর্ভুক্ত করতে চান তা শিখতে চান৷ যদিও কোডের নমুনাগুলি পাইথনে উপস্থাপিত হয়, সেগুলি বেশিরভাগ অন্যান্য প্রোগ্রামিং ভাষার সাথে মোটামুটি সহজে অভিযোজিত হতে পারে।

জিওকোডিং হল একটি ঠিকানাকে অক্ষাংশ/দ্রাঘিমাংশ স্থানাঙ্কের একটি সেটে রূপান্তর করার প্রক্রিয়া, যা একটি মানচিত্রে ঠিকানাগুলি নির্দেশ করা সম্ভব করে। আপনি ঠিকানাগুলি জিওকোড করতে এবং সেগুলিকে সরাসরি একটি KML ফাইলে রাখতে চাইতে পারেন৷ এটি সাধারণ, উদাহরণস্বরূপ, যখন একটি ফর্মে ডেটা প্রবেশ করানো হচ্ছে এবং আপনি অনুরোধের প্রতিক্রিয়া হিসাবে KML ফাইল তৈরি করছেন৷ এই KML ফাইলগুলি একটি ডাটাবেসে, একটি ফাইল সিস্টেমে সংরক্ষণ করা যেতে পারে বা আপনার ফাইলের সাথে সংযোগকারী নেটওয়ার্ক লিঙ্কে ফিরে যেতে পারে। মনে রাখবেন যে এই কৌশলটি ব্যবহার করার সময়, আপনাকে অবশ্যই জিওকোডিং API-এর পরিষেবার শর্তাবলী পালন করতে হবে কারণ ফলাফলগুলি সংরক্ষণ করার সময় কিছু সীমাবদ্ধতা রয়েছে, সেইসাথে আপনি প্রতিদিন কতগুলি উপাদান জিওকোড করতে পারেন।

এই টিউটোরিয়ালটি আপনাকে দেখায় কিভাবে পাইথন ব্যবহার করতে স্ট্রিং " 1600 Amphitheatre Pkwy, Mountain View, CA 94043 " নিতে হয় এবং এটিকে এতে পরিণত করতে হয়:

<?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 হল একটি XML মার্কআপ ভাষা, তাই আমরা একটি KML নথি তৈরি করতে পাইথনের তৈরি xml.dom.minidom ফাংশন ব্যবহার করতে পারি। পাইথনের মিনিডম একটি DOM বাস্তবায়ন, এবং DOM বেশিরভাগ প্রোগ্রামিং ভাষায় সমর্থিত, তাই এই প্রক্রিয়াটি অন্য প্রোগ্রামিং ভাষায় পোর্ট করা সহজ হওয়া উচিত। এখানে পদক্ষেপগুলি রয়েছে:

  1. পাইথনের 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 ডকুমেন্ট লিখুন।

নমুনা পাইথন কোড

মনে রাখবেন যে নীচের নমুনা কোডটি একটি ডামি mapsKey ভেরিয়েবল ব্যবহার করে—আপনাকে এই কীটি আপনার নিজের কী দিয়ে প্রতিস্থাপন করতে হবে।

পাইথন 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 জিওকোডিং API ডকুমেন্টেশন দেখুন। আপনি জিওকোডারে খুব দ্রুত প্রশ্ন পাঠাবেন না তা নিশ্চিত করতে, আপনি প্রতিটি জিওকোড অনুরোধের মধ্যে একটি বিলম্ব নির্দিষ্ট করতে পারেন। আপনি প্রতিবার একটি OVER_QUERY_LIMIT স্ট্যাটাস পেলে এই বিলম্ব বাড়াতে পারেন, এবং পরেরটিতে পুনরাবৃত্তি করার আগে আপনি সফলভাবে একটি ঠিকানা জিওকোড করেছেন তা নিশ্চিত করতে একটি while লুপ ব্যবহার করতে পারেন।

ভিত্তি দেশ পরিবর্তন

জিওকোডারটি মূল ডোমেনের উপর নির্ভর করে এর ফলাফলগুলিকে পক্ষপাতিত্ব করার জন্য প্রোগ্রাম করা হয়েছে। উদাহরণ স্বরূপ, maps.google.com-এর সার্চ বক্সে "syracuse" লিখলে "Syracuse, NY" শহরের জিওকোড হবে, যখন maps.google.it (ইতালির ডোমেন) এ একই ক্যোয়ারী লিখলে "Siracusa শহর" পাওয়া যাবে "সিসিলিতে। আপনি maps.google.com এর পরিবর্তে HTTP জিওকোডিংয়ের মাধ্যমে সেই ক্যোয়ারীটি maps.google.it- এ পাঠিয়ে একই ফলাফল পাবেন, যা আপনি উপরের নমুনা কোডে mapsUrl ভেরিয়েবল পরিবর্তন করে করতে পারেন৷ অঞ্চল বায়াসিং সম্পর্কে আরও তথ্যের জন্য জিওকোডিং API ডকুমেন্টেশন পড়ুন।

দ্রষ্টব্য: আপনি একটি অস্তিত্বহীন maps.google.* সার্ভারে একটি অনুরোধ পাঠাতে পারবেন না, তাই আপনার জিওকোডিং প্রশ্নগুলিকে এটিতে পুনঃনির্দেশিত করার আগে একটি দেশের ডোমেন বিদ্যমান রয়েছে তা নিশ্চিত করুন৷ দেশ অনুসারে জিওকোড সমর্থনের জন্য, এই পোস্টটি দেখুন।

উপসংহার

উপরের কোডটি ব্যবহার করে, আপনি এখন পাইথন ব্যবহার করে একটি ঠিকানা জিওকোড করতে পারেন, এটি থেকে একটি KML <Placemark> তৈরি করতে পারেন এবং এটি ডিস্কে সংরক্ষণ করতে পারেন। আপনি যদি দেখেন যে আপনাকে সীমার চেয়ে প্রতিদিন আরও বেশি ঠিকানা জিওকোড করতে হবে বা Google জিওকোডার আপনার আগ্রহের অঞ্চলগুলিকে কভার করে না, তাহলে অতিরিক্ত জিওকোডিং ওয়েব পরিষেবাগুলি ব্যবহার করার কথা বিবেচনা করুন৷

এখন যেহেতু আপনি আপনার ঠিকানাগুলি জিওকোড করতে জানেন, Google ম্যাশআপ এডিটরে KML ব্যবহার এবং KML তৈরি করতে PHP এবং MySQL ব্যবহার করার নিবন্ধগুলি দেখুন৷ এই টিউটোরিয়াল নিয়ে আপনার কোনো সমস্যা বা প্রশ্ন থাকলে, দয়া করে স্ট্যাক ওভারফ্লো ফোরামে পোস্ট করুন।