জুন ২০০৭
এই টিউটোরিয়ালটি এমন ডেভেলপারদের জন্য তৈরি যারা PHP এবং MySQL এর সাথে পরিচিত এবং MySQL ডাটাবেস থেকে KML তৈরি করতে শিখতে চান। এই টিউটোরিয়ালের জন্য, আপনি দুটি স্ক্রিপ্ট তৈরি করবেন যা সিয়াটেলের অবস্থানের একটি ডাটাবেস থেকে গতিশীলভাবে KML তৈরি করে। প্রথম স্ক্রিপ্টটি পয়েন্টের একটি সংগ্রহ তৈরি করে, যেখানে দুটি ধরণের স্থান - রেস্তোরাঁ এবং বার - আইকনগুলিকে আলাদা করে চিহ্নিত করা হয়। ব্যবহারকারী যখন একটি মার্কারে ক্লিক করেন, তখন একটি বেলুন নাম এবং ঠিকানার তথ্য প্রদর্শন করে। দ্বিতীয় স্ক্রিপ্টটি একটি লাইন তৈরি করে যা সমস্ত রেস্তোরাঁকে সংযুক্ত করে। টিউটোরিয়ালটি আরও দেখায় যে কীভাবে একটি Google মানচিত্র তৈরি করতে হয় যা KML ফাইলগুলি প্রদর্শন করে এবং একটি NetworkLink ফাইল যা KML ফাইলের দিকে নির্দেশ করে এবং ব্যবহারকারীকে Google Earth-এ এটি খুলতে সক্ষম করে।
এই টিউটোরিয়ালটি পামেলা ফক্সের লেখা "ইউজিং পিএইচপি/মাইএসকিউএল উইথ গুগল ম্যাপস" প্রবন্ধের উপর ভিত্তি করে তৈরি, যেখানে দেখানো হয়েছে কিভাবে পিএইচপি ব্যবহার করে মাইএসকিউএল টেবিল থেকে গুগল ম্যাপে ডেটা এক্সপোর্ট করতে হয়। আপনি যদি পামেলার প্রবন্ধটি পড়ে থাকেন তবে এই টিউটোরিয়ালের প্রথম দুটি ধাপ এড়িয়ে যেতে পারেন। টিউটোরিয়ালের বাকি অংশ উল্লেখযোগ্যভাবে আলাদা কারণ এটি কেএমএল নিয়ে কাজ করে।
টিউটোরিয়ালটি নিম্নলিখিত ধাপগুলিতে বিভক্ত:
- টেবিল তৈরি করা হচ্ছে
- টেবিলটি পূরণ করা হচ্ছে
- KML আউটপুট করতে PHP ব্যবহার করা
- আপনার KML ফাইলগুলি দেখানো হচ্ছে
- এখান থেকে কোথায় যাবেন

ধাপ ১: টেবিল তৈরি করা
MySQL টেবিল তৈরি করার সময়, আপনাকে lat এবং lng বৈশিষ্ট্যের দিকে বিশেষ মনোযোগ দিতে হবে। Google Maps-এর বর্তমান জুম ক্ষমতার সাথে, দশমিকের পরে আপনার কেবল 6 সংখ্যার নির্ভুলতা প্রয়োজন। আমাদের টেবিলের জন্য প্রয়োজনীয় স্টোরেজ স্পেস ন্যূনতম রাখতে, আপনি নির্দিষ্ট করতে পারেন যে lat এবং lng বৈশিষ্ট্যগুলি আকারের (10,6) ফ্লোট। এর ফলে ক্ষেত্রগুলি দশমিকের পরে 6 সংখ্যা, এবং দশমিকের আগে 4 সংখ্যা পর্যন্ত সংরক্ষণ করতে পারবে, যেমন -123.456789 ডিগ্রি। আপনার টেবিলে প্রাথমিক কী হিসেবে কাজ করার জন্য একটি id বৈশিষ্ট্য এবং রেস্তোরাঁ এবং বারের মধ্যে পার্থক্য করার জন্য একটি type বৈশিষ্ট্য থাকা উচিত।
দ্রষ্টব্য: এই টিউটোরিয়ালটি এমন অবস্থানের ডেটা ব্যবহার করে যার মধ্যে ইতিমধ্যেই অক্ষাংশ এবং দ্রাঘিমাংশের তথ্য রয়েছে যা সংশ্লিষ্ট মার্কারগুলিকে প্লট করার জন্য প্রয়োজনীয়। যদি আপনি নিজের ডেটা ব্যবহার করার চেষ্টা করেন যার কাছে এখনও সেই তথ্য নেই, তাহলে ঠিকানাগুলিকে অক্ষাংশ/দ্রাঘিমাংশে রূপান্তর করার জন্য একটি ব্যাচ জিওকোডিং পরিষেবা ব্যবহার করুন। কিছু সাইট প্রতিবার পৃষ্ঠা লোড হওয়ার সময় ঠিকানাগুলিকে জিওকোড করার ভুল করে, কিন্তু এর ফলে পৃষ্ঠা লোড ধীর হয় এবং অপ্রয়োজনীয় পুনরাবৃত্তি জিওকোড হয়। সম্ভব হলে অক্ষাংশ/দ্রাঘিমাংশের তথ্য হার্ড-কোড করা সর্বদা ভাল।
আপনি দুটি উপায়ের একটিতে টেবিল ডেটা তৈরি করতে পারেন—হয় phpMyAdmin ইন্টারফেস ব্যবহার করে অথবা SQL কমান্ড ব্যবহার করে। phpMyAdmin ইন্টারফেস ব্যবহার করে আপনি কীভাবে টেবিল তৈরি করবেন তা এখানে দেখানো হয়েছে।

