মার্চ 2008
উদ্দেশ্য
এই টিউটোরিয়ালটি পাইথন ব্যবহার করে কমা সেপারেটেড ভ্যালু (CSV) ডেটা থেকে কীভাবে KML তৈরি করতে হয় তার প্রাথমিক রূপরেখা দেয়। CSV ডেটা বর্তমানে ব্যবহৃত সবচেয়ে সর্বব্যাপী ফাইল ফরম্যাটগুলির মধ্যে একটি। বেশিরভাগ স্প্রেডশীট এবং ডাটাবেস উভয়ই CSV ফাইল পড়তে এবং লিখতে পারে। এর সাধারণ বিন্যাসটি একটি পাঠ্য সম্পাদকে সম্পাদনা করা যেতে পারে। পাইথনের মতো অনেক প্রোগ্রামিং ভাষাতে CSV ফাইল পড়তে ও লেখার জন্য বিশেষ লাইব্রেরি রয়েছে। তাই এটি প্রচুর পরিমাণে ডেটা বিনিময়ের জন্য একটি দুর্দান্ত মাধ্যম করে তোলে।
যদিও এই টিউটোরিয়ালের কোড নমুনাগুলি পাইথনে রয়েছে, সেগুলি বেশিরভাগ অন্যান্য প্রোগ্রামিং ভাষার সাথে মানিয়ে নেওয়া যেতে পারে। এই টিউটোরিয়ালটি একটি ঠিকানাকে দ্রাঘিমাংশ/অক্ষাংশ স্থানাঙ্কে পরিণত করতে KML-এ ব্যবহারের জন্য জিওকোডিং ঠিকানা থেকে কোড ব্যবহার করে। এটি KML 2.2-এর নতুন <ExtendedData>
উপাদানও ব্যবহার করে এবং কাস্টম ডেটা যোগ করার ক্ষেত্রে বর্ণিত বেলুন টেমপ্লেটিং-এর সুবিধা নেয়। যেমন, উত্পাদিত KML বর্তমানে Google মানচিত্র বা অন্যান্য KML-ব্যবহারকারী অ্যাপ্লিকেশনগুলিতে সমর্থিত নয়, তবে কোডটি মানচিত্র-সামঞ্জস্যপূর্ণ KML তৈরির জন্য অভিযোজিত হতে পারে।
নমুনা তথ্য
এই টিউটোরিয়ালের জন্য, একটি নমুনা CSV ফাইল হিসাবে google-addresses.csv ফাইলটি ব্যবহার করুন৷ এই ফাইলটিতে বিভিন্ন মার্কিন Google অফিসের সমস্ত ঠিকানা, ফোন নম্বর এবং ফ্যাক্স নম্বর রয়েছে৷ এখানে ফাইলের পাঠ্য:
Office,Address1,Address2,Address3,City,State,Zip,Phone,Fax Headquarters,1600 Amphitheatre Parkway,,,Mountain View,CA,94043,650-253-0000,650-253-0001 New York Sales & Engineering Office,76 Ninth Avenue,,,New York,NY,10011,212-565-0000,212-565-0001 Ann Arbor Sales Office,201 South Division Street,,,Ann Arbor,MI,48104,734-332-6500,734-332-6501 Atlanta Sales & Engineering Office,10 10th Street NE,,,Atlanta,GA,30309,404-487-9000,404-487-9001 Boulder Sales & Engineering Office,2590 Pearl St.,,,Boulder,CO,80302,303-245-0086,303-535-5592 Cambridge Sales & Engineering Office,5 Cambridge Center,,,Cambridge,MA,02142,617-682-3635,617-249-0199 Chicago Sales & Engineering Office,20 West Kinzie St.,,,Chicago,IL,60610,312-840-4100,312-840-4101 Coppell Sales Office,701 Canyon Drive,,,Coppell,TX,75019,214-451-4000,214-451-4001 Detroit Sales Office,114 Willits Street,,,Birmingham,MI,48009,248-351-6220,248-351-6227 Irvine Sales & Engineering Office,19540 Jamboree Road,,,Irvine,CA,92612,949-794-1600,949-794-1601 Pittsburgh Engineering Office,4720 Forbes Avenue,,,Pittsburgh,PA,15213,, Santa Monica Sales & Engineering Office,604 Arizona Avenue,,,Santa Monica,CA,90401,310-460-4000,310-309-6840 Seattle Engineering Office,720 4th Avenue,,,Kirkland,WA,98033,425-739-5600,425-739-5601 Seattle Sales Office,501 N. 34th Street,,,Seattle,WA,98103,206-876-1500,206-876-1501 Washington D.C. Public Policy Office,1001 Pennsylvania Avenue NW,,,Washington,DC,20004,202-742-6520,
লক্ষ্য করুন কিভাবে প্রতিটি লাইন কমা দ্বারা পৃথক করা পাঠ্য স্ট্রিংগুলির একটি সিরিজ। প্রতিটি কমা একটি ক্ষেত্রকে সীমাবদ্ধ করে; প্রতিটি লাইনে একই সংখ্যক কমা আছে। প্রথম লাইনে ক্ষেত্রগুলির নাম ক্রমানুসারে রয়েছে। উদাহরণস্বরূপ, প্রতিটি সারিতে পাঠ্যের প্রথম ব্লকটি হল "অফিস" ক্ষেত্র, দ্বিতীয়টি "Address1", ইত্যাদি। পাইথন এটিকে dicts
নামে একটি DictReader
সংগ্রহে পরিণত করতে পারে যা আপনাকে প্রতিটি সারির মধ্য দিয়ে যেতে দেয়। এই কোড নমুনাটি আপনার ডেটার গঠন আগে থেকেই জেনে আপনার উপর নির্ভর করে, কিন্তু আপনি ফিল্ড স্ট্রাকচারকে গতিশীলভাবে পাস করতে কিছু মৌলিক হ্যান্ডলার যোগ করতে পারেন।
CSV ফাইল পার্স করা হচ্ছে
পাইথনের xml.dom.minidom
মডিউল XML নথি তৈরি করার জন্য দুর্দান্ত সরঞ্জাম সরবরাহ করে এবং যেহেতু KML হল XML, আপনি এই টিউটোরিয়ালে এটি বেশ ভারীভাবে ব্যবহার করবেন। আপনি createElement
বা createElementNS
দিয়ে একটি উপাদান তৈরি করুন এবং appendChild
দিয়ে অন্য একটি উপাদানের সাথে যুক্ত করুন। এইগুলি হল CSV ফাইল পার্স করার এবং একটি KML ফাইল তৈরি করার ধাপ।
- আপনার মডিউলে geocoding_for_kml.py আমদানি করুন।
- CSV ফাইলগুলির জন্য একটি
DictReader
তৈরি করুন৷DictReader
হলdicts
একটি সংগ্রহ, প্রতিটি সারির জন্য একটি। - পাইথনের
xml.dom.minidom.Document()
ব্যবহার করে নথিটি তৈরি করুন। -
createElementNS.
ব্যবহার করে রুট<kml>
উপাদান তৈরি করুন। - নথিতে এটি যুক্ত করুন
.
-
createElement
ব্যবহার করে একটি<Document>
উপাদান তৈরি করুন। -
appendChild
ব্যবহার করে এটিকে<kml>
উপাদানে যুক্ত করুন। - প্রতিটি সারির জন্য, একটি
<Placemark>
উপাদান তৈরি করুন এবং এটিকে<Document>
উপাদানে যুক্ত করুন। - প্রতিটি সারির প্রতিটি কলামের জন্য, একটি
<ExtendedData>
উপাদান তৈরি করুন এবং ধাপ 8-এ আপনার তৈরি করা<Placemark>
উপাদানে এটি যুক্ত করুন। - একটি
<Data>
উপাদান তৈরি করুন এবং এটিকে<ExtendedData>
উপাদানে যুক্ত করুন।<Data>
উপাদানটিকে নামের একটি বৈশিষ্ট্য দিন, এবংsetAttribute
ব্যবহার করে কলামের নামের মান নির্ধারণ করুন। - একটি
<value>
উপাদান তৈরি করুন এবং এটিকে<Data>
উপাদানে যুক্ত করুন। একটি টেক্সট নোড তৈরি করুন এবংcreateTextNode
ব্যবহার করে কলামের মান নির্ধারণ করুন।<value>
এলিমেন্টে টেক্সট নোড যোগ করুন। - একটি
<Point>
উপাদান তৈরি করুন এবং এটিকে<Placemark>
উপাদানে যুক্ত করুন। একটি<coordinates>
উপাদান তৈরি করুন এবং এটিকে<Point>
উপাদানে যুক্ত করুন। - সারি থেকে ঠিকানাটি বের করুন যাতে এটি এই বিন্যাসে একটি একক স্ট্রিং হয়: Address1,Address2,City,State,Zip. সুতরাং প্রথম সারিটি হবে
1600 Amphitheater Parkway,,Mountain View,CA,94043
। একে অপরের পাশে কমা থাকলে ঠিক আছে। দ্রষ্টব্য, এটি করার জন্য CSV ফাইলের গঠন এবং কোন কলামগুলি ঠিকানা গঠন করে সে সম্পর্কে পূর্ব জ্ঞান প্রয়োজন। - KML-এ ব্যবহারের জন্য জিওকোডিং ঠিকানায় ব্যাখ্যা করা geocoding_for_kml.py কোড ব্যবহার করে ঠিকানাটি জিওকোড করুন। এটি একটি স্ট্রিং প্রদান করে যা অবস্থানের দ্রাঘিমাংশ এবং অক্ষাংশ।
- একটি টেক্সট নোড তৈরি করুন এবং এটিকে ধাপ 14-এ স্থানাঙ্কের মান নির্ধারণ করুন, তারপর এটিকে
<coordinates>
উপাদানে যুক্ত করুন। - একটি ফাইলে KML নথি লিখুন।
- আপনি যদি স্ক্রিপ্টে আর্গুমেন্ট হিসাবে কলামের নামের একটি তালিকা পাস করেন, স্ক্রিপ্টটি সেই ক্রমে উপাদান যুক্ত করবে। যদি আমরা উপাদানগুলির ক্রম সম্পর্কে চিন্তা না করি, আমরা একটি
list
তৈরি করতেdict.keys()
ব্যবহার করতে পারি। যাইহোক,dict.keys()
নথি থেকে আসল অর্ডার সংরক্ষণ করে না। এই যুক্তিটি ব্যবহার করতে, কমা দ্বারা পৃথক করা তালিকা হিসাবে ক্ষেত্রের নামের তালিকাটি পাস করুন, এইভাবে:python csvtokml.py Office,Address1,Address2,Address3,City,State,Zip,Phone,Fax
নমুনা পাইথন কোড
পাইথন 2.2 ব্যবহার করে একটি CSV ফাইল থেকে একটি KML ফাইল তৈরি করার নমুনা কোড নীচে দেখানো হয়েছে৷ এছাড়াও আপনি এখানে ডাউনলোড করতে পারেন .
import geocoding_for_kml
import csv
import xml.dom.minidom
import sys
def extractAddress(row):
# This extracts an address from a row and returns it as a string. This requires knowing
# ahead of time what the columns are that hold the address information.
return '%s,%s,%s,%s,%s' % (row['Address1'], row['Address2'], row['City'], row['State'], row['Zip'])
def createPlacemark(kmlDoc, row, order):
# This creates aelement for a row of data.
# A row is a dict.
placemarkElement = kmlDoc.createElement('Placemark')
extElement = kmlDoc.createElement('ExtendedData')
placemarkElement.appendChild(extElement)
# Loop through the columns and create a element for every field that has a value.
for key in order:
if row[key]:
dataElement = kmlDoc.createElement('Data')
dataElement.setAttribute('name', key)
valueElement = kmlDoc.createElement('value')
dataElement.appendChild(valueElement)
valueText = kmlDoc.createTextNode(row[key])
valueElement.appendChild(valueText)
extElement.appendChild(dataElement)
pointElement = kmlDoc.createElement('Point')
placemarkElement.appendChild(pointElement)
coordinates = geocoding_for_kml.geocode(extractAddress(row))
coorElement = kmlDoc.createElement('coordinates')
coorElement.appendChild(kmlDoc.createTextNode(coordinates))
pointElement.appendChild(coorElement)
return placemarkElement
def createKML(csvReader, fileName, order):
# This constructs the KML document from the CSV file.
kmlDoc = xml.dom.minidom.Document()
kmlElement = kmlDoc.createElementNS('http://earth.google.com/kml/2.2', 'kml')
kmlElement.setAttribute('xmlns','http://earth.google.com/kml/2.2')
kmlElement = kmlDoc.appendChild(kmlElement)
documentElement = kmlDoc.createElement('Document')
documentElement = kmlElement.appendChild(documentElement)
# Skip the header line.
csvReader.next()
for row in csvReader:
placemarkElement = createPlacemark(kmlDoc, row, order)
documentElement.appendChild(placemarkElement)
kmlFile = open(fileName, 'w')
kmlFile.write(kmlDoc.toprettyxml(' ', newl = '\n', encoding = 'utf-8'))
def main():
# This reader opens up 'google-addresses.csv', which should be replaced with your own.
# It creates a KML file called 'google.kml'.
# If an argument was passed to the script, it splits the argument on a comma
# and uses the resulting list to specify an order for when columns get added.
# Otherwise, it defaults to the order used in the sample.
if len(sys.argv) >1: order = sys.argv[1].split(',')
else: order = ['Office','Address1','Address2','Address3','City','State','Zip','Phone','Fax']
csvreader = csv.DictReader(open('google-addresses.csv'),order)
kml = createKML(csvreader, 'google-addresses.kml', order)
if __name__ == '__main__':
main()
নমুনা KML তৈরি করা হয়েছে৷
এই স্ক্রিপ্টটি যে KML তৈরি করে তার একটি নমুনা নীচে দেখানো হয়েছে৷ লক্ষ্য করুন কিভাবে কিছু <value>
উপাদানে শুধুমাত্র সাদা স্থান আছে। কারণ ক্ষেত্রটিতে কোনো ডেটা ছিল না। আপনি এখানে সম্পূর্ণ নমুনা ডাউনলোড করতে পারেন।
<?xml version="1.0" encoding="utf-8"?>
<kml xmlns="http://earth.google.com/kml/2.2">
<Document>
<Placemark>
<ExtendedData>
<Data name="Office">
<value>
Headquarters
</value>
</Data>
<Data name="Address1">
<value>
1600 Amphitheater Parkway
</value>
</Data>
<Data name="City">
<value>
Mountain View
</value>
</Data>
<Data name="State">
<value>
CA
</value>
</Data>
<Data name="Zip">
<value>
94043
</value>
</Data>
<Data name="Phone">
<value>
650-253-0000
</value>
</Data>
<Data name="Fax">
<value>
650-253-0001
</value>
</Data>
</ExtendedData>
<Point>
<coordinates>
-122.081783,37.423111
</coordinates>
</Point>
</Placemark>
...
স্ক্রিন শট
Google Earth-এ সেই KML ফাইলটি কেমন দেখায় তার একটি স্ক্রিনশট নিচে দেওয়া হল৷ যেহেতু প্রতিটি <Placemark>
উপাদানের কোনো <BalloonStyle><text>
এবং কোনো <description>
উপাদান নেই, তাই বেলুনটি একটি টেবিল শৈলীতে ডিফল্ট হয়, <Data>
উপাদানের উপর অঙ্কন করে।
জিওকোডিং বিবেচনা
এটি "KML-এ ব্যবহারের জন্য জিওকোডিং ঠিকানা" এ উল্লেখ করা হয়েছে, কিন্তু এটি পুনরাবৃত্তি করে। আপনার জিওকোডিং অনুরোধগুলি জিওকোডারের সর্বোচ্চ ক্যোয়ারী রেট এবং আপনার আইপির উপর ভিত্তি করে প্রতিদিন 15,000 ক্যোয়ারী সাপেক্ষে হবে। অতিরিক্তভাবে, জিওকোডার দ্বারা 620
এর একটি স্ট্যাটাস কোড ফেরত দেওয়া হবে যদি আপনি এটি পরিচালনা করতে পারে তার চেয়ে দ্রুত অনুসন্ধান করেন। (স্থিতি কোডগুলির একটি সম্পূর্ণ তালিকা এখানে উপলব্ধ ।) আপনি জিওকোডারে খুব দ্রুত কোয়েরি পাঠাবেন না তা নিশ্চিত করতে, আপনি প্রতিটি জিওকোড অনুরোধের মধ্যে একটি বিলম্ব নির্দিষ্ট করতে পারেন। আপনি যখনই একটি 620
স্ট্যাটাস পাবেন তখন আপনি এই বিলম্ব বাড়াতে পারেন এবং পরেরটিতে পুনরাবৃত্তি করার আগে আপনি সফলভাবে একটি ঠিকানা জিওকোড করেছেন তা নিশ্চিত করতে একটি while
লুপ ব্যবহার করতে পারেন। এর মানে হল যে যদি আপনার CSV ফাইলটি খুব বড় হয়, তাহলে আপনাকে হয় জিওকোডিং কোড পরিবর্তন করতে হবে, অথবা আপনি কত দ্রুত প্লেসমার্ক তৈরি করছেন তার ট্র্যাক রাখতে হবে এবং আপনি যদি খুব দ্রুত যাচ্ছেন তাহলে সেটিকে কমিয়ে দিতে হবে।
উপসংহার
এখন আপনি একটি CSV ফাইল থেকে একটি KML ফাইল তৈরি করতে Python ব্যবহার করতে পারেন। সরবরাহকৃত কোড ব্যবহার করে, KML ফাইলটি শুধুমাত্র Google Earth-এ কাজ করবে। আপনি <ExtendedData>
এর পরিবর্তে <description>
ব্যবহার করে মানচিত্র এবং আর্থ উভয় ক্ষেত্রে কাজ করার জন্য এটিকে পরিবর্তন করতে পারেন। এই কোড নমুনাটিকে XML সমর্থন প্রদান করে এমন অন্য কোনো প্রোগ্রামিং ভাষায় রূপান্তর করাও সহজ।
এখন আপনি আপনার সমস্ত CSV ফাইলগুলিকে KML-এ রূপান্তর করা শেষ করেছেন, আপনি অন্যান্য KML নিবন্ধগুলি দেখতে চাইতে পারেন, যেমন KML তৈরি করতে PHP এবং MySQL ব্যবহার করা এবং ExtendedData-এ Google ডেভেলপার গাইড নিবন্ধ, কাস্টম ডেটা যোগ করা ।