এখানে সংশ্লিষ্ট SQL স্টেটমেন্টটি দেওয়া হল যা টেবিলটি তৈরি করে। phpsqlajax_createtable.sql :
CREATE TABLE 'markers' (
'id' INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
'name' VARCHAR( 60 ) NOT NULL ,
'address' VARCHAR( 80 ) NOT NULL ,
'lat' FLOAT( 10, 6 ) NOT NULL ,
'lng' FLOAT( 10, 6 ) NOT NULL ,
'type' VARCHAR( 30 ) NOT NULL
) ENGINE = MYISAM ;
ধাপ ২: টেবিলটি পূরণ করা
টেবিল তৈরি করার পর, এটি ডেটা দিয়ে পূর্ণ করার সময়। সিয়াটলের ১০টি স্থানের নমুনা ডেটা নীচে দেওয়া হল। phpMyAdmin-এ, আপনি IMPORT ট্যাব ব্যবহার করে CSV (কমা দ্বারা পৃথক করা মান) সহ বিভিন্ন ফাইল ফর্ম্যাট আমদানি করতে পারেন। Microsoft Excel এবং Google Spreadsheets উভয়ই CSV ফর্ম্যাটে রপ্তানি করে, তাই আপনি CSV ফাইল রপ্তানি/আমদানি করে স্প্রেডশিট থেকে MySQL টেবিলে সহজেই ডেটা স্থানান্তর করতে পারেন।
এখানে CSV ফর্ম্যাটে নমুনা ডেটা রয়েছে। phpsqlajax_data.csv :
Pan Africa Market,'1521 1st Ave, Seattle, WA',47.608941,-122.340145,restaurant
Buddha Thai & Bar,'2222 2nd Ave, Seattle, WA',47.613591,-122.344394,bar
The Melting Pot,'14 Mercer St, Seattle, WA',47.624562,-122.356442,restaurant
Ipanema Grill,'1225 1st Ave, Seattle, WA',47.606366,-122.337656,restaurant
Sake House,'2230 1st Ave, Seattle, WA',47.612825,-122.34567,bar
Crab Pot,'1301 Alaskan Way, Seattle, WA',47.605961,-122.34036,restaurant
Mama's Mexican Kitchen,'2234 2nd Ave, Seattle, WA',47.613975,-122.345467,bar
Wingdome,'1416 E Olive Way, Seattle, WA',47.617215,-122.326584,bar
Piroshky Piroshky,'1908 Pike pl, Seattle, WA',47.610127,-122.342838,restaurant
এই CSV ফাইলটিকে টেবিল ডেটাতে রূপান্তর করতে ব্যবহৃত আমদানি বিকল্পগুলির একটি স্ক্রিনশট এখানে দেওয়া হল:

এখানে সংশ্লিষ্ট SQL স্টেটমেন্টগুলি দেওয়া হল। phpsqlajax_data.sql :
INSERT INTO 'markers' ('name', 'address', 'lat', 'lng', 'type') VALUES ('Pan Africa Market', '1521 1st Ave, Seattle, WA', '47.608941', '-122.340145', 'restaurant');
INSERT INTO 'markers' ('name', 'address', 'lat', 'lng', 'type') VALUES ('Buddha Thai & Bar', '2222 2nd Ave, Seattle, WA', '47.613591', '-122.344394', 'bar');
INSERT INTO 'markers' ('name', 'address', 'lat', 'lng', 'type') VALUES ('The Melting Pot', '14 Mercer St, Seattle, WA', '47.624562', '-122.356442', 'restaurant');
INSERT INTO 'markers' ('name', 'address', 'lat', 'lng', 'type') VALUES ('Ipanema Grill', '1225 1st Ave, Seattle, WA', '47.606366', '-122.337656', 'restaurant');
INSERT INTO 'markers' ('name', 'address', 'lat', 'lng', 'type') VALUES ('Sake House', '2230 1st Ave, Seattle, WA', '47.612825', '-122.34567', 'bar');
INSERT INTO 'markers' ('name', 'address', 'lat', 'lng', 'type') VALUES ('Crab Pot', '1301 Alaskan Way, Seattle, WA', '47.605961', '-122.34036', 'restaurant');
INSERT INTO 'markers' ('name', 'address', 'lat', 'lng', 'type') VALUES ('Mama\'s Mexican Kitchen', '2234 2nd Ave, Seattle, WA', '47.613975', '-122.345467', 'bar');
INSERT INTO 'markers' ('name', 'address', 'lat', 'lng', 'type') VALUES ('Wingdome', '1416 E Olive Way, Seattle, WA', '47.617215', '-122.326584', 'bar');
INSERT INTO 'markers' ('name', 'address', 'lat', 'lng', 'type') VALUES ('Piroshky Piroshky', '1908 Pike pl, Seattle, WA', '47.610127', '-122.342838', 'restaurant');
ধাপ ৩: KML আউটপুট করার জন্য PHP ব্যবহার করা
এই মুহুর্তে, আপনার কাছে "markers" নামে একটি টেবিল থাকা উচিত যেখানে নমুনা ডেটা থাকবে। এখন আপনাকে কিছু PHP স্টেটমেন্ট লিখতে হবে যাতে টেবিল ডেটা KML ফর্ম্যাটে এক্সপোর্ট করা যায়। যদি আপনি কখনও MySQL ডাটাবেসের সাথে সংযোগ করার জন্য PHP লিখেননি, তাহলে আপনার php.net এ গিয়ে mysql_connect , mysql_select_db , my_sql_query , এবং mysql_error সম্পর্কে পড়া উচিত।
আপনার ডাটাবেস সংযোগের তথ্য আলাদা একটি ফাইলে রাখা উচিত। যখনই আপনি ডাটাবেস অ্যাক্সেস করার জন্য PHP ব্যবহার করেন তখন এটি সাধারণত একটি ভালো ধারণা, কারণ এটি আপনার গোপনীয় তথ্য এমন একটি ফাইলে রাখে যা আপনি শেয়ার করতে প্রলুব্ধ হবেন না। Maps API ফোরামে, আমরা মাঝে মাঝে দেখেছি যে লোকেরা তাদের কোড ডিবাগ করার চেষ্টা করার সময় ভুলবশত তাদের ডাটাবেস সংযোগের তথ্য প্রকাশ করেছে। ফাইলটি দেখতে এইরকম হওয়া উচিত, তবে আপনার নিজস্ব ডাটাবেস তথ্য পূরণ করে। phpsqlajax_dbinfo.php :
<?
$username = 'username';
$password = 'password';
$database = 'database';
$server = 'server'
?>
KML আউটপুট করার জন্য PHP5 এর DOM ফাংশন ব্যবহার করা
নতুন জিনিসটি এখান থেকেই শুরু হয়। পামেলা ফক্সের আগের প্রবন্ধে, তিনি PHP 4 কোড উপস্থাপন করেছিলেন যা dom_xml এক্সটেনশন ব্যবহার করে একটি সাধারণ মার্কার ফাইল তৈরি করেছিল যা পরে জাভাস্ক্রিপ্ট ব্যবহার করে পার্স করা হয়েছিল। এই টিউটোরিয়ালের জন্য, আপনি KML তৈরি করতে চান। জাভাস্ক্রিপ্ট ব্যবহার না করে, আপনি সরাসরি KML-এ প্লেসমার্ক স্টাইলিং নির্দিষ্ট করতে পারেন। এই টিউটোরিয়ালটি এমন কোড দেখাবে যা PHP 5 এর ইন্টিগ্রেটেড DOM লাইব্রেরি এবং PHP 4 dom_xml এক্সটেনশন উভয়ই ব্যবহার করে।
প্রথমে, আপনার কনফিগারেশন পরীক্ষা করুন অথবা আপনার সার্ভারের PHP-তে DOM কার্যকারিতা চালু আছে কিনা তা নির্ধারণ করতে একটি DOMDocument() চালু করার চেষ্টা করুন। যদি আপনার DOM-এ অ্যাক্সেস থাকে, তাহলে আপনি XML নোড তৈরি করতে, চাইল্ড নোড যোগ করতে এবং একটি XML ডকুমেন্ট আউটপুট করতে এটি ব্যবহার করতে পারেন। যেহেতু KML একটি XML মার্কআপ ভাষা, তাই এটি KML-এর জন্যও কাজ করে। যদি আপনার সার্ভারে DOM উপলব্ধ না থাকে, তাহলে নিচে বর্ণিত dom_xml অথবা echo পদ্ধতি ব্যবহার করে দেখুন।
একবার আপনি যখন নির্ধারণ করে ফেলবেন যে আপনি DOM ব্যবহার করে এগিয়ে যেতে পারবেন, তখন মার্কার টেবিলের প্রতিটি সারির জন্য আলাদা আলাদা স্থানচিহ্ন তৈরি করে শুরু করুন। PHP-তে, একটি নতুন XML ডকুমেন্ট শুরু করুন এবং "kml" প্যারেন্ট নোড তৈরি করুন। একটি বৈশিষ্ট্য হিসেবে KML নেমস্পেস যোগ করুন। KML <document> এলিমেন্টের মৌলিক কাঠামো তৈরি করার পরে, দুটি স্টাইল তৈরি করুন—একটি রেস্তোরাঁর জন্য এবং একটি বারের জন্য—যা পরবর্তীতে প্লেসমার্ক দ্বারা <styleUrl> এলিমেন্টের মাধ্যমে উল্লেখ করা হবে।
এরপর, ডাটাবেসের সাথে সংযোগ স্থাপন করুন, মার্কার টেবিলে একটি SELECT * (সব নির্বাচন করুন) কোয়েরি চালান এবং ফলাফলগুলি পুনরাবৃত্তি করুন। টেবিলের প্রতিটি সারির জন্য (প্রতিটি অবস্থান), একটি নতুন <Placemark> উপাদান তৈরি করুন। সারি থেকে তথ্য বের করুন এবং এটি ব্যবহার করে <Placemark> , <name> , <description> , <styleUrl> , এবং <Point> এর জন্য type <styleUrl> মানের উপর নির্ভর করে একটি মান নির্ধারণ করুন। তারপর <Point> উপাদানটিকে একটি শিশু উপাদান <coordinates> দিন এবং lng এবং lat কলামের মানগুলিকে এর মান হিসাবে একত্রিত করুন।
নিচের PHP ফাইলটি সঠিক HTML হেডার সহ একটি KML ফাইল তৈরি করে। এটি <name> এলিমেন্টে name কলামের মান এবং <description> এলিমেন্টে ঠিকানার মান নির্ধারণ করে। এই স্ক্রিপ্ট থেকে KML জেনারেট করার পরে, আপনার একটি টেক্সট এডিটর বা ব্রাউজার দিয়ে ফলাফল যাচাই করা উচিত। phpsql_genkml.php :
<?php
require('phpsqlajax_dbinfo.php');
// Opens a connection to a MySQL server.
$connection = mysql_connect ($server, $username, $password);
if (!$connection)
{
die('Not connected : ' . mysql_error());
}
// Sets the active MySQL database.
$db_selected = mysql_select_db($database, $connection);
if (!$db_selected)
{
die('Can\'t use db : ' . mysql_error());
}
// Selects all the rows in the markers table.
$query = 'SELECT * FROM markers WHERE 1';
$result = mysql_query($query);
if (!$result)
{
die('Invalid query: ' . mysql_error());
}
// Creates the Document.
$dom = new DOMDocument('1.0', 'UTF-8');
// Creates the root KML element and appends it to the root document.
$node = $dom->createElementNS('http://earth.google.com/kml/2.1', 'kml');
$parNode = $dom->appendChild($node);
// Creates a KML Document element and append it to the KML element.
$dnode = $dom->createElement('Document');
$docNode = $parNode->appendChild($dnode);
// Creates the two Style elements, one for restaurant and one for bar, and append the elements to the Document element.
$restStyleNode = $dom->createElement('Style');
$restStyleNode->setAttribute('id', 'restaurantStyle');
$restIconstyleNode = $dom->createElement('IconStyle');
$restIconstyleNode->setAttribute('id', 'restaurantIcon');
$restIconNode = $dom->createElement('Icon');
$restHref = $dom->createElement('href', 'http://maps.google.com/mapfiles/kml/pal2/icon63.png');
$restIconNode->appendChild($restHref);
$restIconstyleNode->appendChild($restIconNode);
$restStyleNode->appendChild($restIconstyleNode);
$docNode->appendChild($restStyleNode);
$barStyleNode = $dom->createElement('Style');
$barStyleNode->setAttribute('id', 'barStyle');
$barIconstyleNode = $dom->createElement('IconStyle');
$barIconstyleNode->setAttribute('id', 'barIcon');
$barIconNode = $dom->createElement('Icon');
$barHref = $dom->createElement('href', 'http://maps.google.com/mapfiles/kml/pal2/icon27.png');
$barIconNode->appendChild($barHref);
$barIconstyleNode->appendChild($barIconNode);
$barStyleNode->appendChild($barIconstyleNode);
$docNode->appendChild($barStyleNode);
// Iterates through the MySQL results, creating one Placemark for each row.
while ($row = @mysql_fetch_assoc($result))
{
// Creates a Placemark and append it to the Document.
$node = $dom->createElement('Placemark');
$placeNode = $docNode->appendChild($node);
// Creates an id attribute and assign it the value of id column.
$placeNode->setAttribute('id', 'placemark' . $row['id']);
// Create name, and description elements and assigns them the values of the name and address columns from the results.
$nameNode = $dom->createElement('name',htmlentities($row['name']));
$placeNode->appendChild($nameNode);
$descNode = $dom->createElement('description', $row['address']);
$placeNode->appendChild($descNode);
$styleUrl = $dom->createElement('styleUrl', '#' . $row['type'] . 'Style');
$placeNode->appendChild($styleUrl);
// Creates a Point element.
$pointNode = $dom->createElement('Point');
$placeNode->appendChild($pointNode);
// Creates a coordinates element and gives it the value of the lng and lat columns from the results.
$coorStr = $row['lng'] . ',' . $row['lat'];
$coorNode = $dom->createElement('coordinates', $coorStr);
$pointNode->appendChild($coorNode);
}
$kmlOutput = $dom->saveXML();
header('Content-type: application/vnd.google-earth.kml+xml');
echo $kmlOutput;
?>
KML আউটপুট করার জন্য PHP 4 এর dom_xml ব্যবহার করা হচ্ছে
PHP 4 এর dom_xml ফাংশনগুলি PHP 5 এর DOM এর সাথে খুব মিল। phpsql_genkml2.php :
<?php
require('phpsqlajax_dbinfo.php');
// Opens a connection to a MySQL server.
$connection=mysql_connect ($server, $username, $password);
if (!$connection)
{
die('Not connected : ' . mysql_error());
}
// Sets the active MySQL database.
$db_selected = mysql_select_db($database, $connection);
if (!$db_selected)
{
die ('Can\'t use db : ' . mysql_error());
}
// Selects all the rows in the markers table.
$query = 'SELECT * FROM markers WHERE 1';
$result = mysql_query($query);
if (!$result)
{
die('Invalid query: ' . mysql_error());
}
// Creates the Document.
$dom = new domxml_new_doc('1.0');
// Creates the root KML element and appends it to the root document.
$node = $dom->create_element_ns('http://earth.google.com/kml/2.1', 'kml');
$parNode = $dom->append_child($node);
// Creates a KML Document element and append it to the KML element.
$dnode = $dom->create_element('Document');
$docNode = $parNode->append_child($dnode);
//Creates the two Style elements, one for restaurant and one for bar, and append the elements to the Document element.
$restStyleNode = $dom->create_element('Style');
$restStyleNode->set_attribute('id', 'restaurantStyle');
$restIconstyleNode = $dom->create_element('IconStyle');
$restIconstyleNode->set_attribute('id', 'restaurantIcon');
$restIconNode = $dom->create_element('Icon');
$restHref = $dom->create_element('href', 'http://maps.google.com/mapfiles/kml/pal2/icon63.png');
$restIconNode->append_child($restHref);
$restIconstyleNode->append_child($restIconNode);
$restStyleNode->append_child($restIconstyleNode);
$docNode->append_child($restStyleNode);
$barStyleNode = $dom->create_element('Style');
$barStyleNode->set_attribute('id', 'barStyle');
$barIconstyleNode = $dom->create_element('IconStyle');
$barIconstyleNode->set_attribute('id', 'barIcon');
$barIconNode = $dom->create_element('Icon');
$barHref = $dom->create_element('href', 'http://maps.google.com/mapfiles/kml/pal2/icon27.png');
$barIconNode->append_child($barHref);
$barIconstyleNode->append_child($barIconNode);
$barStyleNode->append_child($barIconstyleNode);
$docNode->append_child($barStyleNode);
// Iterates through the MySQL results, creating one Placemark for each row.
while ($row = @mysql_fetch_assoc($result))
{
// Creates a Placemark and append it to the Document.
$node = $dom->create_element('Placemark');
$placeNode = $docNode->append_child($node);
// Creates an id attribute and assign it the value of id column.
$placeNode->set_attribute('id', 'placemark' . $row['id']);
// Create name, and description elements and assigns them the values of the name and address columns from the results.
$nameNode = $dom->create_element('name',htmlentities($row['name']));
$placeNode->append_child($nameNode);
$descNode = $dom-> create_element('description', $row['address']);
$placeNode->append_child($descNode);
$styleUrl = $dom->create_element('styleUrl', '#' . $row['type'] . 'Style');
$placeNode->append_child($styleUrl);
// Creates a Point element.
$pointNode = $dom->create_element('Point');
$placeNode->append_child($pointNode);
// Creates a coordinates element and gives it the value of the lng and lat columns from the results.
$coorStr = $row['lng'] . ',' . $row['lat'];
$coorNode = $dom->create_element('coordinates', $coorStr);
$pointNode->append_child($coorNode);
}
$kmlOutput = $dom->dump_mem(TRUE, 'UTF-8');
header('Content-type: application/vnd.google-earth.kml+xml');
echo $kmlOutput;
?>
আপনি দেখতে পাচ্ছেন, বেশিরভাগ পার্থক্য সমাধান করা হয় camel case ( createElement ) ফাংশনগুলিকে সমস্ত ছোট হাতের অক্ষরে রূপান্তর করে একটি আন্ডারস্কোর ("_") দিয়ে ফাংশন নামের শব্দগুলিকে আলাদা করার মাধ্যমে। এই নিয়মের ব্যতিক্রম হল domxml_new_doc , যা PHP 5 DOMDocument দিয়ে প্রতিস্থাপন করে। এছাড়াও, dom_xml ব্যবহার করে, আপনি যখন ফাইলটি মেমোরিতে ডাম্প করেন তখন এনকোডিং সেট করেন, ফাইল তৈরি করার সময় নয়।
KML আউটপুট করতে PHP এর echo ব্যবহার করা হচ্ছে
যদি আপনার PHP এর DOM ফাংশনগুলিতে অ্যাক্সেস না থাকে, তাহলে আপনি echo ফাংশন ব্যবহার করে KML আউটপুট করতে পারেন।
- ডাটাবেসের সাথে সংযোগ স্থাপন করুন এবং মার্কার টেবিলে
SELECT *(সব নির্বাচন করুন) কোয়েরিটি কার্যকর করুন। - KML ডকুমেন্টের মৌলিক কাঠামো তৈরি করে এমন স্ট্রিংগুলির একটি অ্যারে তৈরি করুন।
- তারপর কোয়েরি ফলাফলগুলি পুনরাবৃত্তি করুন, টেবিলের প্রতিটি সারির জন্য (প্রতিটি অবস্থান) অ্যারেতে একটি উপাদান যোগ করুন।
- সেই সারির জন্য প্লেসমার্ক এলিমেন্ট তৈরি করুন, যদি কোনও বিশেষ এন্টিটি থাকে, তাহলে
htmlentitiesফাংশনের মধ্য দিয়ে name কলামটি পাস করুন। - অ্যারেটিকে একটি বড় স্ট্রিংয়ে যুক্ত করে, হেডারগুলি প্রতিধ্বনিত করে এবং তারপর KML স্ট্রিং প্রতিধ্বনিত করে স্ক্রিপ্টটি শেষ করুন।
এই সমস্ত কাজ করে এমন PHP ফাইলটি নিচে দেখানো হল। phpsql_genkml3.php :
<?php
require('phpsqlajax_dbinfo.php');
// Opens a connection to a MySQL server.
$connection = mysql_connect ($server, $username, $password);
if (!$connection)
{
die('Not connected : ' . mysql_error());
}
// Sets the active MySQL database.
$db_selected = mysql_select_db($database, $connection);
if (!$db_selected)
{
die ('Can\'t use db : ' . mysql_error());
}
// Selects all the rows in the markers table.
$query = 'SELECT * FROM markers WHERE 1';
$result = mysql_query($query);
if (!$result)
{
die('Invalid query: ' . mysql_error());
}
// Creates an array of strings to hold the lines of the KML file.
$kml = array('<?xml version="1.0" encoding="UTF-8"?>');
$kml[] = '<kml xmlns="http://earth.google.com/kml/2.1">';
$kml[] = ' <Document>';
$kml[] = ' <Style id="restaurantStyle">';
$kml[] = ' <IconStyle id="restuarantIcon">';
$kml[] = ' <Icon>';
$kml[] = ' <href>http://maps.google.com/mapfiles/kml/pal2/icon63.png</href>';
$kml[] = ' </Icon>';
$kml[] = ' </IconStyle>';
$kml[] = ' </Style>';
$kml[] = ' <Style id="barStyle">';
$kml[] = ' <IconStyle id="barIcon">';
$kml[] = ' <Icon>';
$kml[] = ' <href>http://maps.google.com/mapfiles/kml/pal2/icon27.png</href>';
$kml[] = ' </Icon>';
$kml[] = ' </IconStyle>';
$kml[] = ' </Style>';
// Iterates through the rows, printing a node for each row.
while ($row = @mysql_fetch_assoc($result))
{
$kml[] = ' <Placemark id="placemark' . $row['id'] . '">';
$kml[] = ' <name>' . htmlentities($row['name']) . '</name>';
$kml[] = ' <description>' . htmlentities($row['address']) . '</description>';
$kml[] = ' <styleUrl>#' . ($row['type']) .'Style</styleUrl>';
$kml[] = ' <Point>';
$kml[] = ' <coordinates>' . $row['lng'] . ',' . $row['lat'] . '</coordinates>';
$kml[] = ' </Point>';
$kml[] = ' </Placemark>';
}
// End XML file
$kml[] = ' </Document>';
$kml[] = '</kml>';
$kmlOutput = join("\n", $kml);
header('Content-type: application/vnd.google-earth.kml+xml');
echo $kmlOutput;
?>
KML আউটপুট কাজ করছে কিনা তা পরীক্ষা করা হচ্ছে
ব্রাউজার থেকে এই PHP স্ক্রিপ্টটি কল করুন এবং নিশ্চিত করুন যে এটি বৈধ KML তৈরি করছে। যদি স্ক্রিপ্টটি সঠিকভাবে কাজ করে, তাহলে KML আউটপুটটি এইরকম দেখাবে। phpsqlkml_expectedoutput.kml :
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns = "http://earth.google.com/kml/2.1">
<Document>
<Style id="restaurantStyle">
<IconStyle id="restuarantIcon">
<Icon>
<href>http://maps.google.com/mapfiles/kml/pal2/icon63.png</href>
</Icon>
</IconStyle>
</Style>
<Style id="barStyle">
<IconStyle id="barIcon">
<Icon>
<href>http://maps.google.com/mapfiles/kml/pal2/icon27.png</href>
</Icon>
</IconStyle>
</Style>
<Placemark id="placemark1">
<name>Pan Africa Market</name>
<description>1521 1st Ave, Seattle, WA</description>
<styleUrl>#restaurantStyle</styleUrl>
<Point>
<coordinates>-122.340141,47.608940</coordinates>
</Point>
</Placemark>
<Placemark id="placemark2">
<name>Buddha Thai & Bar</name>
<description>2222 2nd Ave, Seattle, WA</description>
<styleUrl>#barStyle</styleUrl>
<Point>
<coordinates>-122.344391,47.613590</coordinates>
</Point>
</Placemark>
<Placemark id="placemark3">
<name>The Melting Pot</name>
<description>14 Mercer St, Seattle, WA</description>
<styleUrl>#restaurantStyle</styleUrl>
<Point>
<coordinates>-122.356445,47.624561</coordinates>
</Point>
</Placemark>
<Placemark id="placemark4">
<name>Ipanema Grill</name>
<description>1225 1st Ave, Seattle, WA</description>
<styleUrl>#restaurantStyle</styleUrl>
<Point>
<coordinates>-122.337654,47.606365</coordinates>
</Point>
</Placemark>
<Placemark id="placemark5">
<name>Sake House</name>
<description>2230 1st Ave, Seattle, WA</description>
<styleUrl>#barStyle</styleUrl>
<Point>
<coordinates>-122.345673,47.612823</coordinates>
</Point>
</Placemark>
<Placemark id="placemark6">
<name>Crab Pot</name>
<description>1301 Alaskan Way, Seattle, WA</description>
<styleUrl>#restaurantStyle</styleUrl>
<Point>
<coordinates>-122.340363,47.605961</coordinates>
</Point>
</Placemark>
<Placemark id="placemark7">
<name>Mama's Mexican Kitchen</name>
<description>2234 2nd Ave, Seattle, WA</description>
<styleUrl>#barStyle</styleUrl>
<Point>
<coordinates>-122.345467,47.613976</coordinates>
</Point>
</Placemark>
<Placemark id="placemark8">
<name>Wingdome</name>
<description>1416 E Olive Way, Seattle, WA</description>
<styleUrl>#barStyle</styleUrl>
<Point>
<coordinates>-122.326584,47.617214</coordinates>
</Point>
</Placemark>
<Placemark id="placemark9">
<name>Piroshky Piroshky</name>
<description>1908 Pike pl, Seattle, WA</description>
<styleUrl>#restaurantStyle</styleUrl>
<Point>
<coordinates>-122.342834,47.610126</coordinates>
</Point>
</Placemark>
</Document>
</kml>
একটি লাইন তৈরি করা
ডাটাবেসের সবচেয়ে ভালো দিকগুলির মধ্যে একটি হল তথ্য একত্রিত করার ক্ষমতা। উদাহরণস্বরূপ, পয়েন্ট সিরিজের একটি স্বাভাবিক অভিব্যক্তি হল একটি লাইন, অথবা KML-এ, একটি <linestring> । এটি আসলে পয়েন্ট সিরিজ তৈরি করার চেয়ে সহজ। একটি স্ক্রিপ্ট তৈরি করুন যা একটি একক প্লেসমার্কের কাঠামো তৈরি করে। প্লেসমার্কে একটি <linestring> উপাদান রাখুন। তারপর সারির id অনুসারে সমস্ত স্থানাঙ্কের জন্য ডাটাবেসটি অনুসন্ধান করুন।
এখানে একটি নমুনা PHP স্ক্রিপ্ট দেওয়া হল যা ১০০ মিটার উচ্চতায় সমস্ত রেস্তোরাঁর মধ্যে একটি <linestring> তৈরি করে, তাদের id অনুসারে, এক্সট্রুশন সহ। যদিও এটি গুগল ম্যাপে দেখা যাবে না, গুগল আর্থে এই স্ক্রিপ্টটি গুগল আর্থের সমস্ত রেস্তোরাঁর অবস্থানের মধ্য দিয়ে ১০০ মিটার লম্বা একটি দেয়াল তৈরি করে, যে ক্রমে ডাটাবেসে প্রবেশ করানো হয়েছিল। phpsql_genkml_ls.php :
<?php
require('phpsqlajax_dbinfo.php');
// Opens a connection to a MySQL server
$connection = mysql_connect ($server, $username, $password);
if (!$connection)
{
die('Not connected : ' . mysql_error());
}
// Set the active MySQL database
$db_selected = mysql_select_db($database, $connection);
if (!$db_selected)
{
die ('Can\'t use db : ' . mysql_error());
}
// Select all the rows in the markers table
$query = " SELECT GROUP_CONCAT(lng, ',', lat, ',', '100' separator ' ') AS coordinates FROM markers WHERE type = 'restaurant';";
$result = mysql_query($query);
if (!$result)
{
die('Invalid query: ' . mysql_error());
}
// Start KML file, create parent node
$dom = new DOMDocument('1.0','UTF-8');
//Create the root KML element and append it to the Document
$node = $dom->createElementNS('http://earth.google.com/kml/2.1','kml');
$parNode = $dom->appendChild($node);
//Create a Folder element and append it to the KML element
$fnode = $dom->createElement('Folder');
$folderNode = $parNode->appendChild($fnode);
//Iterate through the MySQL results
$row = @mysql_fetch_assoc($result);
//Create a Placemark and append it to the document
$node = $dom->createElement('Placemark');
$placeNode = $folderNode->appendChild($node);
//Create an id attribute and assign it the value of id column
$placeNode->setAttribute('id','linestring1');
//Create name, description, and address elements and assign them the values of
//the name, type, and address columns from the results
$nameNode = $dom->createElement('name','My path');
$placeNode->appendChild($nameNode);
$descNode= $dom->createElement('description', 'This is the path that I took through my favorite restaurants in Seattle');
$placeNode->appendChild($descNode);
//Create a LineString element
$lineNode = $dom->createElement('LineString');
$placeNode->appendChild($lineNode);
$exnode = $dom->createElement('extrude', '1');
$lineNode->appendChild($exnode);
$almodenode =$dom->createElement(altitudeMode,'relativeToGround');
$lineNode->appendChild($almodenode);
//Create a coordinates element and give it the value of the lng and lat columns from the results
$coorNode = $dom->createElement('coordinates',$row['coordinates']);
$lineNode->appendChild($coorNode);
$kmlOutput = $dom->saveXML();
//assign the KML headers.
header('Content-type: application/vnd.google-earth.kml+xml');
echo $kmlOutput;
?>
সেই স্ক্রিপ্টের আউটপুট দেখতে এরকম ।
<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://earth.google.com/kml/2.1'>
<Folder>
<Placemark id='linestring1'>
<name>My path</name>
<description>This is the path that I took through my favorite restaurants in Seattle</description>
<LineString>
<extrude>1</extrude>
<altitudeMode>relativeToGround</altitudeMode>
<coordinates>-122.340141,47.608940,100 -122.356445,47.624561,100
-122.337654,47.606365,100 -122.340363,47.605961,100
-122.342834,47.610126,100
</coordinates>
</LineString>
</Placemark>
</Folder>
</kml>
ধাপ ৪: আপনার KML ফাইলগুলি প্রদর্শন করা
গুগল আর্থে প্রদর্শন করুন
এখন আপনি সহজেই গুগল আর্থে এই ডেটা প্রদর্শন করতে পারবেন। এটি করার সবচেয়ে ভালো উপায় হল একটি NetworkLink ফাইল তৈরি করা যা স্ক্রিপ্টের দিকে নির্দেশ করে। আপনি যদি আপনার ডেটা ঘন ঘন আপডেট করেন, তাহলে আপনি কতবার আপডেট করবেন তার সাথে মিল রেখে রিফ্রেশ রেট সেট করতে পারেন। এখানে এমন একটি ফাইলের উদাহরণ দেওয়া হল যা এটি সম্পন্ন করবে। phpmysql_kmlnl.kml :
<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns = 'http://earth.google.com/kml/2.1'>
<Folder>
<NetworkLink>
<Link>
<href>http://example.com/phpsql_genkml.kml</href>
<refreshMode>onInterval</refreshMode>
<refreshInterval>3600</refreshInterval>
</Link>
</NetworkLink>
<NetworkLink>
<Link>
<href>http://example.com/phpsql_genkml_ls.kml</href>
<refreshMode>onInterval</refreshMode>
<refreshInterval>3600</refreshInterval>
</Link>
</NetworkLink>
</Folder>
</kml>
আপনার সার্ভারে স্ক্রিপ্টের পাথে <href> এলিমেন্টটি পরিবর্তন করুন। গুগল আর্থ দিয়ে phpmysql_kmlnl.kml খুলুন। আপনি এটি দেখতে পাবেন:

গুগল ম্যাপে একই ফাইলটি দেখতে, আপনাকে যা করতে হবে তা হল একটি মানচিত্র তৈরি করে স্ক্রিপ্ট বা NetworkLink ফাইলে লিঙ্কটি যুক্ত করতে হবে। উদাহরণস্বরূপ:
function load()
{
var map;
var geoXml;
if (GBrowserIsCompatible())
{
map = new GMap2(document.getElementById('map'));
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
geoXml = new GGeoXml('http://example.com/phpmysql_kmlnl.kml');
map.addOverlay(geoXml);
map.setCenter(new GLatLng(47.613976,-122.345467), 13);
}
}
যা এইরকম একটি মানচিত্র তৈরি করে:

ধাপ ৫: এখান থেকে কোথায় যাবেন
তাহলে এখন যেহেতু আপনার কাছে এই ডাটাবেস আছে, আপনি এটি দিয়ে কী করবেন? আচ্ছা, ডাটাবেসের সবচেয়ে ভালো দিক হল আপনি এতে যোগ করতে পারেন। ডাটাবেস থেকে পরিবেশিত KML এর সবচেয়ে ভালো দিক হল আপনি আপনার কন্টেন্ট রিফ্রেশ করতে পারেন। এগুলো একসাথে করলে আপনি অনেক শক্তি পাবেন।
আর KML-এ আপনি আরও অনেক কিছু করতে পারেন। Google Earth-এর কিছু অনন্য বৈশিষ্ট্যের সুবিধা নিন, যেমন <NetworkLink> ফাইল যা <viewFormat> ব্যবহার করে। এই বৈশিষ্ট্যটি <networklink> কে আপনার স্ক্রিপ্টে প্যারামিটার পাঠাতে দেয়। আপনি এই প্যারামিটারগুলি ব্যবহার করে কোন ডেটা ফেরত পাঠানো হবে তা পরিবর্তন করতে পারেন। অথবা <TimeStamp> এবং <TimeSpan> ব্যবহার করুন যা আপনাকে একটি নির্দিষ্ট সময়ের মধ্যে KML প্লেসমার্কের অ্যানিমেশন করতে দেয়। সম্পর্কিত টেবিলে <Polygons> এর মতো জিনিসগুলি সংরক্ষণ করার জন্য আরও জটিল টেবিল কাঠামো তৈরি করুন। অথবা এমন একটি ওয়েব পৃষ্ঠা তৈরি করুন যা অন্যদের আপনার ডাটাবেসে ডেটা প্রবেশ করতে দেয়, যা পরবর্তী স্ক্রিপ্টটি কল করার সময় রিফ্রেশ হয়। সম্ভাবনাগুলি অফুরন্ত